StreamBuilder 子更新在导航后不呈现

2024-03-15

我正在使用扑动StreamBuilder决定向用户显示哪个“根”页面。现在基本上有2种可能性——LoginPage or HomePage。我的应用程序的主要构建方法如下所示:

  Widget build(BuildContext context) => StreamProvider.value(
      initialData: CurrentUser.initial,
      value: AuthService().user,
      child: Consumer<CurrentUser>(
          builder: (context, currentUser, _) => MaterialApp(
              home: currentUser.isInitialValue
                  ? Scaffold(
                      body: Center(
                        child: CircularProgressIndicator(),
                      ),
                    )
                  : currentUser.user != null
                      ? MultiProvider(providers: [
                          Provider<User>.value(value: currentUser.user),
                          // NOTE: Any other user-bound providers here can be added here
                        ], child: HomePage())
                      : LoginPage())));

登录页面的相关部分是它为您提供了两个选项:

  1. “您是新用户吗” - 注册
  2. “你回来了吗” - 登录

当您单击其中一个按钮时,您可以通过导航器以某种模式转到表单:

Navigator.push(
                                context,
                                CupertinoPageRoute(
                                  builder: (context) => LoginPage(
                                    mode: LoginPageMode.signUp,
                                  ),
                                ))

成功登录或注册后,流将更新并且HomePage呈现。我知道这一点是因为我在构建方法中有一个打印语句("Building HomePage"):

class HomePage extends StatelessWidget {
  const HomePage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print('Building HomePage');
    return Scaffold(
        body: Container(
      alignment: Alignment.center,
      child: Text('HOME'),
    ));
  }
}

然而,屏幕实际上并没有改变。屏幕仍处于登录页面。我认为我管理流很好,因为如果我不这样做,渲染方法将永远不会被击中。我看到一个类似的问题here https://stackoverflow.com/questions/63338282/stream-builder-is-not-updating-after-navigation但他们似乎没有正确管理流。我怎样才能看到渲染方法命中,但屏幕保持不变?我使用 Flutter 已经有一段时间了,但以前从未见过这种情况。

我认为这与导航有关,因为如果我删除用户选择“登录”或“注册”的步骤,然后将它们发送到登录页面,问题就会消失。就像HomePage正在导航到的页面下构建。


1. 说明

这种行为的原因是您使用 root Navigator 推送LoginPage应用程序根级别上的路由。这是小部件树,显示了推送后小部件的关系:

App
  |
  |-- StreamBuilder
  |      |--LoginPage()
  |
  |-- LoginPage(mode: LoginPageMode.signUp)

因此,当您的 StreamBuilder 更改数据时,树会变成这样:

App
  |
  |-- StreamBuilder
  |      |--HomePage()    // <--- CHANGED
  |
  |-- LoginPage(mode: LoginPageMode.signUp)

这就是为什么你仍然看到LoginPage同时HomePage也渲染了。HomePage只是放在“下面”LoginPage.

2. 解决方案

解决方案是使用嵌套导航器:


Widget build(BuildContext context) => StreamProvider.value(
      initialData: CurrentUser.initial,
      value: AuthService().user,
      child: Consumer<CurrentUser>(
          builder: (context, currentUser, _) => MaterialApp(
              home: currentUser.isInitialValue
                  ? Scaffold(
                      body: Center(
                        child: CircularProgressIndicator(),
                      ),
                    )
                  : currentUser.user != null
                      ? MultiProvider(providers: [
                          Provider<User>.value(value: currentUser.user),
                          // NOTE: Any other user-bound providers here can be added here
                        ], child: HomePage())
                      : Navigator(                //  <--- HERE
                          onGenerateRoute: (settings) {
                            return CupertinoPageRoute(
                              builder: (context) => LoginPage(),
                            );
                          },
                        )));

...

在这种情况下,当你打电话时Navigator.push(context, ...) inside LoginPage你的小部件树将如下所示:

App
  |
  |-- StreamBuilder
         |-- Navigator()
              |-- LoginPage()
              |-- LoginPage(mode: LoginPageMode.signUp)

请尝试这个方法,它应该有效。

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

StreamBuilder 子更新在导航后不呈现 的相关文章

随机推荐

  • 我可以使用 css-grid 按从左到右的阅读顺序显示两行未知数量的项目吗?

    我想按从左到右的顺序显示多个 div 为它们提供相同的空间并将它们分布在两行中 e g 第 1 部分 第 2 部分 第 3 部分 第 4 部分 第 5 部分 第 6 部分 or 第 1 部分 第 2 部分 第 3 部分 第四部分 第 5 部
  • Neo4j 查询中“开始流式传输”和“已完成”有什么区别?

    在 Neo4j 浏览器中 当我分析查询时 我得到 在 129 毫秒后开始流式传输 162063 条记录 并在 13793 毫秒后完成 是否在 129 毫秒后就全部收集到了结果 但将它们输出到浏览器却花了 13793 毫秒 另外 当我在 Cy
  • 如何在 Zend Framework 中的 URL 开头添加变量?

    我正在尝试在这里创建网址 例如 admin login moderator login 这两个请求都将由相同的控制器提供服务并执行登录操作 即 account login
  • 系统空闲检测

    我想检测系统是否空闲 即 用户没有使用系统 我希望它像 Windows Live Messenger 一样 当我离开计算机大约 3 分钟时 它会自动更改为离开 我想在代码中设置这个时间 我正在使用 Visual Studio 2008 和
  • 如何使用 Git 分支支持覆盖 TeamCity 7.1 中的 分支名称?

    我有一个 CI 构建 从 Github 拉取功能分支 并使用基于项目 分支和构建号的文件夹命名约定将它们构建 打包到本地文件夹中 对于命名分支 feature1 feature2 这非常有效 问题是 当我向 master 提交时 TeamC
  • Safari (iPad) 中的弹性项目重叠

    我无法通过简单的任务解决问题 容器宽度为 100 但有 padding right 和 box sizing 溢出 容器是弹性行 容器有两个具有动态内容的子容器 第一个孩子有内容的大小 第二个孩子占据剩余的宽度 预期结果 iPad 结果 例
  • 我如何调试 Hadoop MapReduce [重复]

    这个问题在这里已经有答案了 我正在尝试构建一个地图缩减作业 它运行完成 但最后呈现奇怪的数据 当我尝试使用 system out println debug data 调试它时 它没有显示在屏幕上 使用 java API 生成外部日志文件
  • 标准容器的复杂性保证有哪些?

    显然 标准容器提供了某种形式的保证 有哪些类型的保证以及不同类型集装箱之间的具体区别是什么 工作自SGI页面 http www sgi com tech stl about STL http en wikipedia org wiki St
  • Android 在应用程序被杀死时重新安排 Alarmmanager 警报

    我开发了一个应用程序来安排多个本地通知以提醒用户做某事 今年的每个月都应该发出通知 这些本地通知是使用 AlarmManager 安排的 在 BroadcastReceiver 的 OnRetrieve 中创建并引发通知 它一切正常 直到应
  • 避免 Angular CLI 中的相对路径

    我正在使用最新的 Angular CLI 并且创建了一个自定义组件文件夹 它是所有组件的集合 例如 TextInputComponent has a TextInputConfiguration放置在里面的类src components c
  • 在 Windows 中对二进制文件进行逆向工程的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 就我而言 它写成c c 如果这很重要的话 IDA 表现出色 IDA反汇编器 http www hex rays com idapro
  • 加密柱状转置密码

    我试图弄清楚如何在给定明文大写字符串和任意长度的数字密钥的情况下加密 Python 中的柱状转置密码 例如 如果键是 3124 并且字符串是 IHAVETWOCATS 它将像这样组织字符串 3124 IHAV ETWO CATS 然后先返回
  • 使用 aspnet_regiis 加密 web.config 部分会删除 system.webServer 元素

    我使用以下命令来加密 web config 中的自定义部分 C Windows Microsoft NET Framework64 v4 0 30319 aspnet regiis exe aspnet regiis exe pe Cust
  • 如何在shell脚本中操作数组

    我希望我的脚本定义一个空数组 如果预定义条件成立 则应添加数组值 为此我所做的是 declare a FILES file count 0 if file ext SUPPORTED FILE TYPE then echo file ext
  • 在控制台应用程序中获取 IP 地址

    我希望通过控制台应用程序找出我的 IP 地址 我习惯使用网络应用程序Request ServerVariables收集和 或Request UserHostAddress 如何在控制台应用程序中完成此操作 最简单的方法如下 using Sy
  • EF在运行时从Type获取记录列表

    目的 我需要循环所有记录 例如 var records db Set
  • 如何在 Rails 的功能测试中启用页面缓存?

    是否可以打开页面缓存进行功能测试 以下内容不起作用 class ArticlesControllerTest lt ActionController TestCase def setup ActionController Base publ
  • 是否可以获取对象的不可枚举继承属性名称?

    在 JavaScript 中 我们有几种获取对象属性的方法 具体取决于我们想要获取的内容 1 Object keys 它返回对象的所有自己的可枚举属性 即 ECMA5 方法 2 a for in循环 返回对象的所有可枚举属性 无论它们是自己
  • 你如何理解一大块代码?

    我是一名刚刚开始工作的应届大学毕业生 在我的起步阶段 我需要学习很多产品代码 有一些设计文档 但没有多大帮助 您能否提供一些通用技术来浏览和理解庞大的产品代码 特别是 C 运行它doxygen http www doxygen nl 这将生
  • StreamBuilder 子更新在导航后不呈现

    我正在使用扑动StreamBuilder决定向用户显示哪个 根 页面 现在基本上有2种可能性 LoginPage or HomePage 我的应用程序的主要构建方法如下所示 Widget build BuildContext context