StreamBuilder arrayContains和RangeError(索引):无效值:有效值范围为空:0

时间:2020-03-12 16:50:34

标签: arrays flutter dart google-cloud-firestore stream-builder

慢慢地将Flutter和Dart当作我的新爱好。您可以给予的任何建议或帮助,我们始终感激不尽!我正在尝试实现一个简单的朋友系统,您可以在其中搜索另一个用户并将其添加为朋友。

预期结果是:

  1. 已登录的用户转到朋友的个人资料,然后单击“添加朋友”按钮。
  2. Firestore有一个用户集合。在该集合中,每个用户的文档都有个人资料信息,包括数组“ friends”。单击“添加朋友”按钮会将已登录用户的UID添加到该第二个人的“朋友”数组中。
  3. 然后在“朋友”屏幕上,我使用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> 

注意:

  1. itemCount现在被硬编码为1。我只希望在测试时返回1位用户。一切正常后,我将在Firestore中填充更多用户。
  2. 当我将array包含诸如 .where('displayName',isEqualTo:'My Name')。snapshots(),之类的简单内容时,该应用程序可以正常工作
  3. user.uid已经过测试,并且确实包含预期的字符串
  4. 数组在Firestore中具有值(请参阅文章底部的链接)
  5. 我为“用户”中使用的值设置了索引

有人知道我该怎么办,并使用登录的用户UID检索具有friends数组的文档吗?

再次感谢您提供任何建议和帮助。 Screenshot of Cloud Firestore is here

2 个答案:

答案 0 :(得分:1)

我离开了项目两天,并在最后一个小时重建了应用程序。令我惊讶的是,'。where('friends',arrayContains:user.uid)'现在可以工作了!

应用启动后,我现在拥有一个与当前登录用户成为好友的所有用户的ListView。

整个系统如何工作:

  1. 每个用户的个人资料页面上是一个浮动操作按钮,按下该按钮时,会将当前登录用户的UID添加到该朋友文档中的“朋友”数组中。

  2. 使用StreamBuilder和ListView,当登录的用户随后转到其朋友页面时,他们会看到在其“朋友”数组中具有登录用户的UID的每个用户

答案 1 :(得分:0)

可能是从Firebase打印空数据的结果。

Stream<List<Model>> fetchStream({@required String userUID}) {
return nestsCollection
    .where("participants", arrayContains: userUID)
    .snapshots()
    .map((snapshot) {
    // print(snapshot.docs[0].data()['nestName']);
  return snapshot.docs
      .map((document) => Model.fromFirestore(document))
      .toList();
 });
}