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

Flutter使用FutureBuilder报The getter 'length' was called on null如何解决

问题根因

  • 表名拼写不统一:建表时定义的表名为tasks(复数),但插入、查询数据时使用的表名为task(单数),导致数据库找不到对应表,getTasks()返回空值而非预期的任务列表。
  • 缺少空安全校验:即使配置了initialData,异步请求抛出异常时snapshot.data依然可能为null,直接调用.length属性就会触发报错。

修复方案

步骤1:统一所有数据库操作的表名

修改DatabaseHelper类中两处表名引用,全部改为和建表语句一致的tasks:

// 修正insertTask方法的表名
Future<void> insertTask(Task task) async {
  Database _db = await database();
  await _db.insert('tasks', task.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace);
}

// 修正getTasks方法的表名
Future<List<Task>> getTasks() async {
  Database _db = await database();
  List<Map<String, dynamic>> taskMap = await _db.query('tasks');
  return List.generate(taskMap.length, (index) {
    return Task(
        id: taskMap[index]['id'],
        title: taskMap[index]['title'],
        description: taskMap[index]['description']);
  });
}

步骤2:给FutureBuilder增加泛型声明和空安全校验

给FutureBuilder指定泛型,同时增加异常、加载状态判断,空值兜底:

Expanded(
  child: FutureBuilder<List<Task>>(
    initialData: const <Task>[],
    future: _dbHelper.getTasks(),
    builder: (context, AsyncSnapshot<List<Task>> snapshot) {
      // 异常状态兜底
      if (snapshot.hasError) {
        return const Center(child: Text("加载失败"));
      }
      // 加载中兜底
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Center(child: CircularProgressIndicator());
      }
      // 空值兜底
      final taskList = snapshot.data ?? [];
      return ScrollConfiguration(
        behavior: NoGlowBehaviour(),
        child: ListView.builder(
          itemCount: taskList.length,
          itemBuilder: (context, index) {
            return TaskCard(
              title: taskList[index].title,
            );
          },
        ),
      );
    },
  ),
)

内容的提问来源于stack exchange,提问作者Don Kalonji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:06:04