news 2026/5/12 4:53:45

9.2 原生插件开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9.2 原生插件开发

当 pub.dev 上没有满足需求的插件时,可以自己开发 Flutter 插件,封装原生能力。Pigeon 工具提供类型安全的跨语言通信。


一、创建 Flutter 插件

flutter create--template=plugin\--platforms=android,ios\--orgcom.example\my_plugin

插件结构:

my_plugin/ ├── lib/ │ └── my_plugin.dart # Dart 公共 API ├── android/ │ └── src/main/kotlin/... │ └── MyPlugin.kt # Android 实现 ├── ios/ │ └── Sources/my_plugin/ │ └── MyPlugin.swift # iOS 实现 ├── test/ │ └── my_plugin_test.dart ├── example/ │ └── lib/main.dart # 示例 App └── pubspec.yaml

二、实现插件(以设备信息为例)

2.1 Dart 接口层

// lib/my_plugin.dartclassMyPlugin{staticconstMethodChannel_channel=MethodChannel('my_plugin');staticFuture<String?>getDeviceModel()async{return_channel.invokeMethod<String>('getDeviceModel');}staticFuture<String?>getOsVersion()async{return_channel.invokeMethod<String>('getOsVersion');}staticFuture<Map<String,dynamic>?>getDeviceInfo()async{finalresult=await_channel.invokeMethod<Map<Object?,Object?>>('getDeviceInfo');returnresult?.map((k,v)=>MapEntry(k.toString(),v));}}

2.2 Android 实现

// android/.../MyPlugin.ktclassMyPlugin:FlutterPlugin,MethodCallHandler{privatelateinitvarchannel:MethodChannelprivatelateinitvarcontext:ContextoverridefunonAttachedToEngine(binding:FlutterPlugin.FlutterPluginBinding){context=binding.applicationContext channel=MethodChannel(binding.binaryMessenger,"my_plugin")channel.setMethodCallHandler(this)}overridefunonMethodCall(call:MethodCall,result:Result){when(call.method){"getDeviceModel"->result.success(Build.MODEL)"getOsVersion"->result.success(Build.VERSION.RELEASE)"getDeviceInfo"->result.success(mapOf("model"toBuild.MODEL,"brand"toBuild.BRAND,"osVersion"toBuild.VERSION.RELEASE,"sdkInt"toBuild.VERSION.SDK_INT,))else->result.notImplemented()}}overridefunonDetachedFromEngine(binding:FlutterPlugin.FlutterPluginBinding){channel.setMethodCallHandler(null)}}

三、Pigeon(类型安全通信)

Pigeon 通过代码生成确保 Dart 和原生之间的 API 类型一致。

dev_dependencies:pigeon:^18.0.0

3.1 定义 Pigeon API

// pigeons/messages.dartimport'package:pigeon/pigeon.dart';// 输出配置@ConfigurePigeon(PigeonOptions(dartOut:'lib/src/messages.g.dart',kotlinOut:'android/src/main/kotlin/.../Messages.g.kt',swiftOut:'ios/Sources/my_plugin/Messages.g.swift',))// 数据类(自动生成 Kotlin/Swift 对应类)classDeviceInfo{String?model;String?brand;int?sdkVersion;}// Flutter 调用原生(HostApi)@HostApi()abstractclassDeviceInfoApi{DeviceInfogetInfo();@asyncStringgetUniqueId();}// 原生调用 Flutter(FlutterApi)@FlutterApi()abstractclassEventFlutterApi{voidonBatteryChanged(int level);}
# 生成代码dart run pigeon--inputpigeons/messages.dart

3.2 使用生成的类型安全 API

// 使用生成的 Dart 类finalapi=DeviceInfoApi();finalinfo=awaitapi.getInfo();print('Model:${info.model}, SDK:${info.sdkVersion}');

四、使用现有插件原理

dependencies:camera:^0.10.5image_picker:^1.0.7

大多数 Flutter 插件都采用 Platform Channel 模式:

  1. Dart 层:提供简洁的 API(如ImagePicker().pickImage()
  2. Platform 层:Android 调用 Camera API / iOS 调用 PHPickerViewController
  3. 通道:通过 MethodChannel 双向通信

小结

方式类型安全适用场景
手写 MethodChannel❌ 运行时检查快速原型
Pigeon✅ 编译期生产插件推荐
使用 pub.dev 插件✅(取决于插件)优先使用现有插件

👉 下一节:9.3 多端支持

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 23:39:21

2026 最全面电商数据接口测试与接入示例教学(淘宝 / 京东 / 1688 / 微店)

2026 年电商开发已进入多平台一体化、数据实时化时代&#xff0c;API 接口是 ERP 对接、小程序搭建、商品采集、订单同步、数据分析的核心基建。很多开发者在对接淘宝、京东、1688、微店时&#xff0c;常卡在&#xff1a;找不到正规测试入口、参数看不懂、签名不会算、报错无从…

作者头像 李华
网站建设 2026/4/14 23:39:19

1688 拍立淘接口(item_search_img)测试与接入实战心得

最近一直在做 1688 相关的开发&#xff0c;重点对接了1688 按图搜索商品接口&#xff08;item_search_img&#xff0c;俗称拍立淘&#xff09;。从最初的在线测试、参数调试&#xff0c;到后来的代码接入、异常处理&#xff0c;我把整个过程的真实踩坑和经验都整理成了这篇实战…

作者头像 李华
网站建设 2026/4/14 23:37:25

如何在 React 中正确绑定 onClick 事件避免字符串赋值错误

React 中 onClick 期望接收一个函数&#xff0c;若直接写 onClick{window.href...} 会立即执行赋值并返回字符串&#xff0c;导致类型错误&#xff1b;正确做法是传入箭头函数或命名函数来延迟执行。 react 中 onclick 期望接收一个函数&#xff0c;若直接写 onclick{wind…

作者头像 李华
网站建设 2026/4/14 23:31:30

3步打造终极开源AI智能眼镜:低成本改造实战指南

3步打造终极开源AI智能眼镜&#xff1a;低成本改造实战指南 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass OpenGlass是一个革命性的开源项目&#xff0c;它能将普通眼镜改造…

作者头像 李华
网站建设 2026/4/14 23:20:34

前端VUE多项目一键运行脚本教程

前端多项目一键运行脚本教程 一、背景痛点 我们项目是典型的「多子应用 monorepo 结构」&#xff0c;每次启动/打包都需要手动 cd 进对应子项目目录&#xff0c;执行 npm run 命令。 如果需要批量操作多个项目&#xff0c;还要反复切换目录&#xff0c;非常低效且容易出错。 为…

作者头像 李华
网站建设 2026/4/14 23:20:10

2024 CKA模拟系统实战 | 从零构建K8S学习环境 | 1、VMware与Ubuntu基础部署

1. VMware与Ubuntu环境搭建全攻略 最近在准备CKA认证考试&#xff0c;发现很多同学卡在了第一步——搭建实验环境。今天我就把自己折腾了半个月的经验总结成这份保姆级教程&#xff0c;手把手教你用VMware Workstation和Ubuntu Server搭建K8S学习环境。这个方案最大的优势是完全…

作者头像 李华