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

Flutter应用无法从Cloud Firestore检索数据问题求助

问题根因

  • 核心问题是Firestore集合名称大小写不匹配:写入数据时调用的集合是"Todos"(首字母大写),但StreamBuilder监听的集合是"todos"(全小写),Firestore集合名大小写敏感,因此无法读取到写入的数据。
  • 现有代码还有两处空安全相关的风险点需要修正:
    1. 对可选类型QuerySnapshot?直接使用强制解包!,如果快照出现异常会直接触发闪退
    2. 读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:09:08