dart Flutter - go_router -子嵌套导航中的共享脚手架

x6yk4ghg  于 2023-04-27  发布在  Flutter
关注(0)|答案(1)|浏览(253)

我正在尝试在go_router上设置这样的结构。

我试图通过查看共享的scaffold和嵌套的导航示例来实现这一点,但是当我向下查看底部的子元素时,我必须编写第一页的参数。
我只是需要如何设置路由构建的帮助。我不想发送的第一页的参数时,我去到子页面是可能的?

class AppRouter {
  UserController userService = locator<UserController>();
  late final router = GoRouter(
    errorPageBuilder: (context, state) {
      return MaterialPage<void>(
        key: state.pageKey,
        child: Scaffold(body: Center(child: Text('${state.error}'))),
      );
    },
    redirect: (state) {
      if (state.subloc == '/' || state.subloc == '/yukleniyor' || state.subloc == '/login' || state.subloc == '/main_view' || state.subloc == '/veri_aliniyor') {
        debugPrint('========================>      INITIAL STATUS YÖNLENDİRME ${userService.status} ');
        final isLoadYukleniyorView = state.subloc == '/yukleniyor';
        final isLoadLoginView = state.subloc == '/login';
        final isLoadMainView = state.subloc == '/main_view';
        final isLoadVeriAliniyorView = state.subloc == '/veri_aliniyor';

        if (!isLoadYukleniyorView && userService.status == AuthType.yukleniyor) return state.namedLocation('yukleniyor');
        if (!isLoadLoginView && userService.status == AuthType.dogrulanmamis) return state.namedLocation('login');
        if (!isLoadVeriAliniyorView && userService.status == AuthType.dataAliniyor) return state.namedLocation('veri_aliniyor');
        if (!isLoadMainView && (userService.status == AuthType.dogrulandi || userService.status == AuthType.internetOlmadanDogrulanmis)) return '/main_view/initial';
        return null;
      } else {
        return null;
      }
    },
    refreshListenable: userService,
    debugLogDiagnostics: true,
    routes: [
      GoRoute(
        name: '/splash',
        path: '/',
        builder: (context, state) => const Scaffold(body: Center(child: Text('Splash Screen'))),
      ),
      GoRoute(
        name: '/yukleniyor',
        path: '/yukleniyor',
        builder: (context, state) => const YukleniyorView(),
      ),
      GoRoute(
        name: '/veri_aliniyor',
        path: '/veri_aliniyor',
        builder: (context, state) => const VeriAliniyorView(),
      ),
      GoRoute(
        name: '/login',
        path: '/login',
        builder: (context, state) => const LoginView(),
      ),
      GoRoute(
        name: '/main_view',
        path: '/main_view/:screen(initial|calisan_denetimleri_view|personel_denetim_analizi_view|calisan_risk_analizi_view)',
        pageBuilder: (context, state) {
          final param = state.params['screen'];
          late Widget body;
          late String appBarTitle;
          if (param != 'initial') {
            // Param initial değilse uygulama içinde geziniyor.
            if (param == 'calisan_denetimleri_view') {
              body = const CalisanDenetimleriView();
              appBarTitle = 'Çalışan Denetim Bilgi Sistemi';
            } else if (param == 'personel_denetim_analizi_view') {
              body = const PersonelDenetimAnalizView();
              appBarTitle = 'Personel Denetim Analizi';
            } else if (param == 'calisan_risk_analizi_view') {
              body = const CalisanRiskAnaliziView();
              appBarTitle = 'Çalışan Risk Analizi';
            }
          } else {
            // Param initial ise uygulama yeni açıldı initial sayfayı belirliyelim
            if (userService.status == AuthType.dogrulandi && (userService.personelBilgi.turId == 989 || userService.personelBilgi.turId == 1100)) {
              body = const PersonelDenetimAnalizView();
              appBarTitle = 'Personel Denetim Analizi';
            } else {
              body = const CalisanDenetimleriView();
              appBarTitle = 'Çalışan Denetim Bilgi Sistemi';
            }
          }
          return FadeTransitionPage(
            key: state.pageKey,
            child: MainView(appBarTitle: appBarTitle, body: body),
          );
        },
        routes: [
          GoRoute(
            name: 'calisan_denetim_detay',
            path: 'calisan_denetim_detay',
            pageBuilder: (context, state) {
              int index = int.parse(state.queryParams['tab'] ?? '0');
              return FadeTransitionPage(
                key: state.pageKey,
                child: CalisanDenetimDetayMainView(index: index),
              );
            },
          ),
        ],
      ),
    ],
  );
}
5us2dqdw

5us2dqdw1#

您应该使用ShellRoute来实现此Medium blog中提到的功能

相关问题