【发布时间】:2021-10-07 05:38:18
【问题描述】:
为了学习 GetX,我创建了一个简单的控制器类:
class MyDataController extends GetxController {
RxString aString = ''.obs;
void updateString(String s) {
aString.value = s;
}
}
aString 的值显示在两个类中:AppBar(此处未讨论)和另一个同时设置和显示aString 的类:
class Level1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final MyDataController controller = Get.find();
final textController = TextEditingController();
return Column(
children: [
TextField(
controller: textController,
onChanged: (_) {
controller.updateString(textController.text);
},
),
Text(controller.aString.value),
],
);
}
}
我对哪些小部件需要包装在 Obx() 的实例中感到困惑。
如果我仅将Text()(显示小部件)包装在Obx 实例中,它会在TextField()(输入小部件)更改时更新。如果我仅将TextField() 小部件包装在Obx 实例中,我会收到一条错误消息:
在构建 Obx(has builder, dirty, 状态:_ObxState#019a0): [Get] 检测到 GetX 使用不当。 您应该只对将要更新的特定小部件使用 GetX 或 Obx。 如果您看到此错误,您可能没有在 GetX/Obx 中插入任何可观察变量 或将它们插入 GetX 认为适合更新的范围之外 (例如:GetX => HeavyWidget => variableObservable)。 如果您需要更新父窗口小部件和子窗口小部件,请将每个窗口小部件包装在 Obx/GetX 中。
一切似乎都很清楚:显示状态的小部件必须包装在 Obx() 实例中才能显示更新的变量。这很有意义。改变状态的小部件不需要包装在Obx() 实例中。
不过,我很困惑,因为如果我将 两个 小部件包装在单独的 Obx() 实例中,我会收到错误消息。但是,如果我将整个 Column() 包装在 Obx() 实例中,则当 TextField() 更改时,文本会正确更新。 ...我的理解中缺少什么?
【问题讨论】:
-
您能否具体说明您的问题,以便我尝试正确解释您想要什么?
-
@AbdelrahmanM.Elmarakby 在使用 GetX 时,更改变量的状态,然后在值更改时自动更新 UI,哪些 UI 小部件应该(和不应该)由 Obx() 实例包装?
标签: flutter flutter-getx