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
相关产品推荐
相关产品推荐

