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 - 根据登录状态使用不同的路由启动应用程序 的相关文章

  • 如何在 flutter 中仅显示列表中的 5 项

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • 颤振轮播图像滑块在点击事件期间打开单独的页面被调用

    我是新来的 我想问一个关于我的代码的问题 我查看了 youtube 和一些关于这个 inkwell 的 google 教程 以及点击功能来在 flutter 上打开新的类活动 但结果是 当点击图像时 它会打开不同的图像屏幕 但它们共享相同的
  • 在FLUTTER/DART中,为什么我们有时在声明变量时要在“String”后面加一个问号?

    在演示应用程序中 我们找到一个实例 最终字符串 标题 gt 为什么要加这个 在 String 类型之后 class MyHomePage extends StatefulWidget MyHomePage Key key this titl
  • Jupyter Notebook:搜索文本并转到单元格。

    选择所有单元格时 F键盘快捷键打开 查找和替换 界面 我可以在其中查看搜索表达式的所有单元格 并可能替换该表达式 但是我还没有找到进入这些牢房的方法 这是特别有问题的 因为我的浏览器在使用 折叠标题 扩展时没有检测到这些单元格 查找和替换界
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • library_private_types_in_public_api 和 StatefulWidget

    将 linter 升级到新版本后 flutter lints 2 0 1 在我的 pubspec 中 linter 启用此规则 公共 API 中的库私有类型 https dart dev tools linter rules library
  • 查找文本的确切边界

    我需要知道一段文本的确切边界 相当于获取文本边界 https developer android com reference android graphics Paint html对于安卓 我意识到这在某种程度上与 Flutter 的设计背
  • 不接受某些 Android 许可证。要解决此问题,请运行: flutter doctor --android-licenses

    我正在使用Linux 当尝试在终端中运行以下命令时 flutter doctor android licenses 它向我显示以下错误 颤振 找不到命令 运行命令whereis flutter 如果这没有给你路径 输出 那么你没有正确设置颤
  • dart json.encode(data) 不能接受其他语言

    我目前正在使用 Dart 进行 Web 开发 使用mockclient实现服务 但是 出现以下错误 下面的实现代码是一个继承mockClient的内存web api服务 调用client send 并返回结果的代码 test value是j
  • Flutter基于Shared Preference设置启动页面

    我一直在尝试根据我的共享首选项设置加载不同的页面 但没有成功 根据 stackoverflow 中找到的几篇文章 我最终得到了以下解决方案 import dart async import package flutter material
  • 如何在没有 firebase 的情况下在 flutter 中显示推送通知?

    在我的 flutter 应用程序中 我必须在没有 firebase 的情况下显示推送通知 我的服务器会在点击特定 API 后向我发送一条消息 并且我希望将该消息显示为推送通知 你能告诉我一种方法如何在颤振中做到这一点吗 您可以使用本地通知插
  • 如何仅添加一个BottomNavigationBarItem

    我有一个 BottomNavigationBar 我只需要在其中添加一个集中按钮 但我收到此错误 package flutter src material bottom navigation bar dart 断言失败 第 191 行 po
  • Sliver Appbar [折叠工具栏] 在 Flutter 中从左到中心动画标题

    这是我的折叠工具栏的构建方法 override Widget build BuildContext context return SafeArea child CustomScrollView controller controller s
  • 使用 Riverpod 处理身份验证

    我正在尝试获取 Riverpod 但遇到了一些问题 我创建了一个用于登录用户的表单 并且尝试在用户登录时更改主视图 我的问题是 当我设置更改状态并导航回应用程序根目录时 新状态似乎不可用 但是 如果我保存文件或热重新加载应用程序 则新状态可
  • Flutter - 如何将用户数据传递到所有视图

    我是 Flutter 世界和移动应用程序开发的新手 并且正在努力解决如何在整个应用程序中传递用户数据的问题 我已经尝试了几件事 但似乎没有一个很好 我确信我应该遵循一些最佳实践模式 因为它使示例更容易 所以我使用 firebase 进行身份
  • 如何在 Flutter 的 widget 树中打开新的 MaterialPageRoute 作为子项

    在下面的示例中 当我推送新的 MaterialPageRoute 时 它 会在与 Flutter 小部件树中的 Home 小部件相同的级别上创建 我希望将它作为小部件 Home 的子部件 因此 Home 将是 Child 小部件的父部件 这
  • get.put 和 get.lazyput 之间的区别

    我是新来的Getx的依赖注入 有人可以向我解释一下它的好处吗 Get put and Get lazyPut 并告诉我它们有什么区别 简短回答 Get put 会放立即地 Get lazyPut 会放在什么时候你需要它
  • 识别 2D 列表是否包含 Dart/Flutter 中的列表

    如何在不使用嵌套 for 循环的情况下识别 2D 列表是否包含另一个列表 我正在寻找类似的方法in在Python中 我尝试使用list contains x 但它似乎没有识别列表 List a 1 2 1 1 2 2 List b 1 2
  • 如何使用 jQuery 检测浏览器是否关闭

    我需要使用 jQuery 检测浏览器是否被关闭 如果是这样 则执行一个事件 我的网站上有一个聊天功能 很像 Facebook 可以让用户在导航到网站结构中的其他页面时保持登录状态 但如果他们单击 则需要将他们从聊天中注销 这样他们就不会在线

随机推荐

  • 在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 或