问题标签 [flutter-streambuilder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
65 浏览

android - Flutter StreamProvider 无法更新 Widget 状态。我该如何解决这个问题?

我正在使用 StreamProvider 来捕获 Firestore 中发生的更改并将它们显示在用户主页上。当用户最初登录或注册时,他们会被定向到这个主页并希望看到他们的详细信息,为此我使用了 StreamProvider。

请记住,获取的第一个值将为空,我添加了一个加载文本小部件。但是,除非我热刷新页面并且有状态的小部件再次重建,否则小部件似乎不会改变。似乎正在发生的事情是,我作为主页使用的有状态小部件仅“构建”一次,因此即使流填充了非空值,加载小部件也不会消失,因为它的父小部件没有t得到重建。

这是我用来包装我的 StreamProvider 的基本 HomeScreen 小部件。

这是 HomeBody 小部件的相关片段

我还注意到,我用于调试的打印语句仅在打印那些初始空值时才会执行,直到我热刷新页面并显示非空值。

有没有办法解决这个问题?我已经被困了几天,没有取得任何重大进展,任何形式的指导都将不胜感激。

0 投票
1 回答
286 浏览

flutter - Flutter + Firestore 聊天.. Listview 重建所有项目

我正在尝试使用颤振和 Firestore 向我的应用程序添加聊天功能(类似于 WhatsApp 功能)。Firestore 的主要结构是有 2 个集合(我也想要未读消息计数):

  1. users:每个用户都有一个包含所有 CHATS_ID 的子集合“chats”。这将是通过获取用户聊天列表来构建主页聊天页面(显示所有聊天的历史列表)的主要位置。
  2. 聊天:所有聊天的列表,每个聊天文档都有一个消息子集合。

我的主要问题是构建主页(应显示所有用户以前聊天的列表)。我获取/订阅用户聊天子集合,并且对于其中列出的每个聊天 ID,我还订阅聊天集合中的聊天本身(使用 ID)。

以下是它的原则截图:

用户集合:

在此处输入图像描述

聊天收藏:

在此处输入图像描述

这是感兴趣的主屏幕(whatsapp 屏幕的原理): 在此处输入图像描述

我正在做的是检索用户的聊天子集合(并使用 StreamBuilder 为其注册一个监听器),以及未读消息/最后一条消息和最后一条消息时间的数量,我订阅以收听这些聊天中的每一个(并希望使用每个用户的最后一条消息时间、状态和他在该聊天文档中的最后一次出现来计算未读计数)。

问题是 Listview.builder 重建所有项目(最初和滚动时),而不仅仅是查看的项目。这是我的代码:

经过搜索,我找到了这些相关的建议(但都没有工作):

  1. 一个 github 问题表明该流是可重新排序的(github:[https://github.com/flutter/flutter/issues/58917]),但即使将 ListView.custom 与委托和 findChildIndexCallback 一起使用,同样的问题仍然存在。
  2. 使用不同的。

但是删除内部流构建器并仅在没有订阅的情况下返回图块,使 ListView.builder 按预期工作(仅构建查看的图块)。所以我的问题是:

  1. 为什么有嵌套的流构建器会导致所有项目都被重新构建。
  2. 是否有更好的结构来实现上述功能(所有聊天都具有未读计数和实时最后一条消息/时间)。特别是我还没有添加延迟加载。而且使用这种设计,我必须为每条消息更新多个文档(在聊天集合和每个用户的子集合中)。

您的帮助将不胜感激(我已经检查了一些其他 SO 线程和中型文章,但找不到将这些功能结合在一个地方的文章,最好是使用 Firestore 和 Flutter 为可扩展性/价格优化设计)。

0 投票
3 回答
96 浏览

firebase - 使用 StreamBuilder 时如何将 serverTimestamp 转换为 String

我想要的是

根据服务器时间戳订购 ListView

我的代码

添加到 Firestore 集合:

从 Firestore 获取数据并根据服务器时间戳对它们进行排序

预期行为

列表视图根据服务器时间戳排序显示

我得到了什么

这个错误:

需要一个“字符串”类型的值,但得到一个“时间戳”类型的值

我试过的

我尝试toString()在将数据发送到 firestore: 时添加:'timestamp': FieldValue.serverTimestamp().toString()但后来 firestore 上的数据没有存储时间戳,而是存储了FieldValue(Instance of 'FieldValueWeb').

我知道当我从 firestore 获取数据时,我可能必须将它们转换为 String,但我不知道该怎么做。我尝试在toString()将数据输入流时添加:

但随后它显示以下错误并且不会编译。

没有为“String”类型定义方法“snapshots”。

官方文档也没有说将它们转换为字符串。

如果有人知道如何解决这个问题,请帮助我,我真的被困在这里。


完整的 StreamBuilder 和 ListView 代码

0 投票
1 回答
66 浏览

flutter - 使用 Firebase 收听 Stream 与 StreamBuilder 的结果不同

我正在使用firebase,我有这个:

当我传递qs给 StreamBuilder 时,返回的快照可以执行snapshot.hasError.

但是,当我收听流时,不再识别 hasError、hasData ...之类的内容

我仍然可以做到event.docs并且我成功地获取了数据,但是我无法监听错误。难道我做错了什么?

0 投票
0 回答
31 浏览

flutter - 从实时数据库中获取更多数据

我正在尝试根据 StreamBuilder 返回的数据从 Firebase 实时数据库中获取其他数据。

}

函数 userData() 与 Firebase 实时数据库交互以获取数据,并且它能够成功地做到这一点,由正确的打印输出指示。

}

但是,在 StreamBuilder 小部件中它说

我是 StreamBuilder 的新手,如果有人能指导我如何解决这个问题,我将不胜感激。谢谢

0 投票
1 回答
126 浏览

flutter - 无法使用 Stream Flutter 再次加载数据

当应用程序启动时,我正在使用流数据从 API 加载数据。但是它有一个问题,当它加载 SearchPage 小部件时,快照有数据,但是当我切换到其他屏幕并返回 SearchPage 小部件时,它丢失了所有数据.

我调用流数据时的代码:

应用程序启动时 在此处输入图像描述

当我去其他屏幕并卷土重来时 在此处输入图像描述

0 投票
1 回答
302 浏览

flutter - 如何在颤动中生成流

我正在用颤振流做一些实验。我有一个生成流的类int。这是课程:

我希望随着 的变化_counterwatchCounter()将产生更新的counter值。当我调用increment()decrement()从 UI 调用时,它的值似乎_counter正在改变,但watchCounter不会产生更新的_counter值。如何在_counter这里产生更新的价值?我正在使用StreamBuilderUI 来获取流数据。

0 投票
1 回答
458 浏览

dart - 迁移到空安全版本 Provider 5.0.0 后对 Stream Provider 的更改

我已迁移到 dart null 安全版本。迁移功能中的命令修复了大多数问题。但是,我有一个使用 Firebase 处理用户会话的流提供程序。迁移到 Provider 版本 5.0.0 后,应用程序崩溃。下面是我的主要课程。

该应用程序崩溃,但出现以下异常

在构建 Authenticate(dirty) 时引发了以下 ProviderNotFoundException:错误:在此 Authenticate Widget 上方找不到正确的 Provider

发生这种情况是因为您使用了BuildContext不包括您选择的提供者的 。有几种常见的场景:

  • 您在您的中添加了一个新的提供程序main.dart并执行了热重载。要修复,请执行热重启。

  • 您尝试读取的提供程序位于不同的路径中。

    提供者是“范围的”。因此,如果您在路由中插入提供程序,那么其他路由将无法访问该提供程序。

  • 您使用的BuildContext是您尝试读取的提供程序的祖先。

    确保 Authenticate 在您的 MultiProvider/Provider 下。这通常发生在您创建提供程序并尝试立即读取它时。

0 投票
1 回答
69 浏览

firebase - Flutter & firebase - StreamBuilder 未加载

我的代码运行良好。我添加isEqualTo后,该应用程序就会继续加载和加载。

我猜也许我必须对 FirebaseFirestore 中的 RULES 做一些事情。不过不确定。而且我对规则一无所知。

0 投票
1 回答
42 浏览

flutter - 对流有什么不好的用途?

在 Flutter 中使用流有什么不应该做的事情吗?例如,您应该使用或收听的流的最大数量是多少?或者每次更新值时使用多个 StreamBuilder 还是只做一个 setState 更好?