我正试图使用嵌套的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。