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:动态初始路由的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Navigator 路由总是“/”

Flutter 中的路由

使用 BLoC 的 Flutter 导航:用于从 Navigator 推送路由的上下文必须是 Navigator 小部件的后代

Flutter 路由

Flutter 路由我定

12.Flutter教程 — 路由管理与Navigator进阶使用(老油条看了都说好!!!)