9.2 原生插件开发

张开发
2026/4/14 23:40:50 15 分钟阅读

分享文章

9.2 原生插件开发
当 pub.dev 上没有满足需求的插件时可以自己开发 Flutter 插件封装原生能力。Pigeon 工具提供类型安全的跨语言通信。一、创建 Flutter 插件flutter create--templateplugin\--platformsandroid,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_channelMethodChannel(my_plugin);staticFutureString?getDeviceModel()async{return_channel.invokeMethodString(getDeviceModel);}staticFutureString?getOsVersion()async{return_channel.invokeMethodString(getOsVersion);}staticFutureMapString,dynamic?getDeviceInfo()async{finalresultawait_channel.invokeMethodMapObject?,Object?(getDeviceInfo);returnresult?.map((k,v)MapEntry(k.toString(),v));}}2.2 Android 实现// android/.../MyPlugin.ktclassMyPlugin:FlutterPlugin,MethodCallHandler{privatelateinitvarchannel:MethodChannelprivatelateinitvarcontext:ContextoverridefunonAttachedToEngine(binding:FlutterPlugin.FlutterPluginBinding){contextbinding.applicationContext channelMethodChannel(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(modeltoBuild.MODEL,brandtoBuild.BRAND,osVersiontoBuild.VERSION.RELEASE,sdkInttoBuild.VERSION.SDK_INT,))else-result.notImplemented()}}overridefunonDetachedFromEngine(binding:FlutterPlugin.FlutterPluginBinding){channel.setMethodCallHandler(null)}}三、Pigeon类型安全通信Pigeon 通过代码生成确保 Dart 和原生之间的 API 类型一致。dev_dependencies:pigeon:^18.0.03.1 定义 Pigeon API// pigeons/messages.dartimportpackage: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 调用原生HostApiHostApi()abstractclassDeviceInfoApi{DeviceInfogetInfo();asyncStringgetUniqueId();}// 原生调用 FlutterFlutterApiFlutterApi()abstractclassEventFlutterApi{voidonBatteryChanged(int level);}# 生成代码dart run pigeon--inputpigeons/messages.dart3.2 使用生成的类型安全 API// 使用生成的 Dart 类finalapiDeviceInfoApi();finalinfoawaitapi.getInfo();print(Model:${info.model}, SDK:${info.sdkVersion});四、使用现有插件原理dependencies:camera:^0.10.5image_picker:^1.0.7大多数 Flutter 插件都采用 Platform Channel 模式Dart 层提供简洁的 API如ImagePicker().pickImage()Platform 层Android 调用 Camera API / iOS 调用 PHPickerViewController通道通过 MethodChannel 双向通信小结方式类型安全适用场景手写 MethodChannel❌ 运行时检查快速原型Pigeon✅ 编译期生产插件推荐使用 pub.dev 插件✅取决于插件优先使用现有插件 下一节9.3 多端支持

更多文章