You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:09:04