写点什么

Flutter 官方尝试放只“鸽子”来简化 Native 插件开发,复习指南

用户头像
Android架构
关注
发布于: 刚刚

接入

集成 pigeon 首先需要在 dev_dependencies 引入 pigeon 依赖。


dev_dependencies:flutter_test:sdk: flutterpigeon: ^0.1.0-experimental.3


之后


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


在项目内创建一个 dart 文件,按照官方提供的建议我们在项目根目录创建了一个 pigeons 的目录,然后创建一个 message.dart 文件。


import 'package:pigeon/pigeon_lib.dart';


class SearchRequest {String query;}


class SearchReply {String result;}


@HostApi()abstract class Api {SearchReply search(SearchRequest request);}


如上代码所示, message.dart 文件中通过 @HostApi() 注解标示了通信对象和接口,之后我们只需要执行如下命令,就可以生成对应代码到工程中。


flutter pub run pigeon --input pigeons/message.dart --dart_out lib/pigeon.dart --objc_header_out ios/Runner/pigeon.h --objc_source_out ios/Runner/pigeon.m --java_out android/app/src/main/java/com/shuyu/testpigeon/Pigeon.java --java_package "com.shuyu.testpigeon"


如上所示命令行:


  • 通过 --input 引入了我们创建的 message.dart 文件;

  • 通过 --dart_out 输出了 dart 模板文件;

  • 通过 --objc_header_out--objc_source_out 输出了 object-c 文件;

  • 通过 --java_out 输出了 java 文件;


命令执行后 dart 文件输出到 lib 目录下, object-c 文件输出到了 ios/Runner 目录下,java 文件输出到指定的 com.shuyu.testpigeon" 包名路径下,之后就可以开始正式接入。

Android

首先看 Android 项目,在生成的 Pigeon.java 中包含了 Api 接口用于开发者实现交互逻辑,同时开发者可以通过 SearchRequest 获取 dart 发送过来的请求,通过 SearchReply 返回数据给 dart 。


所以在 MainActivity 中通过实现 Api 接口就可以完成数据交互,如下代码所示:


  • 通过继承 Pigeon.Api 实现了 MyApi 对象;

  • search 方法中通过 request.getQuery() 获取 dart 的请求数据,并且通过 Pigeon.SearchReplysetResult 返回 String.format("Hi %s!", request.getQuery()),在收到的 dart 文本之前加上 Hi 并返回;

  • 最后通过 Pigeon.Api.setup(getFlutterView(), new MyApi()); 就可以完成引用;


package com.shuyu.testpigeon;


import android.os.Bundle;import io.flutter.app.FlutterActivity;import io.flutter.plugins.GeneratedPluginRegistrant;


public class MainActivity extends FlutterActivity {


private class MyApi implements Pigeon.Api {@Overridepublic Pigeon.SearchReply search(Pigeon.SearchRequest request) {Pigeon.SearchReply reply = new Pigeon.SearchReply();reply.setResult(String.format("Hi %s!", request.getQuery()));return reply;}}


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GeneratedPluginRegistrant.registerWith(this);Pigeon.Api.setup(getFlutterView(), new MyApi());}}

iOS

在 iOS 上首先要先把生成的 pigeon.hpigeon.m 文件 link 到 Xcode 工程里,之后如下代码所示在 AppDelegate.h 引入 Api 协议。


#import <Flutter/Flutter.h>#import <UIKit/UIKit.h>#import "pigeon.h"


@interface AppDelegate : FlutterAppDelegate<Api>


@end


如下代码所示,接下来在 AppDelegate.m 中实现 search 接口,然后在收到的 dart 文本之前加上 Hi 并返回,最后调用 ApiSetup 方法将完成注册。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Flutter 官方尝试放只“鸽子”来简化Native插件开发,复习指南