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

Flutter中List.add方法失效,Cloud Firestore读取数据无法存入列表

问题修复方案

核心根因

  1. 类型不匹配异常:你定义的EventDetails类中isFavorite字段为String类型,但Cloud Firestore中存储的is_favorite是布尔值,赋值时会抛出未捕获的类型转换异常,导致程序卡住,Future无法正常完成,因此FutureBuilder一直停留在加载状态。
  2. 重复初始化Firebase:getEvents方法中每次调用都执行Firebase.initializeApp(),重复初始化会触发异常,影响后续逻辑执行。
  3. 缺失错误处理逻辑:FutureBuilder未配置错误状态分支,异常抛出后无法直观看到报错信息。

修复步骤

1. 全局初始化Firebase

将Firebase初始化逻辑移到main函数中全局执行,确保只初始化一次:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

2. 修正EventDetails字段类型

将isFavorite字段类型改为布尔值,匹配Firestore存储类型:

class EventDetails {
  EventDetails({
    required this.description,
    required this.date,
    required this.startTime,
    required this.endTime,
    required this.speaker,
    required this.isFavorite,
  });

  String description;
  String date;
  String startTime;
  String endTime;
  String speaker;
  bool isFavorite;
}

3. 优化Network类,添加异常捕获

class Network {
  static Future<List<EventDetails>> getEvents() async {
    try {
      FirebaseFirestore instance = FirebaseFirestore.instance;
      var data = await instance.collection('event_details').get();
      return makeEvents(data.docs);
    } catch (e) {
      print('拉取数据异常: $e');
      rethrow;
    }
  }

  static List<EventDetails> makeEvents(List<QueryDocumentSnapshot> collection) {
    List<EventDetails> events = [];
    for (var doc in collection) {
      Map<String, dynamic> eventData = doc.data() as Map<String, dynamic>;
      events.add(
        EventDetails(
          description: eventData['description'],
          date: eventData['date'],
          startTime: eventData['start_time'],
          endTime: eventData['end_time'],
          speaker: eventData['speaker'],
          isFavorite: eventData['is_favorite'],
        ),
      );
    }
    return events;
  }
}

4. 给FutureBuilder添加错误处理分支

@override
Widget build(BuildContext context) {
  return FutureBuilder<List<EventDetails>>(
    future: Network.getEvents(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return ListView.builder(
          itemCount: snapshot.data!.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(snapshot.data![index].description),
            );
          }
        );
      } else if (snapshot.hasError) {
        return Center(
          child: Text('加载失败: ${snapshot.error.toString()}'),
        );
      }
      return const Center(
        child: CircularProgressIndicator(),
      );
    },
  );
}

内容的提问来源于stack exchange,提问作者Mudasir Habib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:54:00