Firebase 如何在映射函数中等待我的未来函数?(颤振)

Firebase 如何在映射函数中等待我的未来函数?(颤振),firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,所以,我在Flutter中构建我的应用程序,不幸的是,我最近遇到了一个错误。所以我想在TestProvider类中做的是从firestore获取数据(getQuestionFromFirebase()函数正在做什么),然后,我想从DocumentSnapshot创建一个映射(questionMapFromFirebase()函数正在做什么)。出现了一个错误,因为我不能在map函数中异步,所以我的函数不会等待前一个函数的结果,并返回null。有什么解决办法吗*我试图从getQuestionFrom

所以,我在Flutter中构建我的应用程序,不幸的是,我最近遇到了一个错误。所以我想在TestProvider类中做的是从firestore获取数据(getQuestionFromFirebase()函数正在做什么),然后,我想从DocumentSnapshot创建一个映射(questionMapFromFirebase()函数正在做什么)。出现了一个错误,因为我不能在map函数中异步,所以我的函数不会等待前一个函数的结果,并返回null。有什么解决办法吗*我试图从getQuestionFromFirebase()-Future返回map,但后来我无法使用它的值,因为我的函数需要纯map

 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
}