Flutter中List.add方法失效,Cloud Firestore读取数据无法存入列表
问题修复方案
核心根因
- 类型不匹配异常:你定义的
EventDetails类中isFavorite字段为String类型,但Cloud Firestore中存储的is_favorite是布尔值,赋值时会抛出未捕获的类型转换异常,导致程序卡住,Future无法正常完成,因此FutureBuilder一直停留在加载状态。 - 重复初始化Firebase:
getEvents方法中每次调用都执行Firebase.initializeApp(),重复初始化会触发异常,影响后续逻辑执行。 - 缺失错误处理逻辑: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
相关产品推荐
相关产品推荐

