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

Flutter中auto_route+modal_bottom_sheet实现Deep Link时Navigator Overlay为空问题

我遇到了Navigator的overlay为空的错误,不知道该如何解决。

深层链接命令

~/Library/Android/sdk/platform-tools/adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "https://my.app.com/news/xx-xx-xx" \
    com.app.my

路由代码

...
AutoRoute(
        path: 'news',
        page: EmptyRouterPage,
        name: 'NewsTab',
        children: [
          AutoRoute(
            page: NewsCategoryScreen,
            name: 'NewsCategoryRoute',
            path: 'category/:id',
          ),
          CustomRoute(
            path: ':newsSlug',
            page: NewsDetailScreen,
            name: 'NewsDetailOverlay',
            fullscreenDialog: false,
            barrierDismissible: true,
            customRouteBuilder: modalSheetBuilder,
            maintainState: true,
            usesPathAsKey: true,
          ),
          AutoRoute(
            page: NewsListScreen,
            path: '',
            name: 'NewsList',
          ),
          RedirectRoute(path: '', redirectTo: '/')
        ],
      ),
...
Route<T> modalSheetBuilder<T>(
    BuildContext context, Widget child, CustomPage<T> page) {

  return ModalBottomSheetRoute(
    settings: page,
    builder: (context) => child,
    expanded: false,
  );
}

错误栈信息

#1      TransitionRoute.install
package:flutter/…/widgets/routes.dart:224
#2      ModalRoute.install
package:flutter/…/widgets/routes.dart:1180
#3      _RouteEntry.handleAdd
package:flutter/…/widgets/navigator.dart:2822
#4      NavigatorState._flushHistoryUpdates
package:flutter/…/widgets/navigator.dart:3843
#5      NavigatorState.restoreState
package:flutter/…/widgets/navigator.dart:3324
#6      RestorationMixin._doRestore
package:flutter/…/widgets/restoration.dart:872
#7      RestorationMixin.didChangeDependencies
package:flutter/…/widgets/restoration.dart:858
#8      NavigatorState.didChangeDependencies
package:flutter/…/widgets/navigator.dart:3342
#9      StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:5036
#10     ComponentElement.mount
package:flutter/…/widgets/framework.dart:4853
#11     Element.inflateWidget
package:flutter/…/widgets/framework.dart:3863
#12     Element.updateChild
package:flutter/…/widgets/framework.dart:3586
#13     ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4904
#14     StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:5050
#15     Element.rebuild
package:flutter/…/widgets/framework.dart:4604
#16     StatefulElement.update
package:flutter/…/widgets/framework.dart:5082
#17     Element.updateChild
package:flutter/…/widgets/framework.dart:3570
#18     ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4904
#19     StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:5050
#20     Element.rebuild
package:flutter/…/widgets/framework.dart:4604
#21     StatefulElement.update
package:flutter/…/widgets/framework.dart:5082
#22     Element.updateChild
package:flutter/…/widgets/framework.dart:3570
#23     ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4904
#24     Element.rebuild
package:flutter/…/widgets/framework.dart:4604
#25     ProxyElement.update
package:flutter/…/widgets/framework.dart:5228
#26     Element.updateChild
package:flutter/…/widgets/framework.dart:3570
#27     ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4904
#28     Element.rebuild
package:flutter/…/widgets/framework.dart:4604
#29     ProxyElement.update
package:flutter/…/widgets/framework.dart:5228
#30     Element.updateChild
package:flutter/…/widgets/framework.dart:3570
#31     ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4904
#32     StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:5050
#33     Element.rebuild
package:flutter/…/widgets/framework.dart:4604
#34     BuildOwner.buildScope
package:flutter/…/widgets/framework.dart:2667
#35     WidgetsBinding.drawFrame
package:flutter/…/widgets/binding.dart:882
#36     RendererBinding._handlePersistentFrameCallback
package:flutter/…/rendering/binding.dart:378
#37     SchedulerBinding._invokeFrameCallback
package:flutter/…/scheduler/binding.dart:1175
#38     SchedulerBinding.handleDrawFrame
package:flutter/…/scheduler/binding.dart:1104
#39     SchedulerBinding._handleDrawFrame
package:flutter/…/scheduler/binding.dart:1015

定位到的问题代码

调试发现错误出现在modal_bottom_sheet-2.1.2包的bottom_sheet_route.dart文件中,这里的navigator!.overlay!为空:

@override
  AnimationController createAnimationController() {
    assert(_animationController == null);
    _animationController = ModalBottomSheet.createAnimationController(
      navigator!.overlay!,
      duration: transitionDuration,
    );
    return _animationController!;
  }

补充说明

  • 导航到NewsListScreen、使用https://my.app.com/news这类链接时,深层链接可以正常工作
  • 使用的包版本:
    • auto_route: ^5.0.2
    • modal_bottom_sheet: ^2.1.2
  • 已尝试按照auto_route文档使用Navigation Observer调试,但未找到明确解决方案

请问该如何让出现问题的Navigator拥有动画所需的overlay?


内容的提问来源于stack exchange,提问作者ǝlpoodooɟƃuooʞ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:25:32