我的firestore数据库中有两个集合,它的结构是
Collection1 - movies
-movieTitle : String
-movieYear : String
-movieDirector : DocumentReference
.
.
etc
Collection2 - directors
-dirName: String
-dirImage: String
.
.
etc
我想在movieTitle
中显示dirName
和ListTile
。
这是我尝试这样做的方式
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class TestPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _TestPageState();
}
}
class _TestPageState extends State<TestPage> {
DocumentSnapshot document;
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('movies').snapshots(),
builder:
(BuildContext context, AsyncSnapshot<QuerySnapshot> movieSnapshot) {
if (!movieSnapshot.hasData) return const Text('Loading...');
final int messageCount = movieSnapshot.data.documents.length;
return ListView.builder(
itemCount: messageCount,
itemBuilder: (_, int index) {
document = movieSnapshot.data.documents[index];
return ListTile(
title: Text(document['movieTitle'] ?? 'title not retrieved'),
subtitle: Text(getValue(document["movieDirector"]) ??
'director not retrieved'),
);
},
);
},
),
);
}
String getValue(DocumentReference documentReference) {
String val;
documentReference.get().then((onData) {
val = onData.data["directorName"];
print(val);
});
return val;
}
}
最后,我无法在屏幕上获取该值。我应该在实施中进行哪些更改?
答案 0 :(得分:0)
您需要了解Future和async / await,以便可以轻松编写此类代码。
这里的问题是getValue
必须立即返回,但是它要求的directorName
在将来的某个时候到达。因此,您根本无法立即获得它。
将FutureBuilder
赋予subtitle:
是您可以采取的选择之一。
此外,您应该考虑缓存stream
(如果将来按照我的建议实施,则应该缓存),这样就不会发出不需要的请求。在这里,我尝试在我的演示文稿中进行解释:https://youtu.be/0gBsHLgCY6M?list=PL0bBHyAilexzBdvHookPcPZNMceciAaZf&t=1900