代码之家  ›  专栏  ›  技术社区  ›  Tristan King

在父页中获取Auto_Route嵌套的AutoRouter()的路由堆栈,并在其更改时使用Hook/Riverpod重建

  •  0
  • Tristan King  · 技术社区  · 1 年前

    我正试图使用嵌套的Auto_Route路由为我的应用程序制作一个UI外壳,我希望这个外壳有一个面包屑导航栏,可以显示路由堆栈,并让你点击任何一个弹出到它。

    所以我有一个简单的AppShellPage。这就是我迄今为止所尝试的,在useMemoized中创建一个密钥,通过useListenable中的密钥获取控制器。

    @RoutePage()
    class AppShellPage extends HookWidget {
      const AppShellPage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        final routerKey = useMemoized(() => GlobalKey<AutoRouterState>(), []);
        final routerController = useListenable(routerKey.currentState?.controller!);
    
        print('routerController: $routerController');
        print('routerKey: $routerKey');
    
        return Scaffold(
          backgroundColor: Colors.grey[200],
          body: Column(
            children: [
              SizedBox(
                height: 40,
                child: Row(
                  children: routerController == null
                      ? []
                      : routerController.stack.map((route) {
                          return Text('> ${route.name ?? ''}');
                        }).toList(),
                ),
              ),
              Expanded(child: AutoRouter(key: routerKey)),
            ],
          ),
        );
      }
    }
    

    现在,这确实有效,并且正是我想要它做的,但只有在热重新加载一次之后。我认为这很明显是由于嵌套的AutoRouter直到AppShellPage被实例化之后才被实例化,因此routerController在重新加载一次之前是null。

    我不知道解决方案是不是沿着这些路线,而是在routerController不再为空时更新它,或者我是否应该用完全不同的方式来做这件事,比如使用Riverpod Provider和Stream。

    我不想使用任何StatefulWidgets,我正在使用Hooks和Riverpod Generator。

    0 回复  |  直到 1 年前
    推荐文章