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

Flutter GetX中Obx包裹Widget仍不刷新的原因排查

GetX界面不刷新问题的原因及解决办法

问题原因

你用Rx<UserModel>包装了用户对象,但GetX的Rx监听的是对象引用的变化,而非对象内部字段的变化。当前你只是修改了loggedUser.value.name这个内部字段,整个loggedUser的引用并未改变,所以Obx检测不到变化,界面自然不会刷新。

解决办法

有两种常用修复方式,任选其一即可:

方式一:将UserModel的字段改为Rx类型

让模型内部字段成为可观察的Rx变量,修改字段时直接触发监听:

class UserModel {
  RxString name = ''.obs;
  RxString age = ''.obs;
  
  UserModel({required String name, required String age}) {
    this.name.value = name;
    this.age.value = age;
  }

  static UserModel empty() => UserModel(name: '', age: '');
}

对应修改Controller的changeName方法:

void changeName(String name) {
  loggedUser.value.name.value = name;
}

界面中的Text也需要对应改为监听Rx字段:

Text('Name :'+controller.loggedUser.value.name.value),
Text('Age: '+controller.loggedUser.value.age.value),

方式二:修改时更新整个UserModel的引用

无需改动UserModel,只需在changeName方法里重新赋值整个对象,让Rx检测到引用变化:

void changeName(String name) {
  // 保留原对象的age,替换name后生成新对象赋值
  loggedUser.value = UserModel(
    name: name,
    age: loggedUser.value.age
  );
}

这种方式不需要修改界面代码,原有的Text写法可直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:42:11