You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何在showModalBottomSheet内实现全屏高度视图跳转?

解决方案

1. 区分路由类型,在onGenerateRoute中处理全屏跳转

既然你已经通过onGenerateRoute处理同高度弹窗的路由,可以在该方法内判断目标路由是否为全屏页面:如果是,直接调用根Navigator完成跳转,避免嵌套Navigator的路由冲突。

示例代码:

onGenerateRoute: (settings) {
  if (settings.name == '/same-height-modal') {
    // 维持原有同高度弹窗的路由逻辑
    return MaterialPageRoute(
      builder: (context) => SameHeightModal(),
      fullscreenDialog: false,
    );
  } else if (settings.name == '/full-screen-page') {
    // 延迟执行根Navigator跳转,避免路由栈异常
    WidgetsBinding.instance.addPostFrameCallback((_) {
      Navigator.of(context, rootNavigator: true).pushNamed('/full-screen-page');
    });
    // 返回空路由占位,防止嵌套Navigator报错
    return MaterialPageRoute(builder: (context) => const SizedBox());
  }
  return null;
},

2. 直接调用根Navigator触发全屏跳转

在触发全屏跳转的交互事件中,不要使用当前弹窗的Navigator实例,而是通过rootNavigator: true参数获取根Navigator来执行push操作:

ElevatedButton(
  onPressed: () {
    Navigator.of(context, rootNavigator: true).push(
      MaterialPageRoute(builder: (context) => FullScreenPage()),
    );
  },
  child: const Text('跳转到全屏页面'),
)

3. 确保根路由表注册全屏页面

在MaterialApp的路由配置中提前注册全屏页面的路由,保证根Navigator能正确匹配目标页面:

MaterialApp(
  routes: {
    '/full-screen-page': (context) => FullScreenPage(),
    // 其他根路由配置
  },
)

这种方式既能保留嵌套Navigator处理同高度弹窗的逻辑,又能正常实现全屏页面的跳转,避免路由栈混乱。


内容的提问来源于stack exchange,提问作者naoki perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:30:53