You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何调用平台原生功能?以获取手机电量为例

Flutter调用平台原生功能及获取电量实现

在Flutter中调用平台原生功能,主要有两种实用方案:使用第三方成熟插件快速落地,或者通过MethodChannel自定义原生交互逻辑。以下以获取手机电量为例,分别说明两种实现方式:

方式一:使用第三方插件(快速实现)

对于获取电量这类常见需求,直接采用社区维护的battery_plus插件是最高效的选择:

  1. 添加依赖:在项目根目录的pubspec.yaml中声明插件依赖:

    dependencies:
      flutter:
        sdk: flutter
      battery_plus: ^4.0.2 # 替换为最新版本
    

    执行flutter pub get完成依赖安装。

  2. 调用API获取电量:

    import 'package:battery_plus/battery_plus.dart';
    
    // 获取当前剩余电量百分比
    Future<int> getBatteryLevel() async {
      final battery = Battery();
      try {
        return await battery.batteryLevel;
      } catch (e) {
        return -1; // 获取失败返回-1标记
      }
    }
    
    // 监听电量状态变化(充电/放电/充满等)
    void monitorBatteryState() {
      final battery = Battery();
      battery.onBatteryStateChanged.listen((BatteryState state) {
        print('当前电量状态:$state');
        // 可在此处添加UI更新逻辑
      });
    }
    

方式二:自定义MethodChannel实现原生交互

如果需要定制化逻辑,或者现有插件无法满足需求,可以通过MethodChannel手动实现Flutter与原生的通信:

Flutter端代码

创建MethodChannel并发起原生方法调用:

import 'package:flutter/services.dart';

class BatteryManager {
  static const MethodChannel _channel = MethodChannel('com.example/battery');

  static Future<int?> getBatteryLevel() async {
    try {
      final int? result = await _channel.invokeMethod('getBatteryLevel');
      return result;
    } on PlatformException catch (e) {
      print('获取电量失败:${e.message}');
      return null;
    }
  }
}

Android端实现

在MainActivity中注册MethodChannel并编写电量获取逻辑:

import android.content.Context
import android.os.BatteryManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example/battery"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel()
                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "无法获取电量信息.", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    }
}

注:Android 6.0及以上版本无需额外申请权限,系统默认允许获取电量信息。

iOS端实现

在AppDelegate中注册MethodChannel并编写电量获取逻辑:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    private let CHANNEL = "com.example/battery"

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let batteryChannel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        batteryChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
            guard call.method == "getBatteryLevel" else {
                result(FlutterMethodNotImplemented)
                return
            }
            self?.fetchBatteryLevel(result: result)
        })
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    private func fetchBatteryLevel(result: FlutterResult) {
        let device = UIDevice.current
        device.isBatteryMonitoringEnabled = true
        if device.batteryState == .unknown {
            result(FlutterError(code: "UNAVAILABLE", message: "无法获取电量信息.", details: nil))
        } else {
            let batteryLevel = Int(device.batteryLevel * 100)
            result(batteryLevel)
        }
    }
}

内容的提问来源于stack exchange,提问作者Kirti Wakhare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:15:41