Flutter GetX修改变量后Obx不触发UI更新 仅热重载生效
问题原因
你在更新响应式变量时,没有修改原有Rx实例的内部值,而是给_currentFilter重新赋值了一个全新创建的FilterEnum.xxx.obs对象。
Obx组件在首次渲染时,绑定监听的是Controller初始化时创建的第一个_currentFilter对应的Rx实例,后续你替换了_currentFilter的变量引用,新创建的Rx实例并没有被Obx监听,自然不会触发UI刷新。执行热重载时,框架会重新重建Widget、绑定监听关系,所以会出现热重载后颜色才正确更新的现象。
错误代码定位
问题出在Controller的changeFilter方法:
void changeFilter(FilterEnum filter) { // 错误:创建了全新的Rx实例,替换了原变量的引用,原有被监听的Rx实例值没有任何变化 _currentFilter = filter.obs; }
修复方法
只需要修改原有Rx实例的.value属性即可,不要替换整个Rx实例,推荐定义响应式变量时加final修饰,从语法层面避免误赋值整个Rx对象的问题。
修正后的完整Controller代码:
class TodoController extends GetxController { // 加final修饰,禁止后续重新赋值_currentFilter本身 final _currentFilter = FilterEnum.ALL.obs; // 直接返回枚举值即可,UI层读取时Obx会自动追踪依赖 FilterEnum get filter => _currentFilter.value; void changeFilter(FilterEnum filter) { // 只更新原有Rx实例内部存储的值,会自动通知所有监听者刷新 _currentFilter.value = filter; } }
原有UI层代码不需要做任何修改,点击按钮后即可正常触发颜色更新。
补充说明:如果你习惯在getter中直接返回Rx对象,只需要保证更新时修改
.value、不重新赋值Rx实例本身即可,两种写法效果一致。
内容的提问来源于stack exchange,提问作者nkhcode
相关产品推荐
相关产品推荐

