Flutter实现手电筒亮度修改

在许多应用场景中,手电筒功能不仅需要开关灯,还希望可以调节亮度。Flutter 本身没有提供直接操作手电筒的 API,但我们可以通过 Platform Channel 调用 Android/iOS 原生接口,实现开关灯和亮度控制。

本文我们将详细讲解实现思路和方法,让读者可以自己写出一个类似的插件

功能需求

  • 开/关手电筒

  • 调节亮度(0~1 的百分比)

  • 获取当前亮度和手电状态

  • 获取最大亮度等级(Android 13+ 有真实等级,iOS 默认 100)

  • 自动开关灯逻辑:亮度 > 0 自动开灯,亮度 = 0 自动关灯

  • 跨平台支持:Android 13+ 支持亮度,旧版本 Android 仅开灯;iOS 支持 0~1 小数亮度

实现原理

Android 原理实现

Android 使用 Camera2 API 控制手电筒:

开关手电筒
复制代码
cameraManager.setTorchMode(cameraId, true); // 开灯
cameraManager.setTorchMode(cameraId, false); // 关灯
调节亮度(Android 13+)
复制代码
cameraManager.turnOnTorchWithStrengthLevel(cameraId, torchLevel);

iOS原理实现

iOS 使用 AVCaptureDevice 控制摄像头 LED:

开关手电筒
复制代码
FlashlightBrightness.instance.flashOn();          // 开灯
FlashlightBrightness.instance.flashOff();         // 关灯
调节亮度
复制代码
FlashlightBrightness.instance.setBrightness(0.5); // 50%亮度

实现步骤

创建一个Flutter 插件

复制代码
flutter create --template=plugin --platforms=android,ios -a java flashlight_brightness

Flutter插件lib配置

1.文件预览
复制代码
lib/
├─ flashlight_brightness.dart              # 插件主入口,提供给用户的 API
├─ flashlight_brightness_method_channel.dart  # MethodChannel 平台实现(Android/iOS 调用)
└─ flashlight_brightness_platform_interface.dart # 抽象平台接口,定义公共方法

作用:

  • flashlight_brightness.dart:Flutter 层调用统一接口,无需关心平台差异。

  • flashlight_brightness_platform_interface.dart:定义接口,支持未来可能增加其他平台(web、macOS 等)。

  • flashlight_brightness_method_channel.dart:通过 MethodChannel 调用 Android/iOS 原生代码,实现接口。

2.创建平台接口

lib/flashlight_brightness_platform_interface.dart

复制代码
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
 
import 'flashlight_brightness_method_channel.dart';
 
/// @class FlashlightBrightnessPlatform
/// @description 定义插件接口,支持多平台实现
abstract class FlashlightBrightnessPlatform extends PlatformInterface {
  FlashlightBrightnessPlatform() : super(token: _token);
 
  static final Object _token = Object();
 
  static FlashlightBrightnessPlatform _instance =
      MethodChannelFlashlightBrightness();
 
  /// 默认实例,MethodChannel 实现
  static FlashlightBrightnessPlatform get instance => _instance;
 
  static set instance(FlashlightBrightnessPlatform instance) {
    PlatformInterface.verifyToken(instance, _token);
    _instance = instance;
  }
 
  /// 获取 Android/iOS 版本(字符串)
  Future<String?> getPlatformVersion() {
    throw UnimplementedError('getPlatformVersion() has not been implemented.');
  }
 
  /// 初始化插件
  Future<void> init() {
    throw UnimplementedError('init() has not been implemented.');
  }
 
  /// 查询手电筒是否点亮
  Future<bool?> isTorched() {
    throw UnimplementedError('isTorched() has not been implemented.');
  }
 
  /// 打开手电筒
  Future<void> flashOn() {
    throw UnimplementedError('flashOn() has not been implemented.');
  }
 
  /// 关闭手电筒
  Future<void> flashOff() {
    throw UnimplementedError('flashOff() has not been implemented.');
  }
 
  /// 获取亮度百分比 0~1
  Future<double?> getBrightness() {
    throw UnimplementedError('getBrightness() has not been implemented.');
  }
 
  /// 设置亮度百分比 0~1
  Future<void> setBrightness(double value) {
    throw UnimplementedError('setBrightness() has not been implemented.');
  }
 
  /// 获取设备最大等级
  Future<int?> getMaxLevel() {
    throw UnimplementedError('getMaxLevel() has not been implemented.');
  }
 
  /// 销毁插件
  Future<void> dispose() {
    throw UnimplementedError('dispose() has not been implemented.');
  }
}

说明

  • 所有方法都是抽象的,必须由具体平台实现。

  • _instance 默认指向 MethodChannel 实现。

3.创建 MethodChannel 实现

lib/flashlight_brightness_method_channel.dart

复制代码
import 'package:flutter/services.dart';
import 'flashlight_brightness_platform_interface.dart';
 
/// @class MethodChannelFlashlightBrightness
/// @description 通过 MethodChannel 与原生通信实现 FlashlightBrightnessPlatform
class MethodChannelFlashlightBrightness extends FlashlightBrightnessPlatform {
  final MethodChannel _channel = const MethodChannel('flashlight_brightness');
 
  @override
  Future<String?> getPlatformVersion() async {
    return await _channel.invokeMethod('getPlatformVersion');
  }
 
  @override
  Future<void> init() async {
    await _channel.invokeMethod('init');
  }
 
  @override
  Future<bool?> isTorched() async {
    return await _channel.invokeMethod('isTorched');
  }
 
  @override
  Future<void> flashOn() async {
    await _channel.invokeMethod('flashOn');
  }
 
  @override
  Future<void> flashOff() async {
    await _channel.invokeMethod('flashOff');
  }
 
  @override
  Future<double?> getBrightness() async {
    return await _channel.invokeMethod('getPercent');
  }
 
  @override
  Future<void> setBrightness(double value) async {
    if (value < 0) value = 0;
    if (value > 1) value = 1;
    await _channel.invokeMethod('setPercent', value);
  }
 
  @override
  Future<int?> getMaxLevel() async {
    return await _channel.invokeMethod('maxLevel');
  }
 
  @override
  Future<void> dispose() async {
    await _channel.invokeMethod('dispose');
  }
}

说明

  • 使用 MethodChannel 调用原生 Android/iOS 方法。

  • 参数和返回值都做了简单映射(比如亮度百分比 0~1)。

4.创建插件主入口

lib/flashlight_brightness.dart

复制代码
import 'flashlight_brightness_platform_interface.dart';
 
/// @class FlashlightBrightness
/// @description Flutter 端插件封装,提供统一方法给业务层调用
class FlashlightBrightness {
  FlashlightBrightness._privateConstructor() {
    _platform.init(); // 自动初始化
  }
 
  static final FlashlightBrightness instance =
      FlashlightBrightness._privateConstructor(); // 单例模式
 
  final FlashlightBrightnessPlatform _platform =
      FlashlightBrightnessPlatform.instance;
 
  /// 获取系统版本
  Future<String?> getPlatformVersion() => _platform.getPlatformVersion();
 
  /// 初始化插件
  Future<void> init() => _platform.init();
 
  /// 手电筒是否点亮
  Future<bool?> isTorched() => _platform.isTorched();
 
  /// 打开手电筒
  Future<void> flashOn() => _platform.flashOn();
 
  /// 关闭手电筒
  Future<void> flashOff() => _platform.flashOff();
 
  /// 获取亮度百分比 0~1
  Future<double?> getBrightness() => _platform.getBrightness();
 
  /// 设置亮度百分比 0~1
  Future<void> setBrightness(double value) => _platform.setBrightness(value);
 
  /// 获取设备最大等级
  Future<int?> getMaxLevel() => _platform.getMaxLevel();
 
  /// 销毁插件
  Future<void> dispose() => _platform.dispose();
}

说明

  • 提供统一的 Flutter API,隐藏平台差异。

  • 用户只需要导入 flashlight_brightness.dart 即可使用插件功能。

  • 使用单例模式 instance,确保全局只有一个插件实例。

Android 手电筒亮度控制实现方式

1.文件预览
复制代码
android/src/main/java/com/example/flashlight_brightness/
├─ FlashlightBrightnessConstants.java     # 方法名与关键常量
├─ FlashlightBrightnessController.java    # 具体的手电筒实现逻辑
└─ FlashlightBrightnessPlugin.java        # Flutter 插件入口,MethodChannel 分发

作用:

  • FlashlightBrightnessConstants.java:规范接口,集中管理 MethodChannel 的方法名
  • FlashlightBrightnessController.java:手电筒控制逻辑,不影响 MethodChannel
  • FlashlightBrightnessPlugin.java:MethodChannel 入口,收 Flutter 调用 → 分发给 Controller → 返回结果给 Flutter
2.定义方法变量

android/src/main/java/com/example/flashlight_brightness/FlashlightBrightnessConstants.java:

复制代码
package com.example.flashlight_brightness;
 
/**
 * @class FlashlightBrightnessConstants
 * @description 定义插件中使用的所有方法名常量,统一管理 Flutter 与 Android 端通信的 key
 * @features
 *   - 提供插件方法常量
 *   - 避免字符串硬编码
 *   - 提供亮度控制相关常量
 */
public final class FlashlightBrightnessConstants {
 
  private FlashlightBrightnessConstants() {} // 私有构造,防止实例化
 
  // 获取 Android 系统版本
  public static final String VERSION = "getPlatformVersion";
 
  // 初始化 FlashlightBrightnessController
  public static final String INIT = "init";
 
  // 开灯 / 关灯
  public static final String FLASH_ON = "flashOn";
  public static final String FLASH_OFF = "flashOff";
 
  // 获取 / 设置亮度百分比(0~1)
  public static final String SET_PERCENT = "setPercent";
  public static final String GET_PERCENT = "getPercent";
 
  // 获取设备支持的最大 torch level
  public static final String MAX_LEVEL = "maxLevel";
 
  // 查询手电筒是否已点亮
  public static final String IS_TORCHED = "isTorched";
 
  // 销毁 FlashlightBrightnessController
  public static final String DISPOSE = "dispose";
}
3.配置手电筒配置逻辑

android/src/main/java/com/example/flashlight_brightness/FlashlightBrightnessController.java:

主要功能

  • 获取亮度等级

    • Android 13+:获取真实最大等级
    • Android 6~12:等级为1
  • 获取手电筒亮度

    • 当前的亮度等级/最大亮度等级
  • 设置手电筒亮度

    • 设置值范围0~1。

      • 0:关闭手电筒
    • 亮度值*最大亮度等级并取整

      package com.example.flashlight_brightness;

      import android.annotation.TargetApi;
      import android.content.Context;
      import android.hardware.camera2.CameraCharacteristics;
      import android.hardware.camera2.CameraManager;
      import android.os.Build;
      import android.util.Log;

      /**

      • @class FlashlightBrightnessController
      • @description Android 手电筒控制类,支持亮度控制
      • @features
      • 复制代码
              - 获取 / 设置亮度(百分比 0~1)
      • 复制代码
              - 打开 / 关闭手电筒
      • 复制代码
              - 获取最大亮度等级
      • 复制代码
              - Android 13+ 支持多级亮度控制
      • 复制代码
              - Android 6~12 基础开关手电筒兼容

      */
      @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      public class FlashlightBrightnessController {

      private final CameraManager cameraManager;
      private String cameraId;

      private boolean isTorched = false; // 当前是否点亮
      private int torchLevel = 1; // 当前亮度等级(整数)
      private int maxLevel = 1; // 设备支持的最大亮度等级

      /**

      • Torch 回调监听器
      • 用于监听亮度和状态变化
        */
        private final CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
        @Override
        public void onTorchStrengthLevelChanged(String id, int newStrengthLevel) {
        torchLevel = newStrengthLevel;
        }
      复制代码
      @Override
      public void onTorchModeChanged(String id, boolean enabled) {
        isTorched = enabled;
      }

      };

      /**

      • 构造函数
      • @param context 应用上下文
      • @description 初始化 CameraManager 和 TorchCallback,获取后置摄像头 ID 和最大亮度
        */
        public FlashlightBrightnessController(Context context) {
        cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
      复制代码
      try {
        for (String id : cameraManager.getCameraIdList()) {
          CameraCharacteristics cs = cameraManager.getCameraCharacteristics(id);
          Integer lens = cs.get(CameraCharacteristics.LENS_FACING);
          if (lens != null && lens == CameraCharacteristics.LENS_FACING_BACK) {
            cameraId = id;
      
            // Android 13+ 获取真实最大等级
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
              maxLevel = cameraManager.getTorchStrengthLevel(cameraId);
            } else {
              maxLevel = 1; // Android 6~12 无多级亮度
            }
            break;
          }
        }
      
        // 注册回调监听
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
          cameraManager.registerTorchCallback(torchCallback, null);
        }
      
      } catch (Exception e) {
        Log.e("FlashlightBrightnessController", "Init failed", e);
      }

      }

      /**

      • @return 当前手电筒是否点亮
        */
        public boolean isTorched() {
        return isTorched;
        }

      /**

      • @return 设备最大亮度等级
        */
        public int getMaxTorchLevel() {
        return maxLevel;
        }

      /**

      • @return 当前亮度百分比(0~1)
        */
        public double getTorchLevelPercent() {
        if (maxLevel <= 1)
        return isTorched ? 1.0 : 0.0;
        return torchLevel / (double) maxLevel;
        }

      /**

      • 设置亮度百分比并自动开灯
      • @param percent 亮度百分比,范围 0~1
        */
        public void setTorchLevelPercent(double percent) {
        // if (percent < 0.0) percent = 0.0;
        // if (percent > 1.0) percent = 1.0;
        percent = Math.max(0, Math.min(percent, 1)); // 限制在 0~1
        if (percent == 0) {
        // 如果亮度为 0,直接关灯
        flashOff();
        torchLevel = 0;
        return;
        }
      复制代码
      int level = (int) Math.round(percent * maxLevel);
      if (level < 1)
        level = 1;
      
      torchLevel = level;
      
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        try {
          cameraManager.turnOnTorchWithStrengthLevel(cameraId, torchLevel);
          isTorched = true;
        } catch (Exception e) {
          Log.e("FlashlightBrightnessController", "setTorchLevelPercent failed", e);
        }
      } else {
        flashOn(); // Android 6~12 只能开灯,不支持亮度
      }

      }

      /**

      • 开灯
        */
        public void flashOn() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
        return;
      复制代码
      if (!isTorched) {
        try {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && maxLevel > 1) {
            cameraManager.turnOnTorchWithStrengthLevel(cameraId, torchLevel);
          } else {
            cameraManager.setTorchMode(cameraId, true);
          }
          isTorched = true;
        } catch (Exception e) {
          Log.e("FlashlightBrightnessController", "flashOn failed", e);
        }
      }

      }

      /**

      • 关灯
        */
        public void flashOff() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isTorched) {
        try {
        cameraManager.setTorchMode(cameraId, false);
        isTorched = false;
        } catch (Exception e) {
        Log.e("FlashlightBrightnessController", "flashOff failed", e);
        }
        }
        }

      /**

      • 注销回调并关闭手电筒
        */
        public void dispose() {
        try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cameraManager.unregisterTorchCallback(torchCallback);
        }
        } catch (Exception ignored) {
        }
        flashOff();
        }
        }
4.Flutter ↔ Android 通信桥梁配置

android/src/main/java/com/example/flashlight_brightness/FlashlightBrightnessPlugin.java:

主要作用:

  • Flutter ↔ Android 通信桥梁

  • 分发方法到 Controller

    package com.example.flashlight_brightness;

    import android.content.Context;
    import android.os.Build;

    import androidx.annotation.NonNull;

    import io.flutter.embedding.engine.plugins.FlutterPlugin;
    import io.flutter.plugin.common.MethodCall;
    import io.flutter.plugin.common.MethodChannel;

    /**

    • @class FlashlightBrightnessPlugin
    • @description Flutter 插件入口,实现 MethodChannel 与 Android 原生通信
    • @features
    • 复制代码
            - 注册 MethodChannel
    • 复制代码
            - 分发 Flutter 调用到 FlashlightBrightnessController
    • 复制代码
            - 提供百分比亮度接口
    • 复制代码
            - 提供最大亮度等级查询
    • 复制代码
            - 管理生命周期(初始化、销毁)

    */
    public class FlashlightBrightnessPlugin implements FlutterPlugin, MethodChannel.MethodCallHandler {

    复制代码
    private MethodChannel channel;
    private Context context;
    private FlashlightBrightnessController flashlightController;
    
    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
      channel = new MethodChannel(binding.getBinaryMessenger(), "flashlight_brightness");
      channel.setMethodCallHandler(this);
      context = binding.getApplicationContext();
      // 自动初始化
      ensureController();
    }
    
    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
    
      switch (call.method) {
    
        case FlashlightBrightnessConstants.VERSION:
          result.success("Android " + Build.VERSION.RELEASE);
          break;
    
        case FlashlightBrightnessConstants.INIT:
          if (flashlightController == null) {
            flashlightController = new FlashlightBrightnessController(context);
          }
          result.success(true);
          break;
    
        case FlashlightBrightnessConstants.IS_TORCHED:
          // 自动初始化
          ensureController();
          result.success(flashlightController.isTorched());
          break;
    
        case FlashlightBrightnessConstants.FLASH_ON:
          ensureController();
          flashlightController.flashOn();
          result.success(true);
          break;
    
        case FlashlightBrightnessConstants.FLASH_OFF:
          ensureController();
          flashlightController.flashOff();
          result.success(true);
          break;
    
        case FlashlightBrightnessConstants.GET_PERCENT:
          ensureController();
          result.success(flashlightController.getTorchLevelPercent());
          break;
    
        case FlashlightBrightnessConstants.SET_PERCENT:
          ensureController();
          Object arg = call.arguments;
          double percent = 1.0;
          if (arg instanceof Number) {
            percent = ((Number) arg).doubleValue();
          }
          flashlightController.setTorchLevelPercent(percent);
          result.success(true);
          break;
    
        case FlashlightBrightnessConstants.MAX_LEVEL:
          ensureController();
          result.success(flashlightController.getMaxTorchLevel());
          break;
    
        case FlashlightBrightnessConstants.DISPOSE:
          if (flashlightController != null) {
            flashlightController.dispose();
            flashlightController = null;
          }
          result.success(true);
          break;
    
        default:
          result.notImplemented();
      }
    }
    
    /**
     * 确保 flashlightController 已初始化
     */
    private void ensureController() {
      if (flashlightController == null) {
        flashlightController = new FlashlightBrightnessController(context);
      }
    }
    
    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
      channel.setMethodCallHandler(null);
    }

    }

至此,Android配置就完成了

iOS 手电筒亮度控制实现方式

1.文件预览
复制代码
flashlight_brightness/
 └─ ios/
     └─ Classes/
         ├─ FlashlightBrightnessPlugin.swift        // Flutter 插件入口
         ├─ FlashlightBrightnessController.swift     // 手电筒控制核心逻辑
         └─ FlashlightBrightnessConstants.swift      // 方法名常量(与 Android 对应)

作用:

  • FlashlightBrightnessConstants.swift :负责统一 iOS MethodChannel 方法名
  • FlashlightBrightnessController.swift:控制 iOS 手电筒亮度核心逻辑
  • FlashlightBrightnessPlugin.swift:插件入口:接收 Flutter 调用 → 分发给 Controller
2.定义方法变量

ios/Classes/FlashlightBrightnessConstants.swift

复制代码
//
//  FlashlightBrightnessConstants.swift
//  flashlight_brightness
//
//  定义 Flutter 与 iOS 通信的常量方法名
//
 
import Foundation
 
enum FlashlightBrightnessConstants {
    static let version = "getPlatformVersion"
    static let initPlugin = "init"
     
    static let flashOn = "flashOn"
    static let flashOff = "flashOff"
     
    static let setPercent = "setPercent"
    static let getPercent = "getPercent"
     
    static let maxLevel = "maxLevel"
    static let isTorched = "isTorched"
     
    static let dispose = "dispose"
}
3.配置手电筒配置逻辑

ios/Classes/FlashlightBrightnessController.swift

复制代码
//
//  FlashlightBrightnessController.swift
//  flashlight_brightness
//
//  封装手电筒控制逻辑,支持开关和亮度控制
//
 
import AVFoundation
import UIKit
 
class FlashlightBrightnessController {
     
    private let device = AVCaptureDevice.default(for: .video)
    private var currentBrightness: Float = 1.0
     
    /// 判断设备是否有手电筒
    var hasTorch: Bool {
        return device?.hasTorch ?? false
    }
     
    /// 当前是否点亮
    var isTorched: Bool {
        guard let device = device else { return false }
        return device.isTorchActive
    }
     
    /// 最大亮度等级(iOS 恒定为 1.0)
    var maxLevel: Int {
        return 100
    }
     
    /// 获取当前亮度百分比 0~1
    var brightness: Float {
        return currentBrightness
    }
     
    /// 设置亮度百分比 0~1 并自动开灯
    func setBrightness(_ percent: Float) {
        guard hasTorch, let device = device else { return }
        let level = min(max(percent, 0.0), 1.0)
        if level == 0 {
            // 亮度为0,自动关灯
            flashOff()
            currentBrightness = 0
            return
        }
        currentBrightness = level
         
        do {
            try device.lockForConfiguration()
            try device.setTorchModeOn(level: level)
            device.unlockForConfiguration()
        } catch {
            print("Failed to set torch brightness: \(error)")
        }
    }
     
    /// 打开手电筒(使用当前亮度)
    func flashOn() {
        guard hasTorch, let device = device else { return }
        do {
            try device.lockForConfiguration()
            if !device.isTorchActive {
                try device.setTorchModeOn(level: currentBrightness)
            }
            device.unlockForConfiguration()
        } catch {
            print("Failed to turn on torch: \(error)")
        }
    }
     
    /// 关闭手电筒
    func flashOff() {
        guard hasTorch, let device = device else { return }
        do {
            try device.lockForConfiguration()
            device.torchMode = .off
            device.unlockForConfiguration()
        } catch {
            print("Failed to turn off torch: \(error)")
        }
    }
     
    /// 销毁控制器(iOS 不需要额外操作)
    func dispose() {
        flashOff()
    }
4.接收 Flutter 调用 → 分发给 Controller 配置

ios/Classes/FlashlightBrightnessPlugin.swift

复制代码
//
//  FlashlightBrightnessPlugin.swift
//  flashlight_brightness
//
//  Flutter 插件入口,注册 MethodChannel 并分发方法
//
 
import Flutter
import UIKit
 
public class FlashlightBrightnessPlugin: NSObject, FlutterPlugin {
     
    /// 控制器实例,可变变量
    private var controller: FlashlightBrightnessController?
     
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "flashlight_brightness", binaryMessenger: registrar.messenger())
        let instance = FlashlightBrightnessPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }
     
    /// 获取控制器,如果未创建则自动初始化
    private func getController() -&gt; FlashlightBrightnessController {
        if controller == nil {
            controller = FlashlightBrightnessController() // 自动初始化
        }
        return controller!
    }
     
    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        // 使用类属性 controller,不再声明 let
        switch call.method {
             
        case FlashlightBrightnessConstants.version:
            result("iOS \(UIDevice.current.systemVersion)")
             
        case FlashlightBrightnessConstants.initPlugin:
            // 已经自动初始化,无需重新赋值
            _ = getController()
            result(true)
             
        case FlashlightBrightnessConstants.isTorched:
            result(controller?.isTorched ?? false)
             
        case FlashlightBrightnessConstants.flashOn:
            getController().flashOn()
            result(true)
             
        case FlashlightBrightnessConstants.flashOff:
            getController().flashOff()
            result(true)
             
        case FlashlightBrightnessConstants.getPercent:
            result(getController().brightness)
             
        case FlashlightBrightnessConstants.setPercent:
            if let arg = call.arguments as? Double {
                getController().setBrightness(Float(arg)) // 自动开灯或关灯
            }
            result(true)
             
        case FlashlightBrightnessConstants.maxLevel:
            result(getController().maxLevel)
             
        case FlashlightBrightnessConstants.dispose:
            controller?.dispose()
            controller = nil
            result(true)
             
        default:
            result(FlutterMethodNotImplemented)
        }
    }
}

至此,iOS配置也就完成了

使用方法

创建单例实例
复制代码
import 'package:flashlight_brightness/flashlight_brightness.dart';
final flashlight = FlashlightBrightness.instance;
开启/关闭手电筒
复制代码
await flashlight.flashOn();  // 开灯
await flashlight.flashOff(); // 关灯
设置亮度 (0.0 - 1.0)
复制代码
// 设置亮度为50%,如果手电未开则会自动开灯
await flashlight.setBrightness(0.5);
 
// 设置亮度为0,会自动关闭手电筒
await flashlight.setBrightness(0.0);
获取当前亮度
复制代码
double? brightness = await flashlight.getBrightness(); // 返回0.0~1.0
判断手电筒是否开启
复制代码
bool? isOn = await flashlight.isTorched();
获取最大亮度等级
复制代码
int? maxLevel = await flashlight.getMaxLevel(); // Android: 5,iOS: 100
释放资源(可选)
复制代码
await flashlight.dispose();
相关推荐
千码君201635 分钟前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
maaath2 小时前
【maaath】Flutter for OpenHarmony 手表配饰应用实战开发
flutter·华为·harmonyos
maaath3 小时前
【maaath】Flutter for OpenHarmony 跨平台计算器应用开发实践
flutter·华为·harmonyos
maaath8 小时前
【maaath】Flutter for OpenHarmony 闹钟时钟应用开发实战
flutter·华为·harmonyos
maaath8 小时前
【maaath】Flutter for OpenHarmony 短信管理应用实战
flutter·华为·harmonyos
maaath9 小时前
【maaath】Flutter for OpenHarmony打造跨平台便签备忘录应用
flutter·华为·harmonyos
千码君20169 小时前
flutter:与Android Studio模拟器的调试分享
android·flutter
xmdy586610 小时前
Flutter+开源鸿蒙实战|智联邻里Day8 Lottie动画集成+url_launcher跳转拨号+个人中心完善+全局UI统一
flutter·开源·harmonyos
liulian091618 小时前
Flutter for OpenHarmony 跨平台开发:颜色选择器功能实战指南
flutter
liulian09161 天前
Flutter for OpenHarmony 跨平台开发:BMI计算器功能实战指南
flutter·华为