Flutter Navigator:动态初始路由
Posted
技术标签:
【中文标题】Flutter Navigator:动态初始路由【英文标题】:Flutter Navigator: Dynamic initial route 【发布时间】:2019-01-25 16:56:51 【问题描述】:我的应用仅在首次启动应用时才会显示一些介绍屏幕。第一次启动后显示的第一个屏幕应该是我的HomePage
。我尝试了这些路线:
"/" -> HomePage()
"/intro" -> IntroPage()
然后像这样设置initialRoute
:
initialRoute: isFirstLaunch ? "/intro" : "/"
使用该配置,Flutter 首先将HomePage()
放在导航堆栈上,然后将IntroPage()
放在顶部,此时initialRoute
是"/intro"
。这很糟糕,因为HomePage()
加载了CameraPreview
,所以它要求权限并且是资源密集型的。在我明确导航到主页之前不应加载它。
我也试过这个配置:
"/" -> IntroPage()
"/home" -> HomePage()
然后我在后面的堆栈上有IntroPage()
,这也不是我想要的。
知道如何解决吗?
【问题讨论】:
【参考方案1】:"intro": (BuildContext context) => IntroPage()
"home": (BuildContext context) => HomePage()
确保两条路由都是没有父级的***路由。
【讨论】:
对我来说效果很好。 像魅力一样工作,谢谢!对于那些不能让它工作的人,只要确保你使用 => 而不是 ->。我的路线是这样定义的: routes: 'main' : (context) => PageStock(), 'guest' : (context) => SignInPage() ,top-level routes without a parent
是什么意思?【参考方案2】:
MaterialApp 的initialRoute
属性的文档解释了这种行为如下:
如果路由包含斜线,则将其视为“深层链接”, 在这条路线被推送之前,通往这条路线的路线是 推也。例如,如果路由是 /a/b/c,那么应用程序将 从加载的三个路由 /a、/a/b 和 /a/b/c 开始,其中 顺序。
【讨论】:
非常感谢塞巴斯蒂安。对于我的特殊情况,这被证明是非常有见地的......非常感谢......【参考方案3】:直接将所需的小部件加载为您的MaterialApp
应用程序home
怎么样:
return MaterialApp(
home: isFirstLaunch? IntroScreen():HomeScreen(),
);
【讨论】:
如果有 3 个屏幕并且您希望根据条件将这三个屏幕作为初始屏幕怎么办,如果您能提供帮助,我发布了一个关于此的问题 >>***.com/questions/70955476/…以上是关于Flutter Navigator:动态初始路由的主要内容,如果未能解决你的问题,请参考以下文章
使用 BLoC 的 Flutter 导航:用于从 Navigator 推送路由的上下文必须是 Navigator 小部件的后代