【发布时间】:2020-03-29 00:27:29
【问题描述】:
我有一个 firebase 数据库,其中有一个名为“quizzes”的集合,其中每个测验都是一个包含多个问题的文档。
现在,我正在尝试从多个“测验”文档中创建一个问题列表,并将它们传递给 Flutter 中的页面浏览构建器。
但是,我在从多个文档中获取项目列表时遇到了麻烦。该代码一直有效,直到我可以从下面指出的各种主题中获取测验列表,但是当我尝试使用下面的两个函数获取项目列表时,最后我仍然得到一个空列表。
我是 Flutter 和异步编程的新手。任何帮助是极大的赞赏。
class PracticeScreen extends StatelessWidget {
List<Question> questions = [];
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (_) => QuizState2(),
child: FutureBuilder(
future: Global.topicsRef.getData(),
builder: (BuildContext context, AsyncSnapshot snap) {
var state = Provider.of<QuizState2>(context);
if (!snap.hasData || snap.hasError) {
return LoadingScreen();
} else {
List<Topic> topics = snap.data;
List<Quiz> quizzes =
topics.map((topic) => topic.quizzes).expand((x) => x).toList();
print(quizzes.length);
print(quizzes.map((quiz) => quiz.description).toList());
// the code works till this point where I get a list of quizzes from multiple topics
quizzes.map((quiz) => _getQuestions3(quiz.id));
// the questions array still remains empty at this point.
print(questions.map((question) => question.text).toList());
return Scaffold(
body: PageView.builder(
physics: NeverScrollableScrollPhysics(),
scrollDirection: Axis.vertical,
controller: state.controller,
onPageChanged: (int idx) =>
state.progress = (idx / (questions.length + 1)),
itemBuilder: (BuildContext context, int idx) {
//return Text('Sample');
return QuestionPage2(question: questions[idx]);
},
itemCount: questions.length - 1,
),
bottomNavigationBar: AppBottomNav(),
);
}
},
),
);
}
_getQuestions2(String quizId) async {
Future quizData = Document<Quiz>(path: 'quizzes/$quizId').getData();
quizData.then((quizdata) {
questions = questions..addAll(quizdata.questions.toList());
});
}
_getQuestions3(String quizId) async {
await _getQuestions2(quizId);
}
}
}
【问题讨论】:
标签: firebase flutter google-cloud-firestore