【问题标题】:Flutter GetX trigger function when state changesFlutter GetX 状态变化时触发函数
【发布时间】:2021-08-18 15:50:48
【问题描述】:

当我的 GetX 状态发生变化时,如何调用我的无状态小部件中的特定函数? 例如。每当我的底部导航栏的索引发生变化时,如何触发事件?

    Obx(
        () =>
           BottomNavigationBar(
               items: const <BottomNavigationBarItem>[
                  BottomNavigationBarItem(
                   icon: Icon(Icons.explore),
                   label: 'Erkunden',
                  ),           
               ],
               currentIndex: bottomNavigationController.index.value,
               onTap: (index) {
                     bottomNavigationController.changeIndex(index);
               },
            )
     ),

编辑:

 class BottomNavigationController extends GetxController {
     RxInt index = 0.obs;

     void changeIndex(int val) {
          index.value = val;
     }
 }

【问题讨论】:

    标签: flutter dart flutter-getx


    【解决方案1】:

    如果您使用的是 GetxController,则可以通过将 .obs 添加到您想要收听的值来收听控制器中的任何值。

    在控制器中添加 .obs 后,监听的方法与接受的答案相同。

    【讨论】:

    • 兄弟,请用一些示例代码详细说明您的答案,以便所有阅读您答案的人都能完全理解您的意思。谢谢
    【解决方案2】:

    扩展@ertgrull 的回答:

    您可以向任何流添加侦听器,但 Getx 还为此类功能内置了 worker functions

    通常当我需要这个时,我会在控制器的onInit 中添加监听器。

    class BottomNavigationController extends GetxController {
      RxInt index = 0.obs;
    
      void changeIndex(int val) {
        index.value = val;
      }
    
      @override
      void onInit() {
        super.onInit();
    
        ever(index, (value) {
      // call your function here
      // any code in here will be called any time index changes
        });
      }
    }
    

    【讨论】:

    • 我听说过工人,但我想调用的函数不在我的 GetxController 中,而是在我的类/小部件中,带有 build 方法。
    • 好吧,你可以按照@ertgrull 的建议做,并将标准监听器语法或ever 函数放在构造函数或构建方法中。你想调用什么函数?你想做什么?因为除非您实际显示索引或需要重建底部导航栏,否则您不需要那里的Obx。没有它你仍然可以访问控制器。
    • 我的脚手架内有一个底页,每当我的底部导航的索引发生变化时,底页应该关闭或打开(使用控制器执行此操作)。我想我需要 Obx 来显示我的 bottomNavigationItem 的正确颜色,对吧? (参见我的初始示例)
    • 好的,你甚至可以把你的showModalBottomSheet 放在Getx 类中并传入Get.context,它的工作原理是一样的。是的,如果您要使用无状态小部件,那么您对所选项目颜色所需的 Obx 是正确的。
    • 我在函数内(在 Getx 控制器内)添加了一个 obx 变量,并且该函数在不使用工作人员的情况下变为反应式 - 有可能吗?感觉就像在幕后发生的事情......
    【解决方案3】:

    获取您的控制器,根据您的要求监听方法中的更改。它可能在构造函数、构建方法或按钮的 onPress 方法等中。

    BottomNavigationController bnc = Get.find();
    
    bnc.index.listen((val) {
      //call a function according to value
    });
    
    

    【讨论】:

    • 我把这个监听器放在哪里?
    • 你可以把它放在costructor,build method等中
    • 您可以在控制器中输入onReadyonInit 方法
    【解决方案4】:

    如果你想使用 Obx,你必须使用 Streams 首先创建一个Controller

    在这个例子中我只想听一个数字的变化

    class AutoLoginCheck extends GetxController {
       var num= "0".obs;
    
    void checkNum() {
        if (num.value == "1") {
          num.value = "0";
        } else {
          num.value = "1";
        }
      }
    

    我们可以使用这个函数来调用那个号码变化

    onTap: () {
       num.checkLoginVal();
                                },
    

    【讨论】:

    • 我用我的控制器更新了我的问题。我不想调用控制器内部的函数,而是使用底部导航栏调用屏幕的本地函数。在我之前的项目中,我为此使用了 Riverpod 的 ProviderListener。但是这次我想用GetX。
    猜你喜欢
    • 2021-11-06
    • 2022-01-21
    • 2021-08-20
    • 1970-01-01
    • 2021-03-14
    • 2021-12-10
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多