Flutter - 根据登录状态使用不同的路由启动应用程序

2024-01-27

我正在寻找一种根据登录状态在应用程序启动时显示不同屏幕的方法。例如,我定义了以下路由:

  • /home
  • /login
  • /设置

当然,我会检查用户是否已经在main()方法,然后设置initialRoute我的 MaterialApp 到 /login 或 /home。登录成功后可以拨打电话Navigator.pushReplacement导航到 /home 并且登录屏幕将从堆栈中删除。不幸的是,我总是必须定义一条路线/或设置homeMaterialApp 的属性。所以如果我设置/到空白处Container(),此容器将位于导航堆栈上,用户可以返回到此空白屏幕。

我想出的两个选择是:

  • 将 MaterialApp 的 home 属性设置为 HomeScreen 或 LoginScreen
  • 返回主屏幕中的登录屏幕build()方法,如果用户还没有登录

这两个选项都是可行的,但是我必须提出一些重新加载逻辑并重新设置状态才能更新 home 属性或 HomeScreen。

有什么想法 Flutter 处理此类情况的正确方法是什么?


也许,你可以做到这一点。假设您有一个带有异步方法的 Auth 类isLogged.

class Auth {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Future<bool> isLogged() async {
    try {
      final FirebaseUser user = await _firebaseAuth.currentUser();
      return user != null;
    } catch (e) {
      return false;
    }
  }
}

你可以使用myApp构造函数传递initialRoute,并根据登录状态决定初始路由。然后,您可以传递以下实例myApp to runApp:

Warning:如果出现错误,请添加WidgetsFlutterBinding.ensureInitialized();就在之前void main() async {。检查这个问题#40253 https://github.com/flutter/flutter/issues/40253.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final Auth _auth = Auth();
  final bool isLogged = await _auth.isLogged();
  final MyApp myApp = MyApp(
    initialRoute: isLogged ? '/home' : '/',
  );
  runApp(myApp);
}

之后,您必须修改myApp类在构造函数中传递初始路由:

class MyApp extends StatelessWidget {
  final String initialRoute;

  MyApp({this.initialRoute});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dynamic Route Demo',
      initialRoute: initialRoute,
      routes: {
        '/': (context) => LoginPage(),
        '/home': (context) => HomePage(),
        '/settings': (context) => SettingsPage(),
      },
    );
  }
}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter - 根据登录状态使用不同的路由启动应用程序 的相关文章

随机推荐

  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • 如何通过 Google Drive API 使用刷新令牌生成访问令牌?

    我已完成授权步骤并获得访问令牌和刷新令牌 接下来我应该做什么来使用我通过 google Drive API 存储的刷新令牌生成访问令牌 由于我在 Force com 上工作 因此我无法使用任何 sdk 因此请建议直接通过 API 实现它的方
  • 经典 asp - 仅接收肥皂响应的一部分

    我试图从经典 asp 调用肥皂请求 它将在稍后更新 但现在它仍然是经典 asp 但我只得到一半的响应 当我在 SoapUI 中使用请求字符串时 我得到了我正在寻找的响应 但在 asp 中我只收到了部分响应 ASP 请求 Set oXmlHT
  • scala:重写构造函数的隐式参数

    我有一个类 它采用隐式参数 该参数由类内部方法调用的函数使用 我希望能够覆盖该隐式参数 或者从其源复制隐式参数 举个例子 def someMethod implicit p List Int uses p class A implicit
  • 如何在市场上发布应用程序的两个版本?

    我想将我的应用程序的两个版本添加到 Android 市场 一种只需几美分 另一种是带有广告的免费版本 这是一种非常常见的做法 我目前正在将 AdMod 构建到我的应用程序中 看来我必须更改相当多的文件 因此最好为此制作一个单独的应用程序版本
  • 如何提高自编码器的准确率?

    我有一个自动编码器 我使用不同的解决方案检查了模型的准确性 例如更改转换层的数量并增加它们 添加或删除批量归一化 更改激活函数 但所有这些解决方案的准确性都是相似的 并且不一样有任何奇怪的改进 我很困惑 因为我认为这些不同解决方案的准确度应
  • JavaScript 中重复元素的独特排列

    假设我们有元素 0 和 1 它们可以出现多次 就像00 00 11 00 00 11 11 or 01 11 为了更好的可读性分成 2 组 我已经有一个函数来生成所有独特的排列 class UniqueElement constructor
  • 如何在同一行上同时打印多个内容(固定文本和/或变量值)?

    我有一些代码 例如 score 100 name Alice print Total score for s is s name score 我想要打印出来Total score for Alice is 100 但我得到的是Total s
  • Android 从 Activity 传递和检索额外内容到 Fragment

    我有一个活动 用户按下按钮 然后发送到片段 但我希望传递一个额外的片段以供使用 活动A 按钮在哪里 public OnClickListener publish new OnClickListener Override public voi
  • 如何从 MySql 服务器到 Android 应用程序?

    我有一个 MySql 数据库 里面有一些体育比赛结果 我想写一个Android应用程序来在手机上显示这些数据 我在网上搜索过这个问题 我认为MySql数据库和Android应用程序之间不可能有直接连接 这是正确的吗 所以我的问题如下 我怎样
  • redux-observable Promise 在单元测试中没有得到解决

    我正在尝试测试这部史诗https github com zarcode unsplashapp blob master src epics photos js https github com zarcode unsplashapp blo
  • Apache Spark - Spark 中的内部作业调度程序如何定义什么是用户,什么是池

    我很抱歉在这里说得有点笼统 但我对 Spark 内部的作业调度如何工作有点困惑 从文档中here https spark apache org docs latest job scheduling html scheduling withi
  • 在 os.walk() for 循环中使用 os.remove() 返回 FileNotFoundError

    我在 Anaconda 命令提示符中使用 Python 3 6 4 我有一个使用的函数os walk 循环遍历根目录中的所有可用文件 我的代码是 def apply to files pattern base regex re compil
  • 防止 pydub 打开控制台窗口

    有没有办法阻止 pydub 在使用 ffmpeg 在 Windows 上 时打开控制台窗口 每次启动 ffmpeg 将 mp3 文件转换为 wav 时 它都会短暂打开一个控制台窗口 该窗口会在处理完成后自动关闭 但可能会造成干扰 我使用的解
  • 模板参数内的括号,例如std::function

    我正在读关于std function在第 3 部分中 关于 C 回调的 长 答案https stackoverflow com a 28689902 3832877 https stackoverflow com a 28689902 38
  • 任何人都可以获得任何 C# 代码来解析 robots.txt 并根据它评估 URL

    简短的问题 有没有人有任何 C 代码来解析 robots txt 然后根据它评估 URL 看看它们是否会被排除 长问题 我一直在为尚未发布到谷歌的新网站创建站点地图 站点地图有两种模式 用户模式 如传统站点地图 和 管理 模式 管理模式将显
  • 如何使用QueryParser进行Lucene范围查询(IntPoint/LongPoint)

    我真正喜欢 Lucene 的一件事是查询语言 我 应用程序用户可以在其中编写动态查询 我通过解析这些查询 QueryParser parser new QueryParser indexWriter getAnalyzer Query qu
  • 如何分别变换形状的每一面?

    如何创建一个 CSS 形状 其中每一面都单独变换 类似于下图中的形状 只使用 CSS 而不使用图像可以吗 我认为 CSS 中没有任何方法可以单独选择和变换每一面 但您可以通过使用透视变换 纯 CSS 来实现有问题的形状 沿 X 轴和 Y 轴
  • 预加载 HTML 中的图像

    我想预加载这 4 张图像 我试过这个 img src img 1 jpg style display none img src img 1a jpg style display none img src img 1b jpg style d
  • Flutter - 根据登录状态使用不同的路由启动应用程序

    我正在寻找一种根据登录状态在应用程序启动时显示不同屏幕的方法 例如 我定义了以下路由 home login 设置 当然 我会检查用户是否已经在main 方法 然后设置initialRoute我的 MaterialApp 到 login 或