Flutter中如何调用平台原生功能?以获取手机电量为例
Flutter调用平台原生功能及获取电量实现
在Flutter中调用平台原生功能,主要有两种实用方案:使用第三方成熟插件快速落地,或者通过MethodChannel自定义原生交互逻辑。以下以获取手机电量为例,分别说明两种实现方式:
方式一:使用第三方插件(快速实现)
对于获取电量这类常见需求,直接采用社区维护的battery_plus插件是最高效的选择:
添加依赖:在项目根目录的
pubspec.yaml中声明插件依赖:dependencies: flutter: sdk: flutter battery_plus: ^4.0.2 # 替换为最新版本执行
flutter pub get完成依赖安装。调用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
相关产品推荐
相关产品推荐

