Flutter使用arrayUnion更新数组时如何校验字符串空值或null
Flutter Firebase arrayUnion 空值过滤实现方案
不需要定义冗余的零散临时变量,直接在构造更新参数的阶段做内联条件过滤即可,同时还能规避原有写法隐藏的空指针风险。
原有写法的核心问题:
- 若
uploadedFileUrls1未被赋值为null,直接执行+拼接操作会直接抛出空指针异常 - 未对值做有效性校验,null、空字符串、纯空格的无效地址会被直接写入数据库,产生脏数据
推荐实现代码如下:
final validAssetUrls = <String>[ // 过滤列表类型资源地址:列表本身非空时,才加入其中非null、非空串的有效项 if (uploadedFileUrls1 != null) ...uploadedFileUrls1.where((url) => url != null && url.trim().isNotEmpty), // 过滤单个字符串资源地址:非null、非空串时才加入 if (uploadedFileUrl2 != null && uploadedFileUrl2.trim().isNotEmpty) uploadedFileUrl2.trim(), ]; final postsUpdateData = { ...createPostsRecordData(), // 仅当存在有效资源地址时,才传入postAssets字段执行更新 if (validAssetUrls.isNotEmpty) 'postAssets': FieldValue.arrayUnion(validAssetUrls), }; await columnPostsRecord.reference.update(postsUpdateData);
该实现的优势:
- 逻辑收敛,所有过滤规则都在构造有效地址数组的位置,后续维护调整规则很方便
- 不仅校验两个变量本身的空值,还会过滤
uploadedFileUrls1列表内部可能混入的null、空串、纯空格的无效项,从源头避免脏数据写入 - 无有效地址时不会向更新数据中加入
postAssets字段,避免触发Firebase无意义的写操作,节省读写配额
如果你追求极致的代码精简,也可以不单独定义validAssetUrls变量,直接把过滤逻辑内联到arrayUnion的入参位置,只是可读性会略有下降:
final postsUpdateData = { ...createPostsRecordData(), 'postAssets': FieldValue.arrayUnion([ if (uploadedFileUrls1 != null) ...uploadedFileUrls1.where((u) => u != null && u.trim().isNotEmpty), if (uploadedFileUrl2 != null && uploadedFileUrl2.trim().isNotEmpty) uploadedFileUrl2.trim(), ]), };
注意事项:
- 代码中加入的
trim()处理是为了过滤全空格的无效地址,如果你的业务逻辑不会产生这类值,可以直接移除 - 不要忽略列表本身的null判断,Dart中对null值调用
+操作符会直接抛出运行时异常
内容的提问来源于stack exchange,提问作者Dennis Ashford
相关产品推荐
相关产品推荐

