Flutter结合FireStore时如何在Future/FutureBuilder中添加if/else逻辑
问题根因
- 首次报运算符未定义错误:
data.then((value) => value)拿到的value是QuerySnapshot<Map<String, dynamic>>类型的查询结果对象,不是数值类型的文档数量,直接对该对象使用>数值比较运算符,会触发运算符未定义的报错。 - 后续报空安全错误:通过
?.可空访问符得到的docSnapshots?.length是可空整型int?类型,Dart空安全机制禁止直接对可能为null的值调用%运算符;之前将!写在length后面属于位置错误,没有解决整个表达式可空的问题,因此报错不会消失。
正确实现方案
在数据加载完成的分支先做非空校验,拿到确定非空的整型文档总数后,再编写奇偶判断的分支逻辑即可,修改后的完整可运行代码如下:
FutureBuilder<QuerySnapshot<Map<String, dynamic>>> testMethod(_variab) { return FutureBuilder( future: countCollection(_variab), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasError) { return const Text("Something went wrong"); } if (snapshot.connectionState == ConnectionState.done) { // 先校验数据是否存在,避免运行时空指针 if (!snapshot.hasData) { return const Text("No collection data found"); } // 此时snapshot.data已确认非空,可安全强制解包 final docSnapshots = snapshot.data!.docs; // 拿到确定非空的整型文档总数 final int docCount = docSnapshots.length; // 奇偶判断分支 if (docCount % 2 == 0) { // 文档总数为偶数,执行操作y print("文档总数为偶数,执行操作y"); } else { // 文档总数为奇数,执行操作x print("文档总数为奇数,执行操作x"); } return Text(docCount.toString()); } return Container( alignment: Alignment.topCenter, margin: const EdgeInsets.only(top: 20), child: const CircularProgressIndicator( semanticsLabel: 'Loading data..', backgroundColor: Colors.grey, ), ); }, ); } Future<QuerySnapshot<Map<String, dynamic>>> countCollection(uid) async { Future<QuerySnapshot<Map<String, dynamic>>> data = FirebaseFirestore.instance.collection(uid.toString()).get(); return data; }
注意事项
- 不要直接对
QuerySnapshot对象做数值运算,必须通过.docs.length拿到整型的文档数量后,再执行大小比较、奇偶判断这类数值操作。 - 处理可空类型时,优先通过
hasData这类条件判断确认值非空后再做后续操作,比直接在可空表达式后强行加!更稳妥,可避免运行时空指针崩溃。
内容的提问来源于stack exchange,提问作者N90J
相关产品推荐
相关产品推荐

