【发布时间】:2020-06-24 18:24:09
【问题描述】:
慢慢掌握 Flutter 和 Dart 作为我的新爱好。您可以提供的任何建议或帮助将不胜感激!我正在尝试实现一个简单的朋友系统,您可以在其中搜索另一个用户并将他们添加为朋友。
预期结果是:
- 已登录的用户转到朋友的个人资料并点击“添加朋友”按钮。
- Firestore 有一个用户集合。在该集合中是包含个人资料信息的每个用户的文档,包括数组“朋友”。点击“添加好友”按钮会将登录用户的 UID 添加到第二个人的“好友”数组中。
- 然后在 Friends 屏幕上,我使用 StreamBuilder 和 Listview.builder 将所有用户显示为卡片,这些用户的“好友”数组中有登录用户的 UID。
为此,我想在 StreamBuilder 的流中使用 .where('friends', arrayContains: 'user.uid'),仅在屏幕列表中显示这些用户卡.
这是我写的代码:
class friendsList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
return
StreamBuilder(
stream: Firestore.instance
.collection('users')
.where('friends', arrayContains: user.uid).snapshots(),
builder: (context, documents) {
if (documents.hasData) {
return
Container(
height: 180,
child:
ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: 1,
itemBuilder: (context, index) {
DocumentSnapshot friends = documents.data.documents[index];
但是,当我运行我的应用程序时,它显示错误:
`The following RangeError was thrown building:
RangeError (index): Invalid value: Valid value range is empty: 0
When the exception was thrown, this was the stack
List.[](dart:core-patch/growable_array.dart:149:60)
friendsList.build.<anonymous closure>.<anonymous closure>
注意事项:
- itemCount 现在被硬编码为 1。我只希望在测试时返回 1 个用户。一旦一切正常,我将在 Firestore 中填充更多用户。
- 当我将 arrayContains 换成 .where('displayName', isEqualTo: 'My Name').snapshots(), 之类的更简单的东西时,应用程序可以正常运行
- user.uid 已经过测试并且确实包含预期的字符串
- Firestore 中存在带有值的数组(请参阅帖子底部的链接)
- 我已经为我在“用户”中使用的值设置了一个索引
有谁知道我可以解决这个错误并检索包含登录用户 UID 的好友数组的文档?
再次感谢任何建议和帮助。 Screenshot of Cloud Firestore is here
【问题讨论】:
-
这么快的问题.. 您正在尝试通过查找以该用户为朋友的所有用户来检索当前用户的所有朋友?
-
这听起来很落后,但是是的。与 SQL 不同,Firestore 不支持 JOIN,因此我无法根据当前用户文档中的字段查找和显示用户文档。据我所知,最简单的解决方案是将您的 UID 存储在他们文档的数组中,这样您就可以查询并取回在他们的朋友数组中包含您的 UID 的任何文档。我遇到的问题是那个错误,这意味着朋友的数组中有 0 个文档具有我的 UID。但是,正如您从屏幕截图中看到的那样,我在朋友数组中确实有具有该值的文档。有什么想法吗?
-
ChiefMalone - 如果你必须实现一个好友系统,你会怎么做?欢迎任何建议。我仍在学习并乐于接受想法。
标签: arrays flutter dart google-cloud-firestore stream-builder