在查看Flutter Enginer 源码时,碰到了许多extrenal关键字,在百度查看这个关键字字后了解了一点基础知识。
大家可以参考链接了解external用法
https://www.jianshu.com/p/591d63e4cb80https://www.jianshu.com/p/591d63e4cb80当学习完该知识点后,以为掌握了external的用法。没想道看到下面一段源码,实在是无法理解。
// Both of these functions are written inside C++ to avoid updating the data
// structures in Dart, getting an OOB, and observing stale state. Do not move
// these into Dart code unless you can ensure that the operations will can be
// done atomically. Native code lives in vm/isolate.cc-
// LookupServiceExtensionHandler and RegisterServiceExtensionHandler.
external ServiceExtensionHandler? _lookupExtension(String method);
external _registerExtension(String method, ServiceExtensionHandler handler);
这段代码在 /flutter目录/bin/cache/pkg/sky_engine/lib/developer/extension.dart源文件中
按照上面的知识点实在是无法理解这两个方法(疑惑🤔)。
按照提示,是指这两个方法的具体实现是在c++层,我尼玛,这什么情况,有一定的Dart FFi知识小伙伴知道,Dart 调用C++ 层一般是使用FFi方法,在Dart层的方法一般都会被native关键字标记
例如下面这样
String toString() native "Object_toString";
为了理解这两个方法,开始了查询各种资料,也许查询方法不对,再或许时国内没有相关资料,搜索了一圈后,也没有解答心里的疑惑。
在搜索的过程中偶然发现了Dart的一个带external关键字的注解
@pragma("vm:external-name", "List_new")
这里直接贴出external-name注解官方的解析,该文档在本地路径
/本地目录/dart-sdk/sdk/runtime/docs/pragmas.md
| `vm:external-name` | Allows to specify an external (native) name for an `external` function. This name is used to lookup native implementation via native resolver associated with the current library through embedding APIs. This is a replacement for legacy VM specific `native "name"` syntax. |
可以看的出,这个注解是等价替换native标记的方法。也就是说添加了该注解的方法,在native层有一个具体实现的方法。
到这里,本篇介绍了external关键字的三种用法,留下了一个疑惑,如果有了解熟悉Dart的小伙伴,请留言解惑一下。