FutureOr<void> onLoad 是什么?与Future<void>有何区别?
关于Flame中onLoad方法
FutureOr<void>与Future<void>的区别 1. FutureOr<void>到底是什么意思
FutureOr<T>是Dart自带的联合类型,简单说就是允许方法返回两种结果:要么直接是T类型的值,要么是一个能产出T的Future。放到FutureOr<void>上,就意味着onLoad方法可以:
- 直接写同步逻辑,不用返回任何东西(或者只写
return;) - 写异步逻辑,返回一个
Future<void>对象
举两个合法的写法:
// 同步初始化,直接返回void @override FutureOr<void> onLoad() { size = Vector2(100, 100); } // 异步初始化,返回Future<void> @override FutureOr<void> onLoad() async { final image = await Flame.images.load('player.png'); sprite = Sprite(image); }
2. 和Future<void>的核心区别
Future<void>要求更严格:不管你的逻辑是同步还是异步,必须返回一个Future<void>。哪怕是同步代码,也得要么加async关键字(async方法默认返回Future),要么手动返回Future.value()。FutureOr<void>更灵活:同步、异步场景都能直接适配,不用额外写包装代码,Dart会自动处理两种返回情况。
3. 为啥VSCode补全是FutureOr<void>,官方示例却用Future<void>
Flame框架里onLoad的抽象方法签名本身就是FutureOr<void>,所以VSCode会严格按照框架定义补全。
官方示例用Future<void>,主要是因为组件初始化大多涉及异步操作(比如加载资源),用Future<void>能更直观地展示这种常见场景。但这只是示例规范,你完全可以用FutureOr<void>,完全符合框架要求。
4. 手动改成Future<void>行不行?
当然行。只要你的方法确实返回Future<void>(比如加了async,或者显式返回Future),就可以放心改。如果是同步逻辑,也能这么写:
@override Future<void> onLoad() async { // 同步逻辑也能放在async方法里 size = Vector2(50, 50); } // 或者手动返回Future @override Future<void> onLoad() { size = Vector2(50, 50); return Future.value(); }
内容的提问来源于stack exchange,提问作者shingo.nakanishi
相关产品推荐
相关产品推荐

