Flutter GetX 绑定?

问题描述 投票:0回答:3

我是这个架构的新手,我对 getX 中的绑定有疑问

我有两个控制器 cartController 和splashController 我需要这个 cartController 在应用程序的整个生命周期中保持其状态 仅用于启动画面的splashController

但是只有当我在 GetMaterialApp 中的初始绑定中将其与其他控制器绑定时,飞溅控制器才起作用

GetMaterialApp(
      home: const SplashScreen(),
      initialBinding: RootBinding(),
      getPages: [
        GetPage(
          name: SplashScreen.routeName,
          page: () => const SplashScreen(),
        ),
        GetPage(
            name: HomeScreen.routeName,
            page: () => const HomeScreen(),
            children: [
              GetPage(
                name: CategoryScreen.routeName,
                page: () => const CategoryScreen(),
              ),
              GetPage(
                name: AboutScreen.routeName,
                page: () => const AboutScreen(),
              ),
              GetPage(
                name: CartScreen.routeName,
                page: () => const CartScreen(),
              ),
            ]),
      ],
    );

根绑定是

class RootBinding implements Bindings {
  @override
  void dependencies() {
    Get.put<SplashController>(SplashController());
    Get.put<HomeController>(HomeController());
    Get.put<CategoryController>(CategoryController());
    Get.put<AboutController>(AboutController());
  }
}

当我将其更改为 Get.lazyPut() 时它也不起作用

我不知道这是否是上面代码的最佳实践,但是当我从初始绑定到页面的控制器中删除控制器时,它不会像下面那样工作

GetPage(
   name: SplashScreen.routeName,
   page: () => const SplashScreen(),
   binding: SplashBinding()
   ),

链接到源代码 https://github.com/shabhi1997/GetXBaseProject/tree/master

flutter dart flutter-dependencies dart-pub flutter-getx
3个回答
2
投票

您可以使用 BindingsBuilder 回调。 每当您访问 Splash Screen 时,Getx 都会创建一个 Splash 控制器的实例,并且一旦页面从 stack 中删除,GetX 就会自动删除该 Splash 屏幕控制器的实例。

GetPage(
   name: SplashScreen.routeName,
   page: () => const SplashScreen(),
   binding: BindingsBuilder(() {
          Get.lazyPut<SplashController>(
            () => SplashController(),
          );
        }))

1
投票

我也做过类似的事情希望这有帮助😁

当您在启动屏幕后将用户导航到主屏幕时,您可以使用 Get.offAll() 与绑定进行导航,其中 您已初始化所有控制器

导航至主屏幕

Get.offAll(
  () => const InitialScreen(screenTag: appControllersTag),
  binding: InitialScreenBindings(tag: appControllersTag),
)

初始化所有控制器

class InitialScreenBindings implements Bindings {
  String tag;

  InitialScreenBindings({required this.tag});

  @override
  void dependencies() {
    Get.lazyPut(() => BottomNavigationController(), tag: tag);
    Get.lazyPut(() => HomeController(), tag: tag);
    Get.lazyPut(() => OrderController(), tag: tag);
    Get.lazyPut(() => CartController(), tag: tag);
    Get.lazyPut(() => ProfileController(), tag: tag);
  }
}

有了这个,我的 BottomNavigationController、HomeController、OrderController、CartController 和 ProfileController 在应用程序的整个生命周期中都处于活动状态

快速建议: 您可以注入带有标签的控制器,相信我,这会让您的生活变得轻松,因为它有助于调试和修复问题。


0
投票

如果是 cartController,只需在 Get.put() 方法中设置永久标志:true 即可使其在整个应用程序 Cycle 中保持活动状态。

同时删除 home: const SplashScreen()。这是造成主要问题的原因。您的启动画面是在没有绑定(控制器)的情况下创建的。

相反,在声明应用程序的路由时,给 SplashScreen 路由名称“/”,这意味着初始路由。它会在开始时自动初始化。您不需要在初始绑定中提供它。

© www.soinside.com 2019 - 2024. All rights reserved.