Flutter空安全下String?无法赋值给String报错及变量存储方案
报错触发原因
The argument type 'String?' can't be assigned to the parameter type 'String'
该报错由Dart空安全的类型校验规则触发:
- 带
?后缀的String?是可空字符串类型,值可能为有效字符串也可能为null - 不带
?的String是非空字符串类型,要求值一定不为null
你当前使用的videoId属于可空类型,而你要赋值的存储位置、方法入参要求传入非空类型,因此编译阶段直接拦截报错。关闭空安全后Dart不会强制校验空安全规则,因此代码可以运行,但运行时如果videoId实际为null会直接触发崩溃。
推荐的存储&调用方案
按适用场景分三种处理方式:
- 如果你能100%确定
videoId在赋值时一定不会为null,可以直接用!强制解空:
示例代码:String storedVideoId = videoId!;
注意:如果实际运行时videoId为null,该写法会直接抛出空指针异常 - 如果你无法保证
videoId一定有值,建议设置兜底默认值,用??运算符处理空情况:
示例代码:String storedVideoId = videoId ?? 'default_video_id';
该写法永远返回非空字符串,无运行时空异常风险 - 如果业务逻辑本身允许
videoId为空,可以直接把存储变量的类型声明为可空类型,后续调用前做空判断即可:// 存储时声明为可空 String? storedVideoId = videoId; // 后续调用前做空校验 if (storedVideoId != null) { // 进入判断分支后storedVideoId会被Dart自动类型提升为非空String,可直接使用 playVideo(storedVideoId); }
报错信息截图:
内容的提问来源于stack exchange,提问作者Shashwat Singh
相关产品推荐
相关产品推荐

