Flutter 显示 GetX 小吃栏因 GoRouter 失败

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

我在我的应用程序中使用 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
有关系,但我不知道如何解决这个问题。

这是一个已知的错误吗?我在这里缺少什么?

flutter dart get snackbar flutter-go-router
1个回答
0
投票

问题是,当您将类

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);

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