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

Flutter使用Sqflite时FutureBuilder调用snapshot.data.length报错

问题原因
  • 根本原因是强类型语言Dart的类型检查触发报错:你没有给FutureBuilder指定泛型,导致snapshot.data被默认推断为Object?类型,Object类型本身没有length属性,哪怕你打印看到运行时实际是数组,类型检查也会直接抛出错误。
  • 额外诱因:你的所有异步查询方法都没有声明明确的返回类型,全部隐式返回dynamic,导致Dart类型推断失效,进一步放大了类型问题。
解决步骤
  1. 首先给所有数据库相关方法补全明确的返回类型
// DataBaseHelper中的查询方法补全返回类型
Future<List<Map<String, dynamic>>> getMatchs() async {
    final _db = await db;
    var result = await _db!.query('mathcTable');
    return result;
}

// GetX控制器中的方法同步补全返回类型
Future<List<Map<String, dynamic>>> get matchs => getMatchs();
Future<List<Map<String, dynamic>>> getMatchs() async {
    var list = await DataBaseHelper.instance.getMatchs();
    return list;
}
  1. 给FutureBuilder指定和返回值匹配的泛型,优化类型判断逻辑
body: FutureBuilder<List<Map<String, dynamic>>>(
          future: _game.matchs,
          builder: (context, snapshot) {
            // 优先判断加载错误,方便后续排查问题
            if (snapshot.hasError) {
              return Text('加载失败:${snapshot.error}');
            }
            if (snapshot.hasData) {
              // 此时snapshot.data已经是明确的非空List类型,可直接调用length
              var list = snapshot.data!;
              return ListView.builder(
                  itemCount: list.length,
                  itemBuilder: (context, index) {
                    // 后续可直接通过list[index]['字段名']读取数据
                    return Text('比赛ID:${list[index]['id']}');
                  });
            } else {
              return const Text('waiting data');
            }
          })

内容的提问来源于stack exchange,提问作者Sermed mayi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:45:02