Flutter测验应用如何从Firebase Realtime Database随机抽取20道题
Flutter + Firebase 测验应用随机抽题实现方案
现有逻辑已经完成全量题目的拉取,无需调整Firebase端的存储结构或查询规则,直接在客户端对拉取到的题目列表做随机处理即可。150道题的数据量极小,客户端处理无性能压力,是改动成本最低的实现方式。
具体修改步骤
- 引入Dart内置的随机数工具库
在当前文件的导入区域添加如下代码:
import 'dart:math';
- 修改
getData方法,实现打乱+截取逻辑
将原有getData方法替换为以下实现:
Future<List<Question>> getData() async { // 拉取全量题库 final allQuestions = await db.fetchQuestions(); // 传入随机种子打乱列表顺序 allQuestions.shuffle(Random()); // 固定抽取20道题,兼容题库总量不足20道的边界场景,避免数组越界 const int quizLength = 20; return allQuestions.length >= quizLength ? allQuestions.sublist(0, quizLength) : allQuestions; }
- 原有业务逻辑无需额外调整
现有代码中题目索引判断、总题数统计、计分、结果页跳转逻辑全部基于返回的题目列表长度动态计算,随机截取后的列表会自动适配原有逻辑,不需要做额外修改。
大规模题库可选方案
如果后续题库扩容到千道以上,不想每次拉取全量数据,可以提前给Firebase中每道题配置唯一的数字ID,每次启动测验时生成20个不重复的随机ID,按需查询对应题目即可。但该方案需要额外维护ID唯一性,且会增加查询次数,当前150道题的规模完全不需要采用。
注意:
shuffle方法仅修改内存中加载的题目列表顺序,不会改动Firebase端存储的题目原始顺序,每次启动应用都会重新拉取、重新打乱,可保证每次测验的题目组合、展示顺序都是随机的。
内容的提问来源于stack exchange,提问作者Great
相关产品推荐
相关产品推荐

