这篇文章不是讲 Flutter Channel 入门的,可能让你失望了。不过继续往下读可能也会有点收获。
Flutter 提升了客户端开发的效率,但在跟 Native 代码配合开发时也带来了不好的体验。于是我写了个 Flutter 插件 dart_objc ,使开发者可以用 Dart 的语法来写 Objective-C 代码。借助于 Flutter 的热重载,也可以更高效的动态调试 Native 代码,从此告别在两个工程和 IDE 中切来切去。
尚在开发中,开源地址: https://github.com/yulingtianxia/dart_objc
先说说为什么会有开发效率的问题。Flutter 的跨平台多适用于 UI 等上层需求,本来是可以提升开发效率的。但是诸如 LBS、系统和设备信息、获取相册等常用功能都需要两端去写很多 Native 代码。 最终原本的『两端开发』最后成了『三端开发』 。很少会有完全用 Flutter 开发的 App,原因如下:
既然『三端开发』无法避免,那么增加了哪些成本呢?
既然无法避免调用 Native 的 API,那么就要面对这个事实。下一步是如何能让调用 Native API 的这个过程效率更高。具体体现如下:
所以思路就是:
假如你写了个 Objective-C 的类叫 RuntimeStub ,并实现了个 fooBlock: 方法,参数和返回值都是个 block 对象。
@interface RuntimeStub ()
@end
@implementation RuntimeStub
typedef int(^BarBlock)(NSObject *a);
- (BarBlock)fooBlock:(BarBlock)block {
...
}
@end
利用 dart_objc 写 Dart 代码调用过程如下:
初始化一个 NSObject 对象,传入类名就可以 new 任意类型的对象。 perform() 方法可以调用任意对象的任何方法,跟 Objective-C 的用法基本一致。
NSObject stub = NSObject('RuntimeStub');
Block block = stub.perform(Selector('fooBlock:'), args: [barFunc]);
Objective-C 中 Block 这种匿名函数或闭包的概念在 Dart 中其实就是 Function,所以当参数是 Block 对象的时候,可以直接传入一个与之函数签名一样的 Dart Function 对象。 dart_objc 会自动完成参数类型转换和调用等一系列底层细节。所以用 Dart 实现的 barFunc 与 Objective-C 接口BarBlock 的签名需要一致:
Function barFunc = (NSObject a) {
print('hello block! ${a.toString()}');
return 101;
};
Dart 调用 Block 也很简单,调用 invoke 方法就行:
int result = block.invoke([stub]);
最后也可以用 Dart 封装下 RuntimeStub 类,这样调用代码更简洁。这种模板代码后续会做成自动生成的,而不用手写。
class RuntimeStub extends NSObject {
RuntimeStub() : super('RuntimeStub');
Block fooBlock(Function func) {
return perform(Selector('fooBlock:'), args: [func]);
}
}
由于 dart_objc 组件还在基于 dev 版本的 Dart 开发,可能后续还会有比较大的变动,甚至是 API 的变化。所以没有过多展开讲实现细节,感兴趣可以去自己看代码: https://github.com/yulingtianxia/dart_objc
目前的 Cocoa API 封装打算参考 Swift 版本的文档,毕竟 Dart 有些语法跟 Swift 还有点像。
Android 平台的实现也在规划中,最终将会结束 Flutter 三端开发现状,实现真正的前端大一统。
原文:http://yulingtianxia.com/blog/2019/10/27/Write-Objective-C-Code-using-Dart/?utm_source=tuicool&utm_medium=referral
在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型、方法甚至null都是对象,所有的对象都是继承自Object;虽然Dart是强类型语言,但变量类型是可选的因为Dart可以自动推断变量类型
一条执行线上,同时且只能执行一个任务(事件),其他任务都必须在后面排队等待被执行。也就是说,在一条执行线上,为了不阻碍代码的执行,每遇到的耗时任务都会被挂起放入任务队列
今天我们来比较两种在跨平台移动应用开发中最具竞争力的编程语言: Dart Vs JavaScript。Javascript 和 Dart 都是跨平台移动应用程序开发的不错选择
如果你的程序中有两个方法,这两个方法桉顺序执行,第一个方法执行需要五秒,如果是同步代码,第二个方法会等待第一个方法执行完,才会被调用,如果第一个方法是异步的,程序在执行第一个方法时
Dart的所有东西都是对象。它们都继承自Object,默认是都是null。Dart中支持以下数据类型:Dart中提供了两种数值类型, 分别是整型int和浮点型double.但如果是直接定义了 int 或者 double , 那么就不能再赋其他类型的值.
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!