Flutter插件开发--获取Android手机电池信息
由于我不會做IOS開發,文章里面沒有IOS的代碼。下面的參考教程里有具體的IOS代碼
參考教程:flutter中文網–Flutter實戰–插件開發,平臺介紹和實現Android端API
?最后的執行效果如下:
平臺通道
?平臺指的是flutter運行的平臺,如Android或者ios,可以認為就是應用的原生部分,所以,平臺通道正是Flutter和原生之間通信的橋梁,它也是Flutter插件的底層基礎設施。
?Flutter使用了一個靈活的系統,允許調用特定平臺的API,無論在Android上的Java或者Kotlin代碼中,還是在IOS上的OC或者swift代碼中均可用。
?Flutter與原生之間的通信依賴靈活的消息傳遞方式:
- 應用的Flutter部分通過平臺通道(platform channel)將消息發送到其應用程序所在的宿主(IOS或者Android)應用(原生應用)
- 宿主監聽平臺通道,并接受該消息,然后它會調用該平臺的API,并將響應發送回客戶端,即應用程序的Flutter部分。
?使用平臺通道在Flutter(client)和原生(host)之間傳遞消息,如下圖所示:
?當在Flutter中調用原生方法時,調用信息通過平臺通道傳遞到原生,原生收到調用信息后可以執行指定的操作,如果需要返回數據,則原生會將數據再通過平臺通道傳遞給Flutter,需要注意的是消息的傳遞是異步的,這確保了用戶界面再消息傳遞時不會被掛起。
?在客戶端,MethodChannel API可以發送與方法調用相對應的消息,在宿主平臺上,MethodChannel在Android API和FlutterMethodChannel IOS API可以接收方法調用并返回結果,這些類可以幫助我們用很少的代碼就能開發平臺插件。
?如果需要,方法調用(消息傳遞)可以是反向的,即宿主作為客戶端調用Dart中實現的API,quick_actions插件就可以這么做。
開發Flutter插件
?使用平臺通道調用原生代碼
?下面是一個獲取電池電量的插件,該插件在Dart中通過getBatteryLevel調用Android BatteryManager API和IOS的相關API。
?Flutter中的代碼如下:
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart';/*** 插件開發--獲取宿主平臺的電量信息*/class BetteryInfoPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("插件開發--獲取電量",style: TextStyle(color: Colors.greenAccent,),maxLines: 1,overflow: TextOverflow.ellipsis,),elevation: 0.0,backgroundColor: Colors.lime,),body: BetteryInfoRoute(),);} }class BetteryInfoRoute extends StatefulWidget {@override_BetteryInfoRouteState createState() {return _BetteryInfoRouteState();} }class _BetteryInfoRouteState extends State with SingleTickerProviderStateMixin {static const platform = const MethodChannel("samples.flutter.io/battery");//默認電量100%double _currentBetteryInfo = 100;//當前的文字顏色,根據不同的電量改變Color _betteryColor = Colors.greenAccent;//動畫控制器AnimationController _animationController;//動畫Animation _animation;//顯示當前獲取電量的狀態信息String _currentState = "正在獲取信息";@overridevoid initState() {// TODO: implement initStatesuper.initState();setBatteryColor();getValueColorAnimation();_getBatteryLevel();}@overrideWidget build(BuildContext context) {//一個圓形進度條中間顯示電量的百分比return Center(child: Stack(alignment: Alignment.center,children: <Widget>[Container(constraints: BoxConstraints.expand(width: 120.0, height: 120.0),child: CircularProgressIndicator(backgroundColor: Colors.redAccent,valueColor: _animation,value: _currentBetteryInfo / 100,),),Padding(padding: EdgeInsets.all(10.0),child: Text(_currentState,style: TextStyle(color: _betteryColor,),),),],),);}//設置動畫void getValueColorAnimation() {if (_animationController == null) {_animationController =AnimationController(duration: Duration(seconds: 5), vsync: this);}_animation =CurvedAnimation(parent: _animationController, curve: Curves.ease);_animation = Tween(begin: _betteryColor, end: Colors.greenAccent).animate(_animation);}//設置不同電量的顏色void setBatteryColor() {if (_currentBetteryInfo > 80) {_betteryColor = Colors.greenAccent;} else if (_currentBetteryInfo > 50) {_betteryColor = Colors.orangeAccent;} else {_betteryColor = Colors.redAccent;}}//獲取電量Future<Null> _getBatteryLevel() async {try {_currentBetteryInfo = await platform.invokeMethod("getBatteryLevel");_currentState = "${_currentBetteryInfo.toString()}%";} on PlatformException catch (e) {//出現異常_currentState = "failed";} finally {//最終都會執行刷新操作setState(() {setBatteryColor();getValueColorAnimation();});}} }//Android中的代碼如下:
package com.example.basicwidgetdemo1;import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Build; import android.os.Bundle;import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.GeneratedPluginRegistrant;public class MainActivity extends FlutterActivity {private static final String CHANNEL = "samples.flutter.io/battery";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GeneratedPluginRegistrant.registerWith(this);new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(new MethodChannel.MethodCallHandler() {@Overridepublic void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {if(methodCall.method.equals("getBatteryLevel")){double batteryLevel = getBatteryLevel();if(batteryLevel != -1){result.success(batteryLevel);}else{result.error("UNAVAILABLE","Battery level not available",null);}}else{result.notImplemented();}}});}//獲取手機剩余電量private double getBatteryLevel(){double battery = -1;if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){BatteryManager manager = (BatteryManager) getSystemService(BATTERY_SERVICE);battery = manager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);}else{Intent intent = new ContextWrapper(getApplicationContext()).registerReceiver(null,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));battery = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,-1) / intent.getIntExtra(BatteryManager.EXTRA_SCALE,-1);}return battery;} }總結
以上是生活随笔為你收集整理的Flutter插件开发--获取Android手机电池信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kodi mysql_Kodi
- 下一篇: dsp和通用计算机的区别,汽车dsp和功