升级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
相关产品推荐
相关产品推荐

