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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:33:31