Flutter使用Sqflite时Future返回值调用map方法报错如何解决
报错原因
你调用的getQues()是异步方法,返回值为Future<List<Map>>类型,不是直接的列表实例,所以不存在map方法,必须先等待Future执行完成,拿到内部封装的列表数据后才能做映射转换。
修复方案
方案1:在异步函数中预加载数据
适合提前加载列表数据的场景,先将_questions声明为晚初始化变量,再通过异步方法等待数据库查询完成后做映射:
// 声明列表 late List<Question> _questions; Future<void> initQuestions() async { // 先await获取数据库返回的原始列表 final rawQuesList = await DbConn().getQues(); // 对真实列表做映射转换 _questions = rawQuesList.map( (question) => Question( id: question['id'], question: question['question'], options: question['options'], answer_index: question['answer_index'] ), ).toList(); }
在使用_questions前先调用initQuestions方法等待加载完成即可。
方案2:结合FutureBuilder在界面中直接处理
适合需要在Widget树中直接渲染列表的场景,无需提前声明变量:
@override Widget build(BuildContext context) { return FutureBuilder<List<Map>>( future: DbConn().getQues(), builder: (context, snapshot) { // 加载中展示占位符 if (snapshot.connectionState != ConnectionState.done) { return const CircularProgressIndicator(); } // 无数据展示提示 if (!snapshot.hasData || snapshot.data!.isEmpty) { return const Text('暂无题目数据'); } // 数据加载完成后做映射 final List<Question> questions = snapshot.data!.map( (question) => Question( id: question['id'], question: question['question'], options: question['options'], answer_index: question['answer_index'] ), ).toList(); // 渲染列表 return ListView.builder( itemCount: questions.length, itemBuilder: (context, index) => Text(questions[index].question), ); }, ); }
附加优化提示
你当前的getQues方法每次调用都会重复插入样本数据,会导致数据库内数据重复,建议新增判断逻辑,仅在数据库首次初始化时插入样本数据,避免冗余数据。
内容的提问来源于stack exchange,提问作者Terin Tittu
相关产品推荐
相关产品推荐

