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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:33:21