Dart空安全下如何对可为空对象调用void类型方法?
Dart 实现空安全下 void 方法可选调用的解决方案
报错根因
你遇到的报错由两个不符合Dart语法规则的写法导致:
- Dart 不支持
void?类型,直接声明方法返回void?本身属于非法定义 - 你将
user?.callMe()的返回值传入了print方法:当user非空时该表达式返回void类型,Dart 禁止使用任何void类型的值,因此触发编译错误。
可用解决方案
方案1:单独调用方法(最推荐)
如果你的需求只是「user不为空时执行callMe,为空时跳过执行,不报错」,不要使用调用表达式的返回值,单独写一行调用即可,完全符合Dart设计规范:
void main(List<String> arguments) { User? user; user?.callMe(); // 无编译错误,空时自动跳过执行 } class User { String name; User(this.name); // 正常定义返回void即可 void callMe() { print('Hello, $name'); } String? foo(){ return name; } }
方案2:修改方法返回值适配取值场景
如果你确实需要读取该调用的返回值(比如要传入print、赋值给变量等场景),修改方法返回类型为Null或者具体可空类型即可:
版本A:返回Null类型
class User { String name; User(this.name); Null callMe() { print('Hello, $name'); return null; } } // 调用写法,不会报错,user为空时返回null print(user?.callMe());
版本B:返回业务相关的可空类型
如果需要返回实际内容可以对应修改返回类型,比如和示例中foo方法对齐:
class User { String name; User(this.name); String? callMe() { final msg = 'Hello, $name'; print(msg); return msg; } } // 调用时user为空打印null,非空打印返回的问候语 print(user?.callMe());
内容的提问来源于stack exchange,提问作者Mahamat
相关产品推荐
相关产品推荐

