Flutter能否同时使用Routing 1.0与Routing 2.0两套导航路由方案?
问题解答
关于是否为非破坏性变更
路由2.0属于Flutter的增量特性,本身属于完全非破坏性变更:
- 原有基于
MaterialApp的传统路由(Routing 1.0)逻辑可以完全正常运行,无需任何修改,官方不会移除对传统路由的支持 - 仅当你主动切换为
MaterialApp.router构造时,才需要适配新的路由参数,不存在强制升级的要求
关于能否同时使用两种路由
你不能同时实例化MaterialApp和MaterialApp.router两个根组件,一个Flutter应用顶层只能有一个MaterialApp实例。但可以通过两种方案实现渐进式迁移,同时保留原有路由能力、逐步接入路由2.0:
方案1:根路由兼容改造
直接将根组件替换为MaterialApp.router,原有逻辑无需重写:
- 你项目中用到的
localizationsDelegates、supportedLocales、theme等通用参数,MaterialApp.router完全支持,可以直接迁移过去 - 原有
initialRoute逻辑可以在RouteInformationParser的初始路由解析阶段实现,也可以直接给RouterDelegate设置初始路由状态对应_initialScreen - 原有
onGenerateRoute的逻辑可以整合到RouterDelegate的页面构建逻辑中,未适配路由2.0的旧路由可以直接调用已有的getGeneratedRoutes方法生成页面,不需要重写旧的路由跳转逻辑
方案2:局部启用路由2.0
如果暂时不想改动根路由,可以只在需要深度链接能力的子模块中,用Router组件单独包裹该模块,局部使用路由2.0的能力,其余全局路由逻辑仍沿用原有传统路由实现,等后续逐步完成全量迁移。
内容的提问来源于stack exchange,提问作者Manuel Montaño
相关产品推荐
相关产品推荐

