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 开发者的关键。
  • 最佳实践:优先使用社区维护良好的插件,复杂场景需手动编写原生代码集成。
相关推荐
恋猫de小郭12 小时前
Flutter 多窗口支持类型和 API 介绍
android·前端·flutter
张风捷特烈12 小时前
当 AI 遇见 Flutter | 打造 500+ Widget 专属Logo
android·前端·flutter
kayyoo13 小时前
Flutter的第一个Demo和Bug
flutter
iFlyCai13 小时前
Flutter三棵树核心详解之Element树完全解析(一)
flutter
天空之城--13 小时前
Android Flutter行业最新动态与实用参考(2026年8月第3周)
android·人工智能·flutter·ai编程
iFlyCai13 小时前
Flutter三棵树核心详解之Widget树完全解析(三)
flutter
iFlyCai21 小时前
Flutter三棵树核心详解之Widget树完全解析(一)
flutter
GitLqr1 天前
Flutter 实战:如何轻松实现图片与视频保存到手机相册
flutter·全栈·dart
大龄秃头程序员1 天前
【小记】第一次全栈踩坑 WebSocket 404
flutter
大龄秃头程序员1 天前
Dart/Flutter StatefulWidget 生命周期 + ChangeNotifier Listener 泄漏的经典坑。
flutter