Flutter 原生能力集成指南
一、拍照与相册选取
-
推荐方案
- 简单拍照/选图 :使用
image_picker插件(调用系统相机或相册)。 - 自定义相机界面 :使用
camera插件(嵌入相机预览到 Flutter Widget)。
- 简单拍照/选图 :使用
-
原生端配置
-
iOS (
ios/Runner/Info.plist):xml<key>NSCameraUsageDescription</key> <string>App需要您的同意,才能访问相机进行拍照</string> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问相册选择图片</string> <key>NSMicrophoneUsageDescription</key> <string>App需要您的同意,才能访问麦克风录制视频</string> -
Android (
android/app/src/main/AndroidManifest.xml):xml<!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 存储权限(Android 11 及以下) --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
二、蓝牙能力(低功耗蓝牙 BLE)
-
推荐方案
- 使用
flutter_blue_plus插件(支持设备扫描、连接、特征值读写)。
- 使用
-
原生端配置
-
iOS (
ios/Runner/Info.plist):xml<key>NSBluetoothAlwaysUsageDescription</key> <string>App需要使用蓝牙来连接您的智能设备</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>App需要使用蓝牙来连接您的智能设备</string> <!-- 后台蓝牙连接 --> <key>UIBackgroundModes</key> <array> <string>bluetooth-central</string> </array> -
Android (
android/app/src/main/AndroidManifest.xml):xml<!-- Android 11 及以下 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 12 及以上 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
-
三、手动实现原生能力(Platform Channel)
若需集成冷门硬件(如串口设备、工业打印机):
-
Flutter(Dart)端 :
dartconst platform = MethodChannel('com.example.app/my_custom_hardware'); final String result = await platform.invokeMethod('openHardware'); -
Android(Kotlin)端 (
MainActivity.kt):kotlinMethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.app/my_custom_hardware").setMethodCallHandler { call, result -> if (call.method == "openHardware") { val success = myNativeHardwareCode() // 调用原生API result.success("Hardware Opened") } else { result.notImplemented() } } -
iOS(Swift)端 (
AppDelegate.swift):swiftlet channel = FlutterMethodChannel(name: "com.example.app/my_custom_hardware", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { call, result in if call.method == "openHardware" { // 调用iOS原生API result("Hardware Opened") } else { result(FlutterMethodNotImplemented) } }
四、其他依赖原生能力的场景
| 类别 | 功能 | 推荐插件 |
|---|---|---|
| 硬件与传感器 | 地理位置 | geolocator, location |
| 陀螺仪/加速度计 | sensors_plus |
|
| 生物识别(FaceID/TouchID) | local_auth |
|
| NFC 读写 | nfc_manager |
|
| 系统级服务 | 推送通知 | firebase_messaging |
| 后台任务 | workmanager |
|
| 内购支付 | in_app_purchase |
|
| 深度链接(Deep Link) | uni_links, go_router |
|
| 多媒体 | 音视频播放 | video_player, chewie |
| 录音 | record, flutter_sound |
总结
- 开发占比:80% Dart/Flutter UI 开发 + 20% 原生平台配置(权限、依赖、证书)。
- 核心能力 :掌握
Platform Channel是进阶高级 Flutter 开发者的关键。 - 最佳实践:优先使用社区维护良好的插件,复杂场景需手动编写原生代码集成。