Flutter 原生能力集成指南

Flutter 原生能力集成指南

一、拍照与相册选取
  1. 推荐方案

    • 简单拍照/选图 :使用 image_picker 插件(调用系统相机或相册)。
    • 自定义相机界面 :使用 camera 插件(嵌入相机预览到 Flutter Widget)。
  2. 原生端配置

    • iOSios/Runner/Info.plist):

      xml 复制代码
      <key>NSCameraUsageDescription</key>
      <string>App需要您的同意,才能访问相机进行拍照</string>
      <key>NSPhotoLibraryUsageDescription</key>
      <string>App需要您的同意,才能访问相册选择图片</string>
      <key>NSMicrophoneUsageDescription</key>
      <string>App需要您的同意,才能访问麦克风录制视频</string>
    • Androidandroid/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)
  1. 推荐方案

    • 使用 flutter_blue_plus 插件(支持设备扫描、连接、特征值读写)。
  2. 原生端配置

    • iOSios/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>
    • Androidandroid/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)

若需集成冷门硬件(如串口设备、工业打印机):

  1. Flutter(Dart)端

    dart 复制代码
    const platform = MethodChannel('com.example.app/my_custom_hardware');
    final String result = await platform.invokeMethod('openHardware');
  2. Android(Kotlin)端MainActivity.kt):

    kotlin 复制代码
    MethodChannel(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()
        }
    }
  3. iOS(Swift)端AppDelegate.swift):

    swift 复制代码
    let 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 开发者的关键。
  • 最佳实践:优先使用社区维护良好的插件,复杂场景需手动编写原生代码集成。
相关推荐
woodWu1 天前
Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地
flutter
小小小小小鹿1 天前
Vibe Coding 实战:Flutter 自定义路径布局
flutter·vibecoding
程序员老刘1 天前
Dart 3.12 更新要点:乏善可陈
flutter·ai编程·dart
●VON1 天前
鸿蒙Flutter实战:水平滑动分类标签筛选栏
flutter·华为·harmonyos
●VON1 天前
鸿蒙Flutter实战:24小时新建标签提示组件
android·flutter·华为·harmonyos·鸿蒙
●VON1 天前
鸿蒙Flutter实战:MultiProvider多状态管理架构实践
flutter·华为·架构·harmonyos·鸿蒙
●VON1 天前
鸿蒙Flutter实战:放弃sqflite选纯Dart JSON文件存储
flutter·华为·json·harmonyos·鸿蒙
J船长1 天前
把该死的Provider再讲一遍
flutter
Fansi1 天前
看着无解的 UI,其实只是没拆够 —— 以"凹角卡片"为例
flutter