Skip to content

Latest commit

 

History

History
81 lines (58 loc) · 3.87 KB

3.UniFlutterModule.md

File metadata and controls

81 lines (58 loc) · 3.87 KB

UniFlutterModule

UniFlutterModule 是 Unify 提供的模板注解之一,它的主要作用是:实现 Native → Flutter 的数据传递UniFlutterModule 模板定义的协议接口需在 Flutter 侧进行实现

描述

  1. 包含@UniFlutterModule()文件,我们称为 UniFlutterModule 模板文件,它修饰的类只应包含函数声明,不应包含函数实现。

  2. 使用@UniFlutterModule()作为元数据时,我们声明的协议接口需定义在抽象类中。

  3. 约定的协议接口在 Flutter 侧会被生成到抽象类中,我们可以通过extends关键字继承抽象类,去实现约定的协议接口

  4. 声明协议接口时,完全按照定义抽象接口的语法去定义。协议接口参数支持的数据类型参见:Unify 支持的数数据类型

  5. UniFlutterModule 模板文件可以引用 UniModel 模板文件。引用方式和 Dart 语法中跨文件引用方式一样,使用import关键字实现。

命名规则

模板中抽象类命名,要使用模板文件名经过下划线转驼峰格式后得到的名称。或者模板文件名直接使用模板中定义的抽象类名

Tips:这点很重要,定义类名和文件名,一定要遵守上面规则,否则可能影响代码生成。

举例

在实际场景中,会遇到”原生“需要主动调用 Flutter,向 Flutter 传递消息。Flutter 收到消息后,去决策做什么。

Unify 提供的@UniFlutterModule()修饰的模板,可以帮我们快速实现上面的通信场景。

  1. 原生通过简单的方法调用,就可以方便的将消息发送给 Flutter
  2. Flutter 通过实现协议接口,可以方便的监听原生发来的消息。

可以按照下面方式定义 UniFlutterModule 模板:

import 'package:unify/api/api.dart';
import 'location_info_model.dart';

@UniFlutterModule()
abstract class LocationInfoService {
    /// 更新定位信息
    void updateLocationInfo(LocationInfoModel model);
}

Future 用于表示协议接口需要使用异步方式,具体参见:定义同步异步接口

@UniFlutterModule()修饰的模板可以直接引用@UniModel()修饰的模板

协议接口需在Flutter侧实现

Flutter侧要接收原生侧发送过来的数据,需要去实现协议接口,分两步:

  1. 创建一个类,此类集成自协议接口所在的抽象类,并实现抽象类中的抽象方法即:协议接口

  2. 调用协议接口所在抽象类中的setup()方法,注册步骤1新建类的对象实体。注册时机:尽量的早,在数据被发送过来之前要完成注册

按照上面的步骤,在 Flutter 侧实现协议接口。以上面的模板所生成的代码场景为例:

  1. 定义一个实现了通信协议的类:LocationInfoServiceImpl,继承自LocationInfoService,并override协议接口。实现代码如下:
/// location_info_service_impl.dart 
import 'package:hello_uni_foundation/location_info_model.dart';
import 'package:hello_uni_foundation/location_info_service.dart';

class LocationInfoServiceImpl extends LocationInfoService {
  @override
  void updateLocationInfo(LocationInfoModel model) {
    // TODO: implement updateLocationInfo
    // 这里既可以通过LocationInfoModel获得Native侧传过来的定位信息数据
  }
}
  1. 通过LocationInfoServicesetup方法注册LocationInfoServiceImpl实例。比如在main.dartmain()中注册。
import 'package:hello_uni_foundation/location_info_service.dart';
import 'location_info_service_impl.dart';

void main() {
    ......
    LocationInfoService.setup(LocationInfoServiceImpl());
    ......
}

注册时机只要在Native侧发送数据之前就可以,依照实际情况自己确定。