Flutter SQFlite从数据库填充列表问题求助
修复方案:Flutter SQFlite 数据库填充列表问题
1. 修正Item数据类的fromJson方法
你的fromJson方法存在字段引用错误,导致无法正确解析数据库返回的JSON:
final String itemTable = 'myItemsTable'; class itemFields { static final List<String> values = [id, myText]; static final String id = '_id'; static final String myText = 'myText'; } class Item { late final int? id; late String? myText = ''; Item({required this.id, required this.myText}); Item copy({int? id, String? myText}) => Item( id: id ?? this.id, myText: myText ?? this.myText, ); Map<String, Object?> toJson() => { if (id != null) itemFields.id: id, itemFields.myText: myText, }; // 修正后的fromJson方法 static Item fromJson(Map<String, Object?> json) => Item( id: json[itemFields.id] as int?, myText: json[itemFields.myText]?.toString() ?? '', ); }
- 替换了不存在的
visibleCursorFields.id和item.myText引用,改为正确的itemFields类字段 - 增加空值处理,避免
toString()调用空对象引发崩溃
2. 修复getAllItems()方法,关联数据库查询
当前getAllItems()仅返回静态列表,未调用实际的数据库查询方法:
Future<List<Item>> getAllItems() async { try { return await readAllItems(); } catch (e) { // 捕获异常,返回空列表避免FutureBuilder中断 return []; } }
- 直接调用
readAllItems()获取数据库数据 - 增加异常捕获,保证UI层稳定
3. 修正readAllItems()的表名引用
readAllItems()里的$Table是未定义变量,替换为你定义的itemTable:
Future<List<Item>> readAllItems() async { final db = await instance.dataBase; // 替换$Table为$itemTable final result = await db.rawQuery('SELECT * FROM $itemTable'); return result.map((json) => Item.fromJson(json)).toList(); }
- 删除不必要的空列表判断,空列表直接返回,后续在UI层处理
4. 重构FutureBuilder列表展示逻辑
原FutureBuilder存在依赖静态列表、itemCount使用Future、字段引用错误等问题,修复后代码:
Widget buildMyList() { return SizedBox( width: 800, height: 500, child: FutureBuilder<List<Item>>( future: getAllItems(), builder: (BuildContext context, AsyncSnapshot<List<Item>> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } else if (snapshot.hasError) { return Center(child: Text('加载失败: ${snapshot.error}')); } else if (snapshot.data == null || snapshot.data!.isEmpty) { return const Center(child: Text('暂无数据')); } final items = snapshot.data!; return ListView.separated( padding: const EdgeInsets.all(8), shrinkWrap: true, itemCount: items.length, itemBuilder: (BuildContext context, int index) { final item = items[index]; return Container( height: 60, child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisSize: MainAxisSize.min, children: [ Text(item.myText ?? '', style: const TextStyle(fontSize: 11)), ], ), ), ); }, separatorBuilder: (BuildContext context, int index) => const Divider(), ); }, ), ); }
- 直接使用
snapshot.data获取数据库返回的列表,不再依赖静态MyFormState.items - 补充空数据、加载失败的状态UI
- itemCount改为
snapshot.data的实际长度 - 修正Text的字段引用为
item.myText
5. 移除不必要的静态列表
删除static late List<Item> items = <Item>[];,因为我们已经通过FutureBuilder从数据库获取并展示数据,无需维护静态状态。
内容的提问来源于stack exchange,提问作者DktPhl2018
相关产品推荐
相关产品推荐

