概述
我写了一个Flutter屏幕,展示他们保存的测验为各自的用户。我已经成功地检索了一个用户的测验参考列表,但我一直在检索参考列表中的测验数据不成功。
目标
最终,我希望在ListView.builder()
中显示检索到的数据,但是成功检索数据是主要目标。
Firestore设置
“User”集合中的每个文档代表应用程序的一个用户。用户有一个引用数组,指向他们创建的相应测验。“Quiz”集合中的每个文档代表一个单一测验。
当前编码
//main.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'temp.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MaterialApp(
title: "SCRUM",
home: GetUserName("eQxkFJZ7XOf73weUkjZzYQHCBw72"),
),
);
}
//temp.dart
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class GetUserName extends StatelessWidget {
final String documentId;
GetUserName(this.documentId);
@override
Widget build(BuildContext context) {
CollectionReference users = FirebaseFirestore.instance.collection('User');
return FutureBuilder<DocumentSnapshot>(
future: users.doc(documentId).get(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return Text("Something went wrong");
}
if (snapshot.hasData && !snapshot.data!.exists) {
return Text("Document does not exist");
}
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data =
snapshot.data!.data() as Map<String, dynamic>;
List<dynamic> quizRefs = data['Quizzes'];
return Text("My: ${data['Quizzes']} ");
}
return Text("loading");
},
);
}
}
1条答案
按热度按时间wooyq4lh1#
看起来
User
文档中的Quizzes
字段是一个文档引用数组。Firestore不会自动从引用的文档加载数据,因此当您加载User
文档时,其Quizzes
字段将显示为DocumentReference
值数组。要加载它们所引用的实际测验,您必须在每个测验上调用
get()
或snapshots()
,然后触发额外的加载/侦听测验数据本身。要在数组中显示它,您需要FutureBuilder
(当您使用get()
时)或StreamBuilder
(当您使用snapshots
时)。