Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 文档引用流未更新_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Flutter 文档引用流未更新

Flutter 文档引用流未更新,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我有一个名为“cars”的集合和一个“user”集合。 每个“用户”文档都包含一个汽车参考列表 我尝试了多种方法来获取用户在其文档中的所有“car”文档流 “我的车”-列表 我的问题是,当myCar列表更改时,StreamBuilder中的流没有更新 我当前的代码如下所述 我还尝试通过使用“where”操作符和带有cars文档id的数组查询“car”集合来获取所有“car”文档。这也行得通,但firestore只允许在“where”操作符中输入10个条目,这对我来说并不可行。一个用户的列表中可以

我有一个名为“cars”的集合和一个“user”集合。 每个“用户”文档都包含一个汽车参考列表

我尝试了多种方法来获取用户在其文档中的所有“car”文档流 “我的车”-列表

我的问题是,当myCar列表更改时,StreamBuilder中的流没有更新

我当前的代码如下所述

我还尝试通过使用“where”操作符和带有cars文档id的数组查询“car”集合来获取所有“car”文档。这也行得通,但firestore只允许在“where”操作符中输入10个条目,这对我来说并不可行。一个用户的列表中可以有10个以上的条目

我觉得我没有以正确的方式创建车流。 我的数据模型是否未按此场景的最佳实践进行设置,或者我是否缺少firestore中的查询功能

汽车收藏

{
    "docId": 123,
    "carName": "volvo",
    "rating": 6.3
}
{
    userId: "userIdField",
    myCars: [
        {
            "carDoc": 123,
            "favourite": true
        },
        {
            "carDoc": 124,
            "favourite": true
        },
        {
            "carDoc": 125,
            "favourite": false
        }
    ]    
}
用户集合

{
    "docId": 123,
    "carName": "volvo",
    "rating": 6.3
}
{
    userId: "userIdField",
    myCars: [
        {
            "carDoc": 123,
            "favourite": true
        },
        {
            "carDoc": 124,
            "favourite": true
        },
        {
            "carDoc": 125,
            "favourite": false
        }
    ]    
}
我有这个函数来获取用户流

Stream<User> fetchUser(String uid) {
    return FirebaseFirestore.instance.collection(USER_COLLECTION)
        .doc(uid)
        .get()
        .asStream()
        .map((event) {
            if (event.data().isNotEmpty) {
                var user = new User();
                user.userId = uid;
                user.carDocs = List.from((event.data()['carDoc'])
                    .map((e) => User(e['carDoc'] as DocumentReference, e['favourite'] as bool)));
                return user;
            } else {
                return null;
            }
        }
        );
}
Stream fetchUser(字符串uid){
返回FirebaseFirestore.instance.collection(用户\集合)
.doc(uid)
.get()
.asStream()
.map((事件){
if(event.data().isNotEmpty){
var user=新用户();
user.userId=uid;
user.carDocs=List.from((event.data()['carDoc']))
.map((e)=>用户(e['carDoc']作为文档参考,e['favorite']作为bool));
返回用户;
}否则{
返回null;
}
}
);
}
我像这样创建我的小部件

child: Container(
        child: StreamBuilder(
        stream: userService.fetchUser(user.uid),
        builder: (context, AsyncSnapshot<User> user) {
            if (!user.hasData) {
                return Text("meh");
            }

            return FutureBuilder(
                future: Future.wait(user.data.myCars.map((e) => e.carDoc.get()).toList()),
                builder: (context, AsyncSnapshot<List<DocumentSnapshot>> dss) {
                    if (!dss.hasData) {
                        return Text("next meh");
                    }
                    return ListView(
                        children: _build(dss.data.map((e) => createCarWidgtItem(e)).toList()),
                    );
                },
            );
        },
    ),
)
child:容器(
孩子:StreamBuilder(
流:userService.fetchUser(user.uid),
生成器:(上下文,异步快照用户){
如果(!user.hasData){
返回文本(“meh”);
}
回归未来建设者(
future:future.wait(user.data.myCars.map((e)=>e.carDoc.get()).toList()),
生成器:(上下文,异步快照dss){
如果(!dss.hasData){
返回文本(“下一个meh”);
}
返回列表视图(
子项:_build(dss.data.map((e)=>createCarWidgtItem(e)).toList(),
);
},
);
},
),
)

如果我省略了流和语言透视图,而将重点放在数据库结构上,希望您不会介意

当我看到它时,我认为NoSQL数据库是以关系/SQL的方式使用的。这意味着一个集合存储与其他集合的关系。在这种情况下,我认为PostgreSQL会更好,它也可以在云SQL中的GCP上使用

另一方面,也许最好将当前为数组的
myCars
字段(至少看起来是表单描述)更改为子集合,其中每个用户都将拥有完整的cars对象

我知道解决方案是多余的(这意味着许多用户可以在他们的收藏夹中拥有相同的汽车),但这是NoSQL数据库的想法。数据是冗余的,但您将所有数据都放在一个地方,而不必通过所有集合进行查询

在上述示例中的情况下,您不必构建复杂的查询来获取用户喜爱的汽车列表(请将其视为伪代码):


或者,您甚至可以在用户
myCars
集合中只存储喜爱的汽车,您可以省略
where
方法和
favorite
布尔字段。

问题是汽车文档一天更新几次。我不想更新所有用户的汽车数据列表。我一直在考虑使用好的老sql编写自己的后端。但是我想让firebase作为我唯一的后端。也许你可以使用一些数据结构的东西,例如,在每个汽车文档中添加以下用户的数组。而在查找用户喜爱的汽车时,可以使用包含特定用户ID的数组进行查询