Dart external关键字

Dart external关键字,第1张

在查看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的小伙伴,请留言解惑一下。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/3002184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存