Flutter-getx,当 RxMap 设置为新值时,小部件不会重新渲染
Flutter-getx, widget does not re-render when RxMap set to a new value
我正在构建一个基于 RxMap 内容呈现的小部件。我从初始化为空的 RxMap 开始,然后单击按钮将 RxMap 设置为包含一个新值。为 RxMap 设置新值后,小部件不会重新渲染以显示新地图值。
这是我的代码:
(编辑:包括所有样板文件以防止混淆。每个 class 都在一个单独的文件中,所有其他文件中都有相关导入。)
class MyController extends GetxController {
var selectedItem = {}.obs;
}
class MyBinding extends Bindings {
@override
void dependencies() {
Get.put(MyController());
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext highContext) {
return GetMaterialApp(
title: 'App',
getPages: [
GetPage(
name: "/test",
page: () => MyClass(),
binding: MyBinding()),
],
initialRoute: "/test",
);
}
}
final saController = Get.find<MyController>();
class MyClass extends StatelessWidget {
Widget build(context) {
print(saController.selectedItem);
return Scaffold(
child: Column(
children: [
Obx(() => Container(
child: Text(saController.selectedItem.toString())
)),
TextButton(
child: Text("click"),
onPressed: (() {
saController.selectedItem = RxMap({"test": "item"});
saController.selectedItem.refresh();
saController.update();
print(saController.selectedItem);
})
)
]
)
);
}
}
第一个打印语句正确地将空对象打印到控制台,onPressed 打印语句正确地将新对象及其键和值打印到控制台,但小部件不会使用新值重新呈现。 refresh() 和 update() 似乎没有做任何事情。
这似乎是 RxMap 特有的,我已经能够让其他数据类型成功更新更改,例如将 RxMap 值换成布尔值并在单击时将其从 true 切换为 false 会导致小部件正确重新呈现而无需更改代码的任何其他部分。
除非 Rx 变量 (selectedItem.value) 的 value 发生变化,否则您的 UI 不会触发更新。但是您正在更新 Rx 变量 (selectedItem) 本身。
因此,您需要将saController.selectedItem = RxMap({"test": "item"});
更改为saController.selectedItem.value = {"test": "item"};
- 而且我认为您实际上不需要再调用
refresh()
和 update()
。
我正在构建一个基于 RxMap 内容呈现的小部件。我从初始化为空的 RxMap 开始,然后单击按钮将 RxMap 设置为包含一个新值。为 RxMap 设置新值后,小部件不会重新渲染以显示新地图值。
这是我的代码:
(编辑:包括所有样板文件以防止混淆。每个 class 都在一个单独的文件中,所有其他文件中都有相关导入。)
class MyController extends GetxController {
var selectedItem = {}.obs;
}
class MyBinding extends Bindings {
@override
void dependencies() {
Get.put(MyController());
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext highContext) {
return GetMaterialApp(
title: 'App',
getPages: [
GetPage(
name: "/test",
page: () => MyClass(),
binding: MyBinding()),
],
initialRoute: "/test",
);
}
}
final saController = Get.find<MyController>();
class MyClass extends StatelessWidget {
Widget build(context) {
print(saController.selectedItem);
return Scaffold(
child: Column(
children: [
Obx(() => Container(
child: Text(saController.selectedItem.toString())
)),
TextButton(
child: Text("click"),
onPressed: (() {
saController.selectedItem = RxMap({"test": "item"});
saController.selectedItem.refresh();
saController.update();
print(saController.selectedItem);
})
)
]
)
);
}
}
第一个打印语句正确地将空对象打印到控制台,onPressed 打印语句正确地将新对象及其键和值打印到控制台,但小部件不会使用新值重新呈现。 refresh() 和 update() 似乎没有做任何事情。
这似乎是 RxMap 特有的,我已经能够让其他数据类型成功更新更改,例如将 RxMap 值换成布尔值并在单击时将其从 true 切换为 false 会导致小部件正确重新呈现而无需更改代码的任何其他部分。
除非 Rx 变量 (selectedItem.value) 的 value 发生变化,否则您的 UI 不会触发更新。但是您正在更新 Rx 变量 (selectedItem) 本身。
因此,您需要将saController.selectedItem = RxMap({"test": "item"});
更改为saController.selectedItem.value = {"test": "item"};
- 而且我认为您实际上不需要再调用
refresh()
和update()
。