如何解决Argument type 'String?' 无法赋值给参数类型'String'的问题
Dart 2.12+ 可空与非可空类型转换方案
Dart 2.12版本引入空安全特性后,带?后缀的可空类型和非可空类型属于两种不同的类型,默认不允许直接互相赋值,两种类型的转换规则如下:
可空类型转非可空类型
共有三种常用的安全转换方式:
- 前置判空+类型自动提升
只要在赋值前的局部作用域中,提前判断可空变量不为null,Dart编译器会自动将该变量的类型提升为非可空类型,无需额外操作符,全程类型安全,无运行时报错风险。
示例代码:int? nullableNum = getRequestParam(); if (nullableNum != null) { // 进入判真分支后,nullableNum自动被识别为int类型 int nonNullableNum = nullableNum; } - 空合并运算符
??指定兜底值
如果可空变量为null时可以找到合理的默认值,直接用??拼接默认值即可完成转换,同样不会产生运行时异常。
示例代码:int? nullableNum; // 若nullableNum为null,自动使用0作为兜底值 int nonNullableNum = nullableNum ?? 0; - 强制断言符
!
如果你100%确定当前可空变量一定不为null,可以在变量后加!强制转换为非可空类型。注意如果变量实际为null,会直接抛出运行时CastError,仅适合明确无空值的场景使用。
示例代码:int? nullableNum = 10; int nonNullableNum = nullableNum!;
非可空类型转可空类型
非可空类型本身是对应可空类型的子集(取值范围完全包含在可空类型的取值范围内),可以直接赋值,不需要任何额外转换操作。
示例代码:
int nonNullableNum = 20; int? nullableNum = nonNullableNum;
int?无法赋值给int的最优方案
最优方案需要结合实际业务场景选择:
- 若变量存在为
null的可能性,优先选择前置判空或者??加兜底默认值的方案,全程类型安全无运行时风险 - 若代码逻辑已经可以确保该
int?变量赋值时一定不为null,可以使用!断言简化代码
内容的提问来源于stack exchange,提问作者Rishabh Bhardwaj
相关产品推荐
相关产品推荐

