Dart external关键字

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值