结合使用电池和唤醒锁不会产生预期的结果
Combining Battery and Wakelock does not give desired outcome
目前我正在尝试构建一个执行以下操作的应用程序:
1) 接通电源后不允许设备进入休眠状态
2) 断开电源后让设备进入睡眠状态
目前我正在使用电池插件来检测设备是否正在充电。
我正在使用的唤醒锁包是。
代码是:
class _MyHomePageState extends State<MyHomePage> {
Battery _battery = Battery();
bool wakeLockEnabled;
BatteryState _batteryState;
StreamSubscription<BatteryState> _batteryStateSubscription;
Color bgColor = Colors.white;
@override
void initState() {
super.initState();
_batteryStateSubscription =
_battery.onBatteryStateChanged.listen((BatteryState state) {
setState(() {
_batteryState = state;
_shouldWakelock();
});
});
}
void _shouldWakelock() async {
wakeLockEnabled = await Wakelock.isEnabled;
if (_batteryState == BatteryState.charging) {
if (!wakeLockEnabled) {
setState(() {
Wakelock.enable();
bgColor = Colors.green;
});
}
} else if (_batteryState == BatteryState.discharging) {
if (wakeLockEnabled) {
setState(() {
Wakelock.disable();
bgColor = Colors.red;
});
}
} else if (_batteryState == BatteryState.full) {
setState(() {
Wakelock.disable();
bgColor = Colors.yellow;
});
}
wakeLockEnabled = await Wakelock.isEnabled;
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('$_batteryState'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 100,
height: 100,
color: bgColor,
),
Text('$wakeLockEnabled'),
],
),
),
);
}
@override
void dispose() {
super.dispose();
if (_batteryStateSubscription != null) {
_batteryStateSubscription.cancel();
}
}
}
目前以下测试给出以下结果(这都是使用 iPhone 7)
设备连接到 Mac 应用程序通过 IntelliJ 启动,应用程序完全启动后设备不会进入休眠状态,然后在应用程序 运行 大约 30 秒后设备进入休眠状态。
设备已连接电源并从设备屏幕启动应用程序,设备永远不会进入休眠状态,当断开电源时设备仍然不会进入休眠状态。
应用程序通过设备本身启动,设备未连接电源,设备永不休眠。
应用程序通过设备本身启动,设备未连接电源,设备不进入睡眠状态,当插入电源线并在大约 10 秒后再次拔下时wakelock 仍未激活,仍未进入休眠状态。
我创建了一个新项目,其中保留了所有样板,并将其添加到 _incrementCounter() 函数中。 (我也让它异步。在这里,每当我按下一个按钮在启用和禁用唤醒锁之间切换时,它工作得很好,只有当唤醒锁响应电池变化时它才会因为某种原因不起作用。
var isEnabled = await Wakelock.isEnabled;
if (isEnabled) {
await Wakelock.disable();
} else {
await Wakelock.enable();
}
我希望有人知道可能导致奇怪行为的原因。
FWIW:我认为这只会在调试时发生。这意味着当为发布构建代码时,问题没有发生。
目前我正在尝试构建一个执行以下操作的应用程序:
1) 接通电源后不允许设备进入休眠状态 2) 断开电源后让设备进入睡眠状态
目前我正在使用电池插件来检测设备是否正在充电。
我正在使用的唤醒锁包是。
代码是:
class _MyHomePageState extends State<MyHomePage> {
Battery _battery = Battery();
bool wakeLockEnabled;
BatteryState _batteryState;
StreamSubscription<BatteryState> _batteryStateSubscription;
Color bgColor = Colors.white;
@override
void initState() {
super.initState();
_batteryStateSubscription =
_battery.onBatteryStateChanged.listen((BatteryState state) {
setState(() {
_batteryState = state;
_shouldWakelock();
});
});
}
void _shouldWakelock() async {
wakeLockEnabled = await Wakelock.isEnabled;
if (_batteryState == BatteryState.charging) {
if (!wakeLockEnabled) {
setState(() {
Wakelock.enable();
bgColor = Colors.green;
});
}
} else if (_batteryState == BatteryState.discharging) {
if (wakeLockEnabled) {
setState(() {
Wakelock.disable();
bgColor = Colors.red;
});
}
} else if (_batteryState == BatteryState.full) {
setState(() {
Wakelock.disable();
bgColor = Colors.yellow;
});
}
wakeLockEnabled = await Wakelock.isEnabled;
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('$_batteryState'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 100,
height: 100,
color: bgColor,
),
Text('$wakeLockEnabled'),
],
),
),
);
}
@override
void dispose() {
super.dispose();
if (_batteryStateSubscription != null) {
_batteryStateSubscription.cancel();
}
}
}
目前以下测试给出以下结果(这都是使用 iPhone 7)
设备连接到 Mac 应用程序通过 IntelliJ 启动,应用程序完全启动后设备不会进入休眠状态,然后在应用程序 运行 大约 30 秒后设备进入休眠状态。
设备已连接电源并从设备屏幕启动应用程序,设备永远不会进入休眠状态,当断开电源时设备仍然不会进入休眠状态。
应用程序通过设备本身启动,设备未连接电源,设备永不休眠。
应用程序通过设备本身启动,设备未连接电源,设备不进入睡眠状态,当插入电源线并在大约 10 秒后再次拔下时wakelock 仍未激活,仍未进入休眠状态。
我创建了一个新项目,其中保留了所有样板,并将其添加到 _incrementCounter() 函数中。 (我也让它异步。在这里,每当我按下一个按钮在启用和禁用唤醒锁之间切换时,它工作得很好,只有当唤醒锁响应电池变化时它才会因为某种原因不起作用。
var isEnabled = await Wakelock.isEnabled;
if (isEnabled) {
await Wakelock.disable();
} else {
await Wakelock.enable();
}
我希望有人知道可能导致奇怪行为的原因。
FWIW:我认为这只会在调试时发生。这意味着当为发布构建代码时,问题没有发生。