【问题标题】:Get a concatenated list of items from multiple documents in flutter / firebase从flutter / firebase中的多个文档中获取项目的串联列表
【发布时间】: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


    【解决方案1】:

    我认为下面这行是错误的:

    questions = questions..addAll(quizdata.questions.toList());

    每个Dart/Flutter documentation addAll 函数是一个所谓的void 函数。这意味着它只完成工作,之后不返回任何内容。

    questions..addAll() 将 quizdata 添加到问题列表中并且不返回任何内容 (null)。通过调用questions = questions..addAll(),您实际上会用null 覆盖您的问题列表。

    替换

    questions = questions..addAll(quizdata.questions.toList());

    使用以下行来解决此问题:

    questions.addAll(quizdata.questions.toList());

    整个函数应该如下所示:

    _getQuestions2(String quizId) async {
      Future quizData = Document<Quiz>(path: 'quizzes/$quizId').getData();
      quizData.then((quizdata) {
        questions.addAll(quizdata.questions.toList());
      });
    }
    

    【讨论】:

      【解决方案2】:

      这就是最终为我工作的原因。

      我认为在一个异步函数中进行多个火石查询比尝试通过多个函数更容易。

       Future<List<Question>> getQuestions() async {
          var firestore = Firestore.instance;
          var topicsSnap = await firestore.collection('topics').getDocuments();
          var quizzes =
              (topicsSnap.documents.map((topic) => topic.data['quizzes'])).toList();
          var quizids = quizzes.map((quizitem) => quizitem[0]['id']).toList();
          var questions = [];
          for (int i = 0; i < quizids.length; i++) {
            var quizid = quizids[i];
            var quizsnap = await firestore.document('quizzes/$quizid').get();
            var quizQuestions = quizsnap.data['questions'];
            questions.addAll(quizQuestions);
          }
          var question2 = questions.map((v) => Question.fromMap(v)).toList();
          return (question2);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 2021-01-06
        • 2020-08-10
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        相关资源
        最近更新 更多