我是这个架构的新手,我对 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
您可以使用 BindingsBuilder 回调。 每当您访问 Splash Screen 时,Getx 都会创建一个 Splash 控制器的实例,并且一旦页面从 stack 中删除,GetX 就会自动删除该 Splash 屏幕控制器的实例。
GetPage(
name: SplashScreen.routeName,
page: () => const SplashScreen(),
binding: BindingsBuilder(() {
Get.lazyPut<SplashController>(
() => SplashController(),
);
}))
我也做过类似的事情希望这有帮助😁
当您在启动屏幕后将用户导航到主屏幕时,您可以使用 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 在应用程序的整个生命周期中都处于活动状态
快速建议: 您可以注入带有标签的控制器,相信我,这会让您的生活变得轻松,因为它有助于调试和修复问题。
如果是 cartController,只需在 Get.put() 方法中设置永久标志:true 即可使其在整个应用程序 Cycle 中保持活动状态。
同时删除 home: const SplashScreen()。这是造成主要问题的原因。您的启动画面是在没有绑定(控制器)的情况下创建的。
相反,在声明应用程序的路由时,给 SplashScreen 路由名称“/”,这意味着初始路由。它会在开始时自动初始化。您不需要在初始绑定中提供它。