本节介绍“监听手机定位,定位更新后,主动将经纬度信息同步到 Flutter” 需求的具体实践,我们分原生和Flutter
双侧来讲解。从职责上看:
- 原生侧主要负责
生产数据和发送数据
。 - Flutter 侧主要负责
接收数据和消费数据
。
在[定义《Native 同步定位信息到 Flutter》接口
](5.定义《Native 同步定位信息到 Flutter》接口.md) 章节已经完成通信协议
约定。
原生侧主要负责生产数据和发送数据
,无需实现约定的通信协议
,因为通信协议
是使用@UniFlutterModule()
修饰的。
在原生侧,我们将用到LocationInfoModel
和LocationInfoService
,它们都是 Unify 自动生成的。下面 Android 和 iOS 将分别介绍。
在 Android 端,可按照下面的步骤操作:
- 调用
LocationInfoService
的setup
方法完成 Channel 连接,调用时机需要在“Flutter Engine运行”之后。本例,我们选择MainActivity
的onCreate
方法。 - 监听定位更新后,将经纬信息存入
LocationInfoModel
对象中,然后通过LocationInfoService
的updateLocationInfo
方法,发送给 Flutter。
核心代码:
// setup时机:Flutter Engine运行后
public class MainActivity extends FlutterActivity {
// 假设会触发下面方法
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......
// 步骤1:完成 Channel 连接
new LocationInfoService().setup(engine.getDartExecutor().getBinaryMessenger());
......
}
// 步骤2:定位更新后,发送经纬度信息
void didLocationUpdate() {
LocationInfoModel model = new LocationInfoModel();
model.setLat(39.989410);
model.setLng(116.480881);
// 这里 我们直接发送了自定义类LocationInfoModel实体
UniAPI.get(LocationInfoService.class).updateLocationInfo(model, result -> {});
}
}
在 iOS 端,可按照下面的步骤操作:
- 导入用到的头文件。
// 导入头文件
#import "LocationInfoService.h"
#import "LocationInfoModel.h"
- 调用
LocationInfoService
的setup
方法完成 Channel 连接,调用时机需要在“Flutter Engine运行”之后。本例,我们封装了方法- (void)didLoadFlutterEngine:
完成这部分的工作。 - 监听定位更新后,将经纬信息存入
LocationInfoModel
对象中,然后通过LocationInfoService
的updateLocationInfo
方法,发送给 Flutter。
iOS 的操作步骤和 Android 基本一致。
核心代码:
// 步骤1:导入头文件
#import "LocationInfoService.h"
#import "LocationInfoModel.h"
// 步骤2:完成 Channel 连接。setup时机根据自己实际情况决定,可调用:- (void)didLoadFlutterEngine:
- (void)didLoadFlutterEngine:(FlutterEngine *)engine {
[LocationInfoService setup:engine.binaryMessenger];
}
// 步骤3:定位更新后,发送经纬度信息
- (void)updateLatitude:(double)lat longitude:(double)lng {
LocationInfoModel *model = [LocationInfoModel new];
model.lat = @(lat);
model.lng = @(lng);
// 这里 我们直接发送了自定义类LocationInfoModel实体
[LocationInfoService updateLocationInfo:model];
}
Flutter 侧主要负责接收数据和消费数据
,切需实现约定的通信协议
,因为通信协议
是使用@UniFlutterModule()
修饰的。
可按照下面的步骤操作:
- 定义一个实现了
通信协议
的类: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侧传过来的定位信息数据
}
}
- 通过
LocationInfoService
的setup
方法注册LocationInfoServiceImpl
实例。比如在main.dart的main()
中注册。
import 'package:hello_uni_foundation/location_info_service.dart';
import 'location_info_service_impl.dart';
void main() {
......
LocationInfoService.setup(LocationInfoServiceImpl());
......
}
注册时机只要在Native侧发送数据之前就可以,依照实际情况自己确定。
至此,我们就完成了监听手机定位,定位更新后,主动将经纬度信息同步到 Flutter的需求开发。