UniNativeModule 是 Unify 提供的模板注解之一,它的主要作用是:实现 Flutter → Native 的数据传递
。UniNativeModule 模板定义的协议接口需在原生侧进行实现。
-
包含
@UniNativeModule()
文件,我们称为 UniNativeModule 模板文件,它修饰的类只应包含函数声明,不应包含函数实现。 -
使用
@UniNativeModule()
作为元数据时,我们声明的协议接口
需要定义在抽象类
中。 -
约定的
协议接口
在原生侧会生成相应的方法,协议接口
在 iOS 侧会被定义在 Protocol 中;在 Android 侧会被定义在 interface 中。 -
声明
协议接口
时,完全按照定义抽象接口的语法去定义。协议接口
参数支持的数据类型参见:Unify 支持的数数据类型 。 -
UniNativeModule 模板文件可以引用 UniModel 模板文件。引用方式和 Dart 语法中跨文件引用方式一样,使用
import
关键字实现。
模板中抽象类命名
,要使用模板文件名
经过下划线转驼峰格式后得到的名称。或者模板文件名
直接使用模板中定义的抽象类名
。
Tips:这点很重要,定义类名和文件名,一定要遵守上面规则,否则可能影响代码生成。
在实际场景中,会遇到 Flutter 需要主动调用原生,向原生传递消息。待原生收到消息后,去决策做什么,然后将结果返回给 Flutter。
Unify 提供的@UniNativeModule()
修饰的模板,可以帮我们快速实现上面的通信场景。
- Flutter 通过简单的方法调用,就可以将消息发送给 原生。
- 原生 通过实现
协议接口
,可以方便的监听 Flutter 发来的消息。
比如:”Flutter 想查看手机设备参数:系统版本、内存信息、手机型号“。可以按照下面方式定义 UniNativeModule 模板:
import 'package:unify/api/api.dart';
import 'device_info_model.dart';
@UniNativeModule()
abstract class DeviceInfoService {
/// 获取设备信息
Future<DeviceInfoModel> getDeviceInfo();
}
Future
用于表示协议接口
需要使用异步方式,具体参见:定义同步异步接口。选择使用同步还是异步,需要开发者依照实际场景,自行决策。
原生侧要接收 Flutter 侧发送过来的数据,需要去实现协议接口
,分两步:
- 创建遵守
协议接口
的类,并添加协议接口
的具体实现。 - 注册
步骤1
所提到类的对象实体,注册方法参见:UniAPI类 。
iOS 如何使用 Protocol 和 Android如何使用 Interface,这里不多赘述。