当前位置: 首页 > news >正文

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

相关文章:

  • 低碳生活进行时!国产“芯”RK3568创造智慧出行新体验
  • 雷达与imu初始化:鲁棒且实时的雷达惯性初始化方法
  • 算法与诗数据结构 --- 查找 --- 线性表的查找
  • UML(用例图进阶)
  • Intel汇编-LOOP循环
  • 基于JAVA社交物联网的服务搜索系统计算机毕业设计源码+数据库+lw文档+系统+部署
  • 【程序员面试金典】17.04. 消失的数字
  • 深刻理解Java的volatile和synchronized
  • Web大学生网页作业成品 bootstrap响应式网站开发 基于HTML+CSS+JS+Bootstrap制作火锅美食网站(4页)
  • 相对路径覆盖漏洞攻击RPO详解
  • Linux环境下安装mongoDB注意事项
  • 百亿级数据 分库分表 后面怎么分页查询?
  • proc: 虚拟文件系统初始化
  • python 自动生成问卷表的软件的设计与实现 毕业设计源码291138
  • 常见的Linux命令(一)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译]CSS 居中(Center)方法大合集
  • 【Leetcode】104. 二叉树的最大深度
  • 2017年终总结、随想
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 4个实用的微服务测试策略
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Node项目之评分系统(二)- 数据库设计
  • PermissionScope Swift4 兼容问题
  • PHP面试之三:MySQL数据库
  • Vim Clutch | 面向脚踏板编程……
  • vue-router 实现分析
  • Vue全家桶实现一个Web App
  • 大数据与云计算学习:数据分析(二)
  • 如何选择开源的机器学习框架?
  • 思考 CSS 架构
  • linux 淘宝开源监控工具tsar
  • UI设计初学者应该如何入门?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 数据结构
  • #define 用法
  • (3)(3.5) 遥测无线电区域条例
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (推荐)叮当——中文语音对话机器人
  • (一)WLAN定义和基本架构转
  • (转)Google的Objective-C编码规范
  • (转)jQuery 基础
  • **PHP分步表单提交思路(分页表单提交)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • /etc/fstab 只读无法修改的解决办法
  • @JoinTable会自动删除关联表的数据
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)