Dart空安全提示操作数不可为空条件恒真的处理方案咨询
问题原因
- 你声明的
user变量类型为非空的User,Dart空安全规则中非空类型的变量值永远不可能为null,所以user != null判断无意义,触发警告 - 当前代码存在运行时崩溃隐患:你直接将String类型的JSON字符串传给
fromJson方法,方法内调用json['name']时,String类型没有下标访问能力,会直接抛出类型异常,根本走不到后续判断步骤 - 现有
fromJson方法没有做任何合法性校验,遇到JSON结构不匹配、字段类型错误的场景会直接崩溃,不会返回null
解决方法
我们需要改造解析逻辑,增加合法性校验,同时把返回值改为可空类型,解析失败时返回null:
- 先将JSON字符串解析为Map类型再传入
fromJson - 改造
fromJson方法,内部增加字段类型校验,校验失败直接返回null - 将接收解析结果的变量类型改为可空的
User?,此时user != null的判断就合法有效
修改后完整可运行代码:
import 'dart:convert'; class User { String? name; String? age; User({this.name, this.age}); factory User.fromJson(dynamic json) { // 校验传入的json是不是Map类型 if (json is! Map<String, dynamic>) { throw const FormatException('JSON格式错误'); } // 校验字段类型是否符合要求 final name = json['name']; final age = json['age']; if (name is! String || age is! String) { throw const FormatException('字段类型不匹配'); } return User(name: name, age: age); } // 新增安全解析方法,捕获所有解析异常,失败返回null static User? safeFromJson(String jsonStr) { try { final jsonData = jsonDecode(jsonStr); return User.fromJson(jsonData); } catch (_) { return null; } } } void main() { // 标准JSON字符串需要给key加双引号 String data = '{"name": "mike","age": "2"}'; User? user = User.safeFromJson(data); if (user != null) { // 此时不会再触发警告 print('解析成功,name:${user.name}, age:${user.age}'); } else { print('解析失败,JSON格式或字段不合法'); } }
如果你不想处理异常,也可以直接把
fromJson改成返回User?类型,内部校验不通过直接返回null即可,不需要抛异常。
内容的提问来源于stack exchange,提问作者Manas
相关产品推荐
相关产品推荐

