just_audio示例中ambiguate函数的作用是什么?
关于just_audio示例中ambiguate函数的逻辑疑问
我无法理解just_audio示例main.dart文件initState函数里ambiguate(WidgetsBinding.instance)!.addObserver(this)这行的逻辑。我知道!操作符是断言值非空,但认为这里不存在所谓“底层类型”,它的底层类型应该是<T?>。之前只在文档里见过这种写法表示“此处应填入类型”,不清楚实际代码中的作用。
相关代码
main.dart中的initState函数:
void initState() { super.initState(); ambiguate(WidgetsBinding.instance)!.addObserver(this); SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.black, )); _init(); }
common.dart中的ambiguate函数定义:
T? ambiguate<T>(T? value) => value;
逻辑解析
ambiguate的主要用途:兼容不同Dart版本
这个泛型函数看起来只是原样返回输入值,但它是为了解决Dart空安全前后的类型兼容问题才存在的。在空安全普及之前,WidgetsBinding.instance是绝对非空的WidgetsBinding类型;但空安全启用后,它变成了可空的WidgetsBinding?。通过这个函数,代码能同时在两种环境下正常编译运行。调用时的类型处理
- 调用
ambiguate(WidgetsBinding.instance)时,Dart会自动把泛型T推断为WidgetsBinding,所以函数接收和返回的都是WidgetsBinding?类型。 - 后面的
!是非空断言,意思是明确告诉编译器:“我确认这个值肯定不是null”,这样就能把可空类型转换成非空的WidgetsBinding,进而调用addObserver方法。
- 为什么要绕这一层?
如果直接写WidgetsBinding.instance!,在没有空安全的旧版Dart里会报错——因为那时instance本身就是非空的,加!属于多余操作。而用ambiguate做一层包装后,编译器会根据当前Dart版本的规则自动适配类型:旧版里会把T推断为非空类型,返回值自然也是非空;空安全版本则处理为可空类型,再通过!断言非空,完美实现跨版本兼容。
内容的提问来源于stack exchange,提问作者sgjohnson1981
相关产品推荐
相关产品推荐

