我正在学习 getx,在这里我面临一个问题
我创建了一个带有姓名和年龄字段并显示在屏幕上的用户模型
当我点击提升的按钮时,我正在更改任何名称,它应该刷新,因为我已将文本小部件包装到 Obx 中,但仍然无法工作...原因是什么?
class UserModel
{
String name;
String age;
UserModel({required this.name,required this.age});
static UserModel empty()=>UserModel(name: '', age: '');
}
class UserController extends GetxController
{
Rx<UserModel> loggedUser=UserModel.empty().obs;
void changeName(String name)
{
loggedUser.value.name=name;
}
}
这是屏幕代码
Widget build(BuildContext context) {
final controller=Get.put(UserController());
return SafeArea(
child: Scaffold(
body: Obx(() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment:MainAxisAlignment.center,
children: [
Text('Name :'+controller.loggedUser.value.name),
SizedBox(height: 20,),
Text('Age: '+controller.loggedUser.value.age),
SizedBox(height: 20,),
ElevatedButton(onPressed: (){
controller.changeName('xyz');
}, child: const Text('Change')),
Spacer(),
],);
}),
),
);
}
自从我上次使用 GetX 以来已经有一段时间了,但如果我没记错的话,当将
UserModel
实例声明为 Rx<UserModel> loggedUser = UserModel.empty().obs
时,您将需要更新整个 UserModel
实例,而不仅仅是其属性。
使用
loggedUser.value = newUser
代替 loggedUser.value.name = name
。
如果您仍想使用
loggedUser.value.name=name
,请考虑修改UserModel
,如下所示:
class UserModel
{
final RxString name;
final RxString age;
UserModel({required this.name,required this.age});
factory UserModel.empty() => UserModel(name: ''.obs, age: ''.obs);
}
祝你好运,编码愉快!