Flutter应用无法从Cloud Firestore检索数据问题求助
问题根因
- 核心问题是Firestore集合名称大小写不匹配:写入数据时调用的集合是
"Todos"(首字母大写),但StreamBuilder监听的集合是"todos"(全小写),Firestore集合名大小写敏感,因此无法读取到写入的数据。 - 现有代码还有两处空安全相关的风险点需要修正:
- 对可选类型
QuerySnapshot?直接使用强制解包!,如果快照出现异常会直接触发闪退 - 读取
title字段时没有做空校验,若某条文档缺失title字段会导致渲染报错
- 对可选类型
修正后的完整代码
import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class AddTODOlist extends StatelessWidget { static String id = 'add_todolist'; final TextEditingController _controller = TextEditingController(); void _addUser(){ // 统一集合名为todos(全小写) FirebaseFirestore.instance.collection("todos").add({"title" : _controller.text}); _controller.text = ""; } Widget _buildList(QuerySnapshot? snapshot){ // 提前做空判断处理异常情况 if (snapshot == null || snapshot.docs.isEmpty) { return const Center(child: Text("暂无待办事项")); } return ListView.builder( itemCount: snapshot.docs.length, itemBuilder: (context, index){ final doc = snapshot.docs[index]; // 校验title字段存在性,避免空异常 final title = (doc.data() as Map<String, dynamic>?)?['title'] ?? '无标题'; return ListTile( title: Text(title, style: const TextStyle(color: Colors.black),), ); }, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Loan System',), centerTitle: true, ), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Row( children: [ Expanded( child: TextField( controller: _controller, decoration: const InputDecoration( hintText: 'Add new user', ), ), ), TextButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all<Color>(Colors.blue), ), onPressed:(){ _addUser(); }, child: const Text('Add', style: TextStyle( color: Colors.white, ),), ), ], ), StreamBuilder<QuerySnapshot?>( stream: FirebaseFirestore.instance.collection('todos').snapshots(), builder: (context, snapshot){ // 增加加载、错误状态处理 if (snapshot.connectionState == ConnectionState.waiting) { return const LinearProgressIndicator(); } if (snapshot.hasError) { return Center(child: Text('加载失败:${snapshot.error}')); } return Expanded( child: _buildList(snapshot.data), ); } ), ], ), ), ), ); } }
内容的提问来源于stack exchange,提问作者NewbieProgrammer
相关产品推荐
相关产品推荐

