问题标签 [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.
android - Flutter StreamProvider 无法更新 Widget 状态。我该如何解决这个问题?
我正在使用 StreamProvider 来捕获 Firestore 中发生的更改并将它们显示在用户主页上。当用户最初登录或注册时,他们会被定向到这个主页并希望看到他们的详细信息,为此我使用了 StreamProvider。
请记住,获取的第一个值将为空,我添加了一个加载文本小部件。但是,除非我热刷新页面并且有状态的小部件再次重建,否则小部件似乎不会改变。似乎正在发生的事情是,我作为主页使用的有状态小部件仅“构建”一次,因此即使流填充了非空值,加载小部件也不会消失,因为它的父小部件没有t得到重建。
这是我用来包装我的 StreamProvider 的基本 HomeScreen 小部件。
这是 HomeBody 小部件的相关片段
我还注意到,我用于调试的打印语句仅在打印那些初始空值时才会执行,直到我热刷新页面并显示非空值。
有没有办法解决这个问题?我已经被困了几天,没有取得任何重大进展,任何形式的指导都将不胜感激。
flutter - Flutter + Firestore 聊天.. Listview 重建所有项目
我正在尝试使用颤振和 Firestore 向我的应用程序添加聊天功能(类似于 WhatsApp 功能)。Firestore 的主要结构是有 2 个集合(我也想要未读消息计数):
- users:每个用户都有一个包含所有 CHATS_ID 的子集合“chats”。这将是通过获取用户聊天列表来构建主页聊天页面(显示所有聊天的历史列表)的主要位置。
- 聊天:所有聊天的列表,每个聊天文档都有一个消息子集合。
我的主要问题是构建主页(应显示所有用户以前聊天的列表)。我获取/订阅用户聊天子集合,并且对于其中列出的每个聊天 ID,我还订阅聊天集合中的聊天本身(使用 ID)。
以下是它的原则截图:
用户集合:
聊天收藏:
我正在做的是检索用户的聊天子集合(并使用 StreamBuilder 为其注册一个监听器),以及未读消息/最后一条消息和最后一条消息时间的数量,我订阅以收听这些聊天中的每一个(并希望使用每个用户的最后一条消息时间、状态和他在该聊天文档中的最后一次出现来计算未读计数)。
问题是 Listview.builder 重建所有项目(最初和滚动时),而不仅仅是查看的项目。这是我的代码:
经过搜索,我找到了这些相关的建议(但都没有工作):
- 一个 github 问题表明该流是可重新排序的(github:[https://github.com/flutter/flutter/issues/58917]),但即使将 ListView.custom 与委托和 findChildIndexCallback 一起使用,同样的问题仍然存在。
- 使用不同的。
但是删除内部流构建器并仅在没有订阅的情况下返回图块,使 ListView.builder 按预期工作(仅构建查看的图块)。所以我的问题是:
- 为什么有嵌套的流构建器会导致所有项目都被重新构建。
- 是否有更好的结构来实现上述功能(所有聊天都具有未读计数和实时最后一条消息/时间)。特别是我还没有添加延迟加载。而且使用这种设计,我必须为每条消息更新多个文档(在聊天集合和每个用户的子集合中)。
您的帮助将不胜感激(我已经检查了一些其他 SO 线程和中型文章,但找不到将这些功能结合在一个地方的文章,最好是使用 Firestore 和 Flutter 为可扩展性/价格优化设计)。
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 代码
flutter - 使用 Firebase 收听 Stream 与 StreamBuilder 的结果不同
我正在使用firebase,我有这个:
当我传递qs
给 StreamBuilder 时,返回的快照可以执行snapshot.hasError
.
但是,当我收听流时,不再识别 hasError、hasData ...之类的内容
我仍然可以做到event.docs
并且我成功地获取了数据,但是我无法监听错误。难道我做错了什么?
flutter - 从实时数据库中获取更多数据
我正在尝试根据 StreamBuilder 返回的数据从 Firebase 实时数据库中获取其他数据。
}
函数 userData() 与 Firebase 实时数据库交互以获取数据,并且它能够成功地做到这一点,由正确的打印输出指示。
}
但是,在 StreamBuilder 小部件中它说
我是 StreamBuilder 的新手,如果有人能指导我如何解决这个问题,我将不胜感激。谢谢
flutter - 如何在颤动中生成流
我正在用颤振流做一些实验。我有一个生成流的类int
。这是课程:
我希望随着 的变化_counter
,watchCounter()
将产生更新的counter
值。当我调用increment()
或decrement()
从 UI 调用时,它的值似乎_counter
正在改变,但watchCounter
不会产生更新的_counter
值。如何在_counter
这里产生更新的价值?我正在使用StreamBuilder
UI 来获取流数据。
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 下。这通常发生在您创建提供程序并尝试立即读取它时。
firebase - Flutter & firebase - StreamBuilder 未加载
我的代码运行良好。我添加isEqualTo
后,该应用程序就会继续加载和加载。
我猜也许我必须对 FirebaseFirestore 中的 RULES 做一些事情。不过不确定。而且我对规则一无所知。
flutter - 对流有什么不好的用途?
在 Flutter 中使用流有什么不应该做的事情吗?例如,您应该使用或收听的流的最大数量是多少?或者每次更新值时使用多个 StreamBuilder 还是只做一个 setState 更好?