Flutter BLOC 导航 onGenerateRoute 在状态到达之前触发

Flutter BLOC navigation onGenerateRoute firing before state arrives

提问人:Iliya Melishev 提问时间:11/14/2023 更新时间:11/14/2023 访问量:17

问:

我正在构建我的材料应用程序并使用 languageBloc 来收听事件。 如果所选位置为空,我想导航到 SelectLocationPage(); 从那里,我从下拉列表中选择一个位置,并在 change 事件中触发选定的语言事件。

它可以工作,我可以 Print() 状态并查看所选语言 但是 onGenerateRoute 已经完成了路由的切换。

Widget buildApp(String language, String location) {
    return BlocBuilder<LanguageBloc, LanguageState>(
      builder: (languageContext, languageState) {
        return BlocBuilder<LocationBloc, LocationState>(
          builder: (locationContext, locationState) {

            if(locationState is LocationReadyState) {
              location = locationState.selectedLocation;
              print('selected location ${locationState.selectedLocation}'); ==> **fires second **
            }

            return MaterialApp(
              title: 'Courses',
              locale: _getLocale(languageState, language),
              localizationsDelegates: const [
                AppLocalizations.delegate,
                GlobalMaterialLocalizations.delegate,
                GlobalWidgetsLocalizations.delegate,
                GlobalCupertinoLocalizations.delegate,
              ],
              supportedLocales: const [
                Locale('en'),
                Locale('he'),
                Locale('ru'),
              ],
              initialRoute: '/',
              onGenerateRoute: (settings) {
                return getPageForRouteName(settings, location);
              },
            );
          },
        );
      },
    );
  }

  PageRouteBuilder getPageForRouteName(RouteSettings settings, String location) {
    print('onGenerateRoute location ${location}'); ==> **fires first location is '' **
    
    if (location.isEmpty) {
      return _buildPageRoute(SelectLocationPage());
    } else {
      switch (settings.name) {
        case '/home':
          return _buildPageRoute(HomePage());
        default:
          return _buildPageRoute(HomePage());
      }
    }
  }

我正在构建我的材料应用程序并使用 languageBloc 来收听事件。 如果所选位置为空,我想导航到 SelectLocationPage(); 从那里,我从下拉列表中选择一个位置,并在 change 事件中触发选定的语言事件。

它可以工作,我可以 Print() 状态并查看所选语言 但是 onGenerateRoute 已经完成了路由的切换。

颤振 集团

评论

0赞 Septian Dika 11/14/2023
不要将您的材质应用程序放在 BlocBuilder 中。最好在 BlocListener 上创建一个导航器,尝试在 Tutorials > Flutter > Login > App 上查看此 bloclibrary.dev/#/flutterlogintutorial,然后检查 MaterialApp 的 Widget 结构。在代码示例中,导航器放置在 MaterialApp 构建器内的 BlocListener 中

答: 暂无答案