Firebase 如何在映射函数中等待我的未来函数?(颤振)
所以,我在Flutter中构建我的应用程序,不幸的是,我最近遇到了一个错误。所以我想在TestProvider类中做的是从firestore获取数据(getQuestionFromFirebase()函数正在做什么),然后,我想从DocumentSnapshot创建一个映射(questionMapFromFirebase()函数正在做什么)。出现了一个错误,因为我不能在map函数中异步,所以我的函数不会等待前一个函数的结果,并返回null。有什么解决办法吗*我试图从getQuestionFromFirebase()-Future返回map,但后来我无法使用它的值,因为我的函数需要纯mapFirebase 如何在映射函数中等待我的未来函数?(颤振),firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,所以,我在Flutter中构建我的应用程序,不幸的是,我最近遇到了一个错误。所以我想在TestProvider类中做的是从firestore获取数据(getQuestionFromFirebase()函数正在做什么),然后,我想从DocumentSnapshot创建一个映射(questionMapFromFirebase()函数正在做什么)。出现了一个错误,因为我不能在map函数中异步,所以我的函数不会等待前一个函数的结果,并返回null。有什么解决办法吗*我试图从getQuestionFrom
class TestProvider {
FirebaseFirestore _firestore = FirebaseFirestore.instance;
Future<DocumentSnapshot> getQuestionFromFirebase(String documentId) async {
return await _firestore.collection('questions').doc(documentId).get();
}
Map questionMapFromFirebase(String documentId) {
Map questionMapFromFirebase;
getQuestionFromFirebase(documentId).then((DocumentSnapshot carSnapshot) => {
questionMapFromFirebase = carSnapshot.data(),
});
return questionMapFromFirebase;
}
}
还有其他建议吗?我该怎么办
Future<Map> questionMapFromFirebase(String documentId) async {
DocumentSnapshot ds = await getQuestionFromFirebase(documentId);
return ds.data();
}
您的\u loadQuestions
功能如下
_loadQuestions() async {
List<int> range = numberInRange(amountOfQuestions);
List<Question> listOfQuestions = [];
for (int i = 1; i <= amountOfQuestions; i++) {
listOfQuestions.add(Question.fromMap(
await _testProvider.questionMapFromFirebase(range[1].toString())));
}
return listOfQuestions; //you can get this list in **snapshot.data** of future builder
}
\u loadQuestions()异步{
列表范围=numberRange(amountOquestions);
问题列表=[];
对于(int i=1;我喜欢我在*中所说的,它必须是一个纯映射,因为稍后我会得到:参数类型“Future”不能分配给参数类型“map”。
error您将在哪里使用这个纯映射?有很多方法可以获得实际结果,而不是包装到Future中。我扩展了我的问题。l将显示istOfQuestions?是此列表将被使用
class TestProvider {
FirebaseFirestore _firestore = FirebaseFirestore.instance;
Future<DocumentSnapshot> getQuestionFromFirebase(String documentId) async {
return await _firestore.collection('questions').doc(documentId).get();
}
Future<Map> questionMapFromFirebase(String documentId) async {
DocumentSnapshot ds = await getQuestionFromFirebase(documentId);
return ds.data();
}
}
class TestRepository {
final int amountOfQuestions;
TestRepository({
@required this.amountOfQuestions,
});
TestProvider _testProvider;
Future listOfQuestions() async {
List<int> range = numberInRange(amountOfQuestions);
List<Question> listOfQuestions;
for (int i = 1; i <= amountOfQuestions; i++) {
listOfQuestions.add(Question.fromMap(
await _testProvider.questionMapFromFirebase(range[i].toString())));
}
return listOfQuestions;
}
}
E/flutter (13348): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method 'questionMapFromFirebase' was called on null.
E/flutter (13348): Receiver: null
E/flutter (13348): Tried calling: questionMapFromFirebase("2")
Future<Map> questionMapFromFirebase(String documentId) async {
DocumentSnapshot ds = await getQuestionFromFirebase(documentId);
return ds.data();
}
return FutureBuilder(
future: _loadQuestions(),
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.done){
return widgetForListing(snapshot.data);
}
return Center(child: Text('Loading...'));
},
);
_loadQuestions() async {
List<int> range = numberInRange(amountOfQuestions);
List<Question> listOfQuestions = [];
for (int i = 1; i <= amountOfQuestions; i++) {
listOfQuestions.add(Question.fromMap(
await _testProvider.questionMapFromFirebase(range[1].toString())));
}
return listOfQuestions; //you can get this list in **snapshot.data** of future builder
}