如何基于Firestore存储的布尔值返回对应结果并解决取值为空问题
问题原因&修正方案
核心问题点
- 构造
DocumentReference时调用无参的doc()方法,会生成一个随机ID的新文档引用,没有指向你存储了数据的目标文档,需要传入你要查询的具体文档ID - 新版本Firestore API中获取文档数据需要调用
snapshot.data()方法,你漏写了括号,取到的是方法本身而非数据 - 文档返回的数据本身就是
Map类型,直接用字段名取enrolled值即可,不需要调用map方法遍历 getUser是异步返回结果的方法,不需要在内部调用setState修改状态,直接把布尔结果返回给FutureBuilder处理即可FutureBuilder没有处理加载、错误状态,未完成加载时snapshot.data默认就是null
修正后的代码
1. getUser方法
Future<bool> getUser() async { // 注意:doc()中需要传入你实际要查询的pre子集合下的文档ID,不能留空 final DocumentReference document = FirebaseFirestore.instance .collection('users') .doc(uida) .collection('pre') .doc('你要查询的pre文档ID'); // 这里替换成你实际的文档ID final DocumentSnapshot snapshot = await document.get(); if (snapshot.exists) { Map<String, dynamic>? data = snapshot.data() as Map<String, dynamic>?; return data?['enrolled'] ?? false; } return false; }
2. FutureBuilder部分
return FutureBuilder<bool>( future: getUser(), builder: (BuildContext context, AsyncSnapshot<bool> snapshot) { // 处理加载中状态 if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } // 处理错误状态 if (snapshot.hasError) { return Text('加载失败: ${snapshot.error}'); } // 拿到数据后的逻辑 bool isEnrolled = snapshot.data ?? false; if (isEnrolled) { return Text(isEnrolled.toString()); } // 非enrolled状态的返回逻辑,可自行替换 return const Text('未注册'); }, );
内容的提问来源于stack exchange,提问作者akhicoda
相关产品推荐
相关产品推荐

