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

