Затрудненная проблема контекста с onGenerateRoute и компоновщиком в MaterialApp - PullRequest
0 голосов
/ 21 апреля 2020

Сообщество StackOverflow!

Я пытаюсь создать мобильное / веб-приложение во Flutter со стати c «всегда открытым» ящиком в Интернете.

Так что Я сделал, я создал и маршрутизатор (с Fluro) и использовать его в функции onGenerateRoute моего MaterialApp. Ребенок будет создан из роутера, и я передам его в «MainLayout».

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'MyApp',
      theme: appTheme,
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        FlutterI18nDelegate(
          translationLoader: FileTranslationLoader(
              basePath: 'assets/i18n',
              fallbackFile: 'de_DE',
              useCountryCode: true),
        ),
      ],
      supportedLocales: [
        const Locale('en', 'US'), // English
        const Locale('de', 'DE'), // German
      ],
      initialRoute: NavUtils.initialUrl,
      onGenerateRoute: router.generator,
      navigatorKey: _navigatorKey,
      builder: (context, child) {
        return MultiBlocProvider(
          providers: [
            BlocProvider.value(
              value: _authenticationBloc,
            ),
            BlocProvider.value(
              value: _userSettingsBloc,
            ),
            BlocProvider.value(
              value: _organizationBloc,
            ),
            BlocProvider.value(
              value: _reportsBloc,
            ),
          ],
          child: BlocBuilder<AuthenticationBloc, AuthenticationState>(
            builder: (context, state) {
              if (state is AuthenticationAuthenticated) {
                return MainLayout(
                  child: child,
                  drawerKey: _drawerKey,
                  navigatorKey: _navigatorKey,
                );
              } else {
                return Scaffold(
                  backgroundColor: mainBackground,
                  drawer: DrawerMenu(
                    navigatorKey: _navigatorKey,
                    drawerKey: _drawerKey,
                  ),
                  body: SafeArea(
                    child: child,
                  ),
                );
              }
            },
          ),
        );
      },
    );
  }

и содержимое моего MainLayout ()

class MainLayout extends StatelessWidget {
  final Widget child;
  final GlobalKey<ScaffoldState> drawerKey;
  final GlobalKey<NavigatorState> navigatorKey;
  MainLayout(
      {Key key,
      @required this.child,
      @required this.drawerKey,
      @required this.navigatorKey})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: drawerKey,
      backgroundColor: mainBackground,
      drawer: MediaQuery.of(context).size.width >= 769
          ? null
          : DrawerMenu(
              navigatorKey: navigatorKey,
              drawerKey: drawerKey,
            ),
      body: SafeArea(
        child: Container(
          child: Row(
            children: <Widget>[
              MediaQuery.of(context).size.width >= 769
                  ? DrawerMenu(
                      navigatorKey: navigatorKey,
                      drawerKey: drawerKey,
                    )
                  : Container(),
              Expanded(
                child: child,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

У меня проблема в том, что ie. Мой DrawerMenu () не может найти навигатор в контексте. Приводит меня к таким проблемам, как я не могу использовать любой виджет всплывающей подсказки, потому что он не находит оверлей маршрутизация.

Кто-нибудь может мне помочь с этим? Достаточно ли этой информации для оказания какой-либо помощи?


Обновление

С вашим вопросом и вашим ответом здесь на StackOverflow Я понял, что мне нужно использовать это разные. Я «извлек» весь материал и создал Navigator в Scaffold, например, так:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'MyApp',
      theme: appTheme,
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        FlutterI18nDelegate(
          translationLoader: FileTranslationLoader(
              basePath: 'assets/i18n',
              fallbackFile: 'de_DE',
              useCountryCode: true),
        ),
      ],
      supportedLocales: [
        const Locale('en', 'US'), // English
        const Locale('de', 'DE'), // German
      ],
      initialRoute: NavUtils.initialUrl,
      onGenerateRoute: (RouteSettings settings) {
        _navigatorKey.currentState.popAndPushNamed(settings.name);
      },
      home: Builder(
        builder: (context) => MultiBlocProvider(
          providers: [
            BlocProvider.value(
              value: _authenticationBloc,
            ),
            BlocProvider.value(
              value: _userSettingsBloc,
            ),
            BlocProvider.value(
              value: _organizationBloc,
            ),
            BlocProvider.value(
              value: _reportsBloc,
            ),
          ],
          child: Scaffold(
            key: _drawerKey,
            backgroundColor: mainBackground,
            drawer: MediaQuery.of(context).size.width >= 769
                ? null
                : DrawerMenu(
                    navigatorKey: _navigatorKey,
                    drawerKey: _drawerKey,
                  ),
            body: SafeArea(
              child: Container(
                child: Row(
                  children: <Widget>[
                    MediaQuery.of(context).size.width >= 769
                        ? DrawerMenu(
                            navigatorKey: _navigatorKey,
                            drawerKey: _drawerKey,
                          )
                        : Container(),
                    Expanded(
                      child: Navigator(
                        key: _navigatorKey,
                        initialRoute: NavUtils.initialUrl,
                        onGenerateRoute: router.generator,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

Единственная проблема сейчас в том, как мне получить URL, который пользователь вводит в адресная строка браузера, на мой навигатор.

Пока я использую _navigatorKey.currentState.popAndPushNamed(settings.name); в своем MaterialApp, но это удаляет URL в адресной строке после нажатия Enter. (Но на самом деле он переходит на правильную страницу)

Есть ли способ сохранить эту последовательность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...