flutter項目中有個需求,針對手機(jī)是否在充電進(jìn)行判斷走不同的業(yè)務(wù)邏輯.
一、錯誤嘗試
1、經(jīng)過查找資料: 需要使用插件battery_plus
battery_plus: ^4.0.2
代碼實現(xiàn)
// 引入
import 'package:battery_plus/battery_plus.dart';
// 實現(xiàn)
final Battery _battery = Battery();
BatteryState state = await _battery.batteryState;、
if (state == BatteryState.charging) {
// 充電中
}
2、經(jīng)過嘗試此方法無效.
二、正確方法
思路: 既然flutter插件無用, 只能采用iOS原生的方法,獲取到狀態(tài)后在flutter中讀取
1、先獲取充電狀態(tài) iOS原生文件
// 查詢電池可用狀態(tài)
var enable = UIDevice.current.isBatteryMonitoringEnabled;
//enable = false;
// 設(shè)置狀態(tài)可用
UIDevice.current.isBatteryMonitoringEnabled = true;
// UserDefaults存儲到本地
var user = UserDefaults.standard;
switch UIDevice.current.batteryState {
case .charging:
print("充電中");
user.set("1", forKey: "flutter.iosbattary")
case .full:
print("滿電");
user.set("2", forKey: "flutter.iosbattary")
case .unplugged:
print("未插電");
user.set("3", forKey: "flutter.iosbattary")
case .unknown:
print("未知");
user.set("4", forKey: "flutter.iosbattary")
default:
print("未知");
user.set("5", forKey: "flutter.iosbattary")
}
2、讀取存儲的電池充電狀態(tài)。 flutter代碼讀取
// 2、電量
var res = SpUtil.getString("iosbattary");
if (res!=null && res.toString()!="3") {
//非插電狀態(tài)
}
3、關(guān)于UserDefaults讀取問題
注意??: 在iOS端存儲時用的key是flutter.iosbattary 在flutter端讀取時用的是:iosbattary
查看flutter端UserDefaults的源碼:
Future<bool> _setValue(String valueType, String key, Object value) {
ArgumentError.checkNotNull(value, 'value');
final String prefixedKey = '$_prefix$key';
if (value is List<String>) {
// Make a copy of the list so that later mutations won't propagate
_preferenceCache[key] = value.toList();
} else {
_preferenceCache[key] = value;
}
return _store.setValue(valueType, prefixedKey, value);
}
static const String _prefix = 'flutter.';
注意看prefixedKey = 'key';
flutter讀取本地數(shù)據(jù)時Key添加了一個flutter.的前綴