2

我试图了解如何在 Flutter 应用程序中使用 GetX 包来在 TextFormField 中更改值时在 Text 小部件中获取响应式更新。Text 小部件中显示的是可观察对象的属性。正是从 TextFormField 更新的属性。该值在控制器中正确更新,但在小部件中未正确更新。如果我直接使用字符串变量,它会正确更新。但是一旦我使用了一个对象,它就不再更新了。

这是我的应用程序的一个非常简单的示例,只是为了确保理解这些基础知识。

这是我的代码:

class User {
  String name = "";
}

class TestController extends GetxController {
  TestController();

  final user = User().obs;
}

class MyHomePage extends StatelessWidget {
  final c = Get.put(TestController());
  final String title;
  MyHomePage({this.title});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Container(
          width: Get.width * 0.8,
          height: Get.height * 0.8,
          child: Column(
            children: [
              Obx(() => Text(c.user.value.name)),
              TextFormField(
                onChanged: (value) => c.user.value.name = value,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

非常感谢您的帮助 !

4

2 回答 2

4

好的,感谢 CodeX youtuber,我找到了解决方案。

为了能够在您更改对象属性的值时响应式更新 UI,即使此对象设置为可观察的,您也需要具有可观察的属性。

所以正确的代码看起来像这样

class User {
  final name = "".obs;
}

class TestController extends GetxController {
  TestController();

  final user = User().obs;
}

class MyHomePage extends StatelessWidget {
  final c = Get.put(TestController());
  final String title;
  MyHomePage({this.title});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Container(
          width: Get.width * 0.8,
          height: Get.height * 0.8,
          child: Column(
            children: [
              Obx(() => Text(c.user.value.name.value)),
              TextFormField(
                onChanged: (value) => c.user.value.name.value = value,
              ),
            ],
          ),
        ),
      ),
    );
  }
}
于 2020-10-21T15:32:56.610 回答
2

将您的onChanged()fn 更新为此

Obx(() => Text(c.user.value.name)),
TextFormField(onChanged: (value) {
  c.user.value.name = value;
  c.user.refresh();
}),
于 2020-11-06T07:26:16.800 回答