flutter - Flutter-可以从两个集合创建流吗?

标签 flutter dart google-cloud-firestore

在我的flutter应用程序中,我试图使用流显示用户保存的帖子。我需要从一个名为posts的集合中获取ID,然后尝试从另一个名为users的集合中的一个名为savedPostingIDs的数组中进行匹配。我在整个应用程序中都有视频流,但是由于我试图从两个不同的集合中获取信息,所以我无法弄清楚这一点。
我在页面上有一个流的示例为:

      _stream = Firestore.instance
          .collection('postings')
          .where('type', isEqualTo: 'Arts & Culture')
          .snapshots();
    }
  }
上面的信息流将从我在应用程序中拥有的游戏类别中获取信息。我尝试过上面代码的不同变体,但是没有运气。这是我的第一个Flutter应用程序,第一次使用Firebase,因此非常感谢您的帮助和建议!先感谢您。
Here is an image that will show the information I'm trying to get.

最佳答案

我相信您可以潜在地使用 flatMap 软件包中的 combineLatest2 运算符或 RxDart 运算符来实现所需的结果。
下面的代码示例查找类型等于“艺术与文化”的帖子,然后将该帖子转换为用户列表,其中已保存的帖子ID数组包含该帖子的ID。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder<QuerySnapshot>(
        stream: FirebaseFirestore.instance
            .collection('postings')
            .where(
              'type',
              isEqualTo: 'Arts & Culture',
            )
            .snapshots()
            .flatMap((value) => FirebaseFirestore.instance
                .collection('users')
                .where(
                  'savedPostingIDs',
                  arrayContains: value.docs.first.id,
                )
                .snapshots()),
        builder: (context, snapshot) {
          return snapshot.connectionState == ConnectionState.done
              ? ListView.builder(
                  itemBuilder: (context, index) => ListTile(
                    title: Text(snapshot.data.docs[index].id),
                  ),
                  itemCount: snapshot.data.docs.length,
                )
              : CircularProgressIndicator();
        },
      ),
    );
  }
}
下面的代码示例将ID等于“INSERT_USER_ID_HERE”的用户和类型等于“Arts&Culture”的发布合并为一个已保存的发布ID的流。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder<List<String>>(
        stream: Rx.combineLatest2<QuerySnapshot, QuerySnapshot, List<String>>(
          FirebaseFirestore.instance
              .collection('users')
              .where(
                'id',
                isEqualTo: 'INSERT_USER_ID_HERE',
              )
              .snapshots(),
          FirebaseFirestore.instance
              .collection('postings')
              .where(
                'type',
                isEqualTo: 'Arts & Culture',
              )
              .snapshots(),
          (a, b) {
            final user = a.docs.first.data();
            final posting = b.docs.first.data();

            return (user['savedPostingIDs'] as List<String>)
                .where((element) => element == posting['id'])
                .toList();
          },
        ),
        builder: (context, snapshot) {
          return snapshot.connectionState == ConnectionState.done
              ? ListView.builder(
                  itemBuilder: (context, index) => ListTile(
                    title: Text(snapshot.data[index]),
                  ),
                  itemCount: snapshot.data.length,
                )
              : CircularProgressIndicator();
        },
      ),
    );
  }
}
如果您在运行上述任一代码示例时遇到任何问题,或者有任何问题,请随时与我们联系,我们很乐意为您服务!

关于flutter - Flutter-可以从两个集合创建流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63654562/

相关文章:

flutter - Dart:意外文本 'late'

dart - 了解Dart语法

dart - Dart 语言中的笛卡尔积

dart - 如何在另一个小部件的子属性中传递小部件列表?

flutter - 如何在不重复读取量的情况下同时订阅整个集合和其中的文档?

dart - 如何使用 tabController 路由到新页面?

node.js - 创建文档时触发云函数时获取 "Object possibly undefined"

firebase - Firestore 规则 : condition check fails when data is number

java - 如何通过传递查询来删除 Firestore 文档?

android - Flutter SQFlite 一对多关系设置