为什么即使在 getx flutter 中用 obx 包裹后,小部件也不刷新?

问题描述 投票:0回答:1

我正在学习 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(),
          ],);
        }),
      ),
    );
  }
flutter
1个回答
0
投票

自从我上次使用 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);
}

祝你好运,编码愉快!

© www.soinside.com 2019 - 2024. All rights reserved.