Flutter插件开发

您所在的位置:网站首页 androidstudio插件 Flutter插件开发

Flutter插件开发

2023-06-20 21:12| 来源: 网络整理| 查看: 265

前言

Flutter是Google开源的一个UI库,不具备原生的能力。Flutter的插件是其中的一种工具包,只是这个工具包比较特殊,可以用来跟原生打交道,比如调用蓝牙、WiFi、相机、设备信息等。Flutter和原生(iOS和安卓)之间,一般是通过MethodChannel平台通道来进行通信的,之间的通信,都是异步方式。

Flutter定义了三种不同类型的Platform Channel,它们分别是

BasicMessageChannel:用于传递字符串和半结构化的信息,实现 Flutter 与 原生(Android 、iOS)双向通信。 MethodChannel:用于传递方法调用(method invocation),实现 Flutter 与 原生原生(Android 、iOS)双向通信。 EventChannel: 用于数据流(event streams)的通信,实现原生(Android 、iOS)向Flutter 发送消息。 1.准备工作

新建一个组件模板,有两种新建方式一种是通过命令行,一种是通过编译器(Android Studio、VSCode)。

通过命令行创建: 1. flutter create -t plugin --platforms ios,android device_plugin 2. flutter create --template=plugin --platforms=android,ios -i swift -a java device_plugin 3. flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin device_plugin

通过编译器 1). 新建Flutter Project。 2).在弹出的窗口中,选择Flutter,然后在如下界面的type选项选择Plugin,插件项目命名为plugin_test:

image.png

这是新创建完的插件模板目录

image.png

3).写原生代码的话 就在example 目录里找到对应的iOS 或者 是安卓目录,以iOS为例 新创建的iOS代码是不包含 pod文件夹的所以无法运行 需要先在example里面的iOS 文件夹里运行 pod install 来安装需要的依赖包。

image.png

4).然后就可以运行example工程了.

2.分析插件

对上一步新建的插件,我们通过分析来学习如何做到Flutter与原生平台交互。 打开刚才新建的插件项目,发现跟普通的Flutter项目目录结构基本相同,其中的 plugin_test.dart 文件是用来对外提供接口的文件:

// 通过平台通道进行通信,都是异步的 import 'dart:async'; // services库提供与底层通讯的方法 import 'package:flutter/services.dart'; class PluginTest { // 定义一个通道方法。注意他的参数通常为字符串,且必须跟原生代码的一致,否则无法通信 static const MethodChannel _channel = const MethodChannel('plugin_test'); // 定义platformVersion方法,此方法用来提供对外服务,须异步处理 static Future get platformVersion async { // 调用原生程序获取系统版本号 final String version = await _channel.invokeMethod('getPlatformVersion'); return version; } }

下面来分析新建的插件项目中的iOS部分的文件: 建议使用如下方式编辑iOS端或者安卓端代码,否则无法断点调试原生代码

image.png

在Xcode项目中,找到同名文件PluginTestPlugin.h:

#import @interface PluginTest1Plugin : NSObject @end

.m文件为:

@implementation PluginTest1Plugin // 实现协议中的注册方法,这个方法主要是用来定义与上层代码通信的通道 + (void)registerWithRegistrar:(NSObject*)registrar { FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"plugin_test1" binaryMessenger:[registrar messenger]]; PluginTest1Plugin* instance = [[PluginTest1Plugin alloc] init]; [registrar addMethodCallDelegate:instance channel:channel]; } // 实现协议中的注册方法,用来响应上层调用 - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"getPlatformVersion" isEqualToString:call.method]) { result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); } else { result(FlutterMethodNotImplemented); } } @end * 插件开发完以后,我们可以在插件项目的Example目录下的lib下的main.dart文件进行测试


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3