dart 在Flutter GetX中侦听变量并触发重建

fkvaft9z  于 2023-03-05  发布在  Flutter
关注(0)|答案(1)|浏览(321)

我正在使用FlutterGetX,并希望侦听我的自定义GetXController中的一些变量...

class HomeScreenController extends MyGetXController {
    var isLoading = false.obs;
    var isError = true.obs;
}

问题

我想在我的Scaffold中使用观察变量......每当它发生变化时,它都应该触发小部件的重建......但我找到的唯一方法是将它们放入ObX() Widget。但我想在不必使用ObX()的情况下监听观察变量。

**我的用例:**我希望侦听变量并在其发生更改时触发小部件树的重建...但不应重建整个小部件树...仅重建发生更改的ObX()小部件。
目前我正在使用一个大的ObX()对象,并将所有可观察的变量放在那里...我担心如果其中的一个可观察变量发生变化,整个ObX()将被重建...

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(S.current.menuLatestEvents),
      ),
      drawer: const AppDrawer(),
      body: controller.isClientVersionNOTSupported.value
          ? const UpdateAppCard()
          : Container(
              color: Colors.grey[200],
              child: Obx(
                () {
                  return controller.isLoading.value
                      ? const Center(child: CircularProgressIndicator())
                      : controller.isError.value
                          ? ErrorCard(
                              controller: controller,
                              retryFunction: () => controller.getEvents(),
                            )

ObX()外部的可观察项...我听对了吗?
我不能使用ever(),因为它不能在if-statement中使用,因为 * 它不是静态的 *...那么如何只监听一个变量并在if语句中使用它,而不需要使用像ObX()这样的小部件呢?

k75qkfdt

k75qkfdt1#

您可以考虑使用GetBuilder小部件提供的update()函数,在监听Rx变量的变化时只重建小部件树的特定分支,通过使用此技术,您可以只重建小部件树的一部分,而不是整个小部件树。
示例:

class HomeScreenController extends MyGetXController {
  var isLoading = false.obs;
  var isError = true.obs;
}

class MyHomePage extends StatelessWidget {
  final HomeScreenController controller = Get.put(HomeScreenController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // Listen to the isLoading variable and update the CircularProgressIndicator
            GetBuilder<HomeScreenController>(
              id: 'isLoading',
              builder: (_) {
                if (controller.isLoading.value) {
                  return CircularProgressIndicator();
                } else {
                  return Container();
                }
              },
            ),
            // Listen to the isError variable and update the ErrorCard
            GetBuilder<HomeScreenController>(
              id: 'isError',
              builder: (_) {
                if (controller.isError.value) {
                  return ErrorCard(
                    controller: controller,
                    retryFunction: () => controller.getEvents(),
                  );
                } else {
                  return Container();
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

相关问题