我在我的应用程序中使用 go_router 以及 get 包。问题是,自从我实现了
Go-Router
之后,我就无法再显示Get.snackbar
了。它失败并抛出 null-error
。
为了让
GoRouter
工作,我必须为我的 .router
添加 GetMaterialApp
。然后navigationKey
不再可用,所以我只用key
尝试过。
这是我的
GetMaterialApp
:
child: GetMaterialApp.router(
title: 'Wishlists',
key: Get.key, // <- I think that this might cause the issue
routeInformationProvider: router.routeInformationProvider,
routeInformationParser: router.routeInformationParser,
routerDelegate: router.routerDelegate,
translationsKeys: AppTranslation.translationsKeys,
locale: locale,
fallbackLocale: fallbackLocale,
),
这是
error
:
错误:意外的空值。 在 Object.throw_ [as throw] (http://localhost:51492/dart_sdk.js:5080:11) 在 Object.nullCheck (http://localhost:51492/dart_sdk.js:5399:30) 在 [_configureOverlay] (http://localhost:51492/packages/get/get_navigation/src/snackbar/snackbar_controller.dart.lib.js:2970:53) 在 [_show] (http://localhost:51492/packages/get/get_navigation/src/snackbar/snackbar_controller.dart.lib.js:3113:30)
我感觉这和
key
里面的GetMaterialApp
有关系,但我不知道如何解决这个问题。
这是一个已知的错误吗?我在这里缺少什么?
问题是,当您将类
GoRouter
实现为路由器时,您会丢失 Get.context
中的上下文,并且没有上下文 Get.snackbar
无法再工作。
作为解决方法,我将参数中的上下文传递给我的控制器(或任何需要上下文的地方)
例如:
class GoRouterPages {
static final router = GoRouter(
debugLogDiagnostics: true,
initialLocation: 'test',
routes: [
GoRoute(
path: '/test',
name: 'test',
builder: RouterTools.globalContextBinder( // globalContextBinder code below
(context, state) {
LoginBinding().dependencies();
return const LoginView();
},
)),
]);
}
class RouterTools {
static GoRouterWidgetBuilder globalContextBinder(GoRouterWidgetBuilder? goRouterWidgetBuilder) {
callback(context, state) {
// Here we can put every global controller/provider that needs the go_router context !
if (Get.isRegistered<RootController>() == false) {
Get.lazyPut(() => RootController(context: context));
}
return goRouterWidgetBuilder!(context, state);
}
return callback;
}
}
// Then in RootController you can open a snackbar like this
const snackBar = SnackBar(
content: Text('My snackbar'),
);
ScaffoldMessenger.of(context!).showSnackBar(snackBar);