Flutter auto_route嵌套导航:向外部路由传递数据的问题
我在Flutter项目中用auto_route实现嵌套导航,现在需要从嵌套路由(路由树中向上两级的外层路由)传递两类动态数据到MainNavigationView的Scaffold中:
- 用于AppBar的标题字符串
- 作为floatingActionButton的Widget
导航路由结构
路由层级为:MainNavigationView → ManageRouter(EmptyRouterPage) → ObjectView(初始路由)/ObjectDetailView
路由定义代码:
@MaterialAutoRouter( routes: <AutoRoute>[ AutoRoute( page: MainNavigationView, children: [ AutoRoute( path: 'manage', page: EmptyRouterPage, name: 'ManageRouter', children: [ AutoRoute( path: 'object', page: ObjectView, initial: true, ), AutoRoute( path: 'detail', page: ObjectDetailView, ), ] ) ] ) ] )
MainNavigationView代码
MainNavigationView是承载AppBar和SpeedDial(作为floatingActionButton)的根Scaffold:
class MainNavigationView extends StatefulWidget { ... } class _MainNavigationViewState extends State<MainNavigationView> { final GlobalKey<ScaffoldState> _scaffoldkey = GlobalKey<ScaffoldState>(); @override Widget build(BuildContext context) { return AutoTabsRouter( routes: [ const ManageRouter(), ... ], builder: (context, child, __) { final tabsRouter = AutoTabsRouter.of(context); return Scaffold( key: _scaffoldkey, appBar: AppBar(...), // 需要动态设置标题 body: child, floatingActionButton: SpeedDial( ... // 需要动态设置内容 ), ... ); }, ); } ... }
需求与现有困惑
在ManageRouter的路由栈中,我可以在ObjectView和ObjectDetailView之间切换导航,现在需要这两个视图向MainNavigationView传递动态的AppBar标题和floatingActionButton所需的内容。
目前我想到的唯一方案是用Provider实现解耦的数据传递,但感觉对于这种通用场景来说有点冗余。
更新
我查了很多方案,但没找到「父级存在Scaffold,嵌套路由向父级Scaffold传递值」的相关场景。其他路由包(比如go_router)的示例里,MainNavigationView的Scaffold通常只设置bottomNavigationBar,不会设置appBar或floatingButtons,嵌套内容(比如ManageRouter下的Object/ObjectDetail)会自己带Scaffold并设置对应的appBar和bottomNavigationBar。
我尝试用Provider等状态管理方案解决,但遇到了在嵌套内容的build方法中触发notifyListeners()时的构建问题,还存在栈管理的问题。结合bottomNavigationBar自身的栈副作用,我觉得这是一个架构层面的问题。
感谢大家的帮助和关注!
内容的提问来源于stack exchange,提问作者THE-E

