【问题标题】:Flutter and GetxController - How to manage state unreliability?Flutter 和 GetxController - 如何管理状态不可靠性?
【发布时间】:2021-02-25 15:51:42
【问题描述】:

我的应用程序目前在使用 Flutter (https://pub.dev/packages/get) 的 get 包和以下状态场景时遇到很多问题:

例如,我有一个 GetxController UserController。我需要在不同的小部件中使用这个控制器,所以我在第一个小部件中使用Get.put() 对其进行初始化,对于其他子小部件,我将使用Get.find() 来调用它。这行得通。

但是:我有一些小部件有时会在控制器初始化之前加载,有时在初始化之后加载。所以我收到很多"UsersController" not found 错误。也许有一些解决这个问题的方法?

【问题讨论】:

    标签: flutter flutter-getx


    【解决方案1】:

    如果你需要检查类是否已初始化,你最好将类保存在内存中permanent:true并在Get.put函数中设置tag:'anything you want for check this object'属性,现在你可以检查了

    bool Get.isRegistered<className>(tag: 'TagInPut')
    
    

    【讨论】:

      【解决方案2】:

      如果没有特殊原因,可以在main函数中调用Get.put(UserController()),用GetMaterialApp封装材质应用。

      【讨论】:

        【解决方案3】:

        您可以在应用启动之前使用 Bindings 类初始化您的 UsersController 类。

        示例

        class UsersController extends GetxController {
          static UsersController get i => Get.find();
          int userId = 5;
        }
        
        class UsersBinding extends Bindings {
          @override
          void dependencies() {
            Get.put<UsersController>(UsersController());
          }
        }
        
        void main() async {
          UsersBinding().dependencies();
          runApp(MyApp());
        }
        
        

        这样做可以保证您的 UsersController 在您的应用程序中的任何地方都可用,在任何小部件加载之前。

        class MyHomePage extends StatelessWidget {
          final UsersController uc = Get.find();
        
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('GetX Bindings'),
              ),
              body: Center(
                child: Obx(() => Text('userId: ${uc.userId}')),
              ),
            );
          }
        }
        

        【讨论】:

          【解决方案4】:

          尝试添加

          GetMaterialApp(
            smartManagement: SmartManagement.keepFactory,
          )
          

          这样它就可以存储那些实例的工厂

          或确保添加permanent

          Get.put<Repo>(Repo(), permanent: true);
          

          这样它就永远不会从内存中删除

          【讨论】:

          • 这不起作用,因为我有一些小部件在控制器本身加载之前正在运行。但在某些情况下,控制器加载后我需要这个小部件。事实上,我需要一个条件:Get.isInit(UsersController()) ? Get.find() : Get.put(UsersController) ....
          【解决方案5】:

          如果您使用 get 在您的应用程序中提供某物的实例 meaby https://pub.dev/packages/get_it 可以为您提供更多帮助。只要确保你使用allowReassignment==true,如果你想保存一个全新的控制器,你可以更新你的实例,但如果你想使用相同的总是 get_it 对你来说是完美的

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-20
            • 2021-04-11
            • 2021-03-04
            • 2019-11-23
            • 2021-05-03
            • 2019-06-19
            • 1970-01-01
            • 2012-02-16
            相关资源
            最近更新 更多