![](/img/trans.png)
[英]Listen to two collections in firestore database from flutter
[英]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.