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()