You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级flutter_mobx和mobx_codegen后ReactionDisposer无法识别枚举变化

Flutter Mobx升级后ReactionDisposer无法响应枚举类型变化

升级flutter_mobx至^2.0.6+1、mobx_codegen至^2.0.7后,出现ReactionDisposer无法识别枚举类型变化的问题,Observer功能正常。相关代码如下:

late ReactionDisposer _refreshDisposer;
Completer<dynamic> refreshCompleter = new Completer();

@override
void initState() {
  super.initState();
  _refreshDisposer = reaction((_) => _vendorStore.serviceState, (_) {
    if (_ != LoadingEnum.loading) {
      refreshCompleter.complete();
      refreshCompleter = Completer();
    }
  });
}

使用环境:Flutter 3.0.5,Dart 2.17.6


解决方案尝试

1. 确认Observable标记正确性

首先确保Store中的枚举字段已被@observable正确标记:

class VendorStore extends _VendorStore with _$VendorStore {
  @observable
  LoadingEnum serviceState = LoadingEnum.idle;
}

2. 显式触发枚举变化追踪

新版本Mobx对枚举的追踪逻辑可能有调整,可以通过转换枚举为可被明确追踪的类型(如索引值)来触发reaction:

_refreshDisposer = reaction(
  (_) => _vendorStore.serviceState.index,
  (index) {
    final currentState = LoadingEnum.values[index];
    if (currentState != LoadingEnum.loading) {
      refreshCompleter.complete();
      refreshCompleter = Completer();
    }
  },
);

3. 重新生成Mobx代码

运行build_runner命令,确保生成的Store代码与新版本依赖兼容:

flutter pub run build_runner build --delete-conflicting-outputs

4. 替换为Autorun(适配场景下)

如果业务逻辑允许,可尝试用autorun替代reaction,它对observable变化的追踪更直接:

_refreshDisposer = autorun((_) {
  final currentState = _vendorStore.serviceState;
  if (currentState != LoadingEnum.loading) {
    refreshCompleter.complete();
    refreshCompleter = Completer();
  }
});

5. 临时降级或提交Issue

若以上方法均无效,可暂时降级至之前正常工作的版本,同时在Mobx官方仓库提交Issue,说明枚举追踪失效的问题并附上环境信息与代码片段。

内容的提问来源于stack exchange,提问作者user19749848

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:39:15