flutter项目中有个需求,针对手机是否在充电进行判断走不同的业务逻辑.
一、错误尝试
1、经过查找资料: 需要使用插件battery_plus
battery_plus: ^4.0.2
代码实现
// 引入
import 'package:battery_plus/battery_plus.dart';
// 实现
final Battery _battery = Battery();
BatteryState state = await _battery.batteryState;、
if (state == BatteryState.charging) {
// 充电中
}
2、经过尝试此方法无效.
二、正确方法
思路: 既然flutter插件无用, 只能采用iOS原生的方法,获取到状态后在flutter中读取
1、先获取充电状态 iOS原生文件
// 查询电池可用状态
var enable = UIDevice.current.isBatteryMonitoringEnabled;
//enable = false;
// 设置状态可用
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、读取存储的电池充电状态。 flutter代码读取
// 2、电量
var res = SpUtil.getString("iosbattary");
if (res!=null && res.toString()!="3") {
//非插电状态
}
3、关于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读取本地数据时Key添加了一个flutter.的前缀