簡體   English   中英

Flutter - 可以從兩個 collections 創建一個 stream 嗎?

[英]Flutter - Possible to create a stream from two collections?

在我的 flutter 應用程序中,我嘗試使用 stream 顯示用戶保存的帖子。我需要從名為 postings 的集合中獲取 ID,並嘗試從另一個名為 users 的集合中名為 savedPostingIDs 的數組中匹配它。 我在整個應用程序中都有流,但我無法弄清楚這一點,因為我試圖從兩個不同的 collections 獲取信息。

我在頁面上的 stream 的示例是:

      _stream = Firestore.instance
          .collection('postings')
          .where('type', isEqualTo: 'Arts & Culture')
          .snapshots();
    }
  }

上面的 stream 將從我在應用程序上的一個 cartain 類別中獲取信息。 我已經嘗試了上面代碼的不同變體,但沒有成功。 這是我的第一個 flutter 應用程序,第一次使用 firebase,因此非常感謝任何幫助和建議。 先感謝您。

這是一張顯示我試圖獲取的信息的圖像。

我相信您可以使用RxDart package 中的flatMap運算符或combineLatest2運算符來實現您想要的結果。

下面的代碼示例找到類型等於“藝術與文化”的帖子,然后將該帖子轉換為用戶列表,其中保存的帖子 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”的用戶和類型等於“藝術與文化”的帖子合並為一個已保存的帖子 ID stream。

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();
        },
      ),
    );
  }
}

如果您在運行上述任一代碼示例時遇到任何問題,或者有任何疑問,請隨時告訴我,我很樂意提供幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM