Сочетание батареи и Wakelock не дает желаемого результата - PullRequest
1 голос
/ 23 октября 2019

В настоящее время я пытаюсь создать приложение, которое выполняет следующее:

1) При подключении к источнику питания не разрешайте устройству переходить в спящий режим 2) При отключении от питания разрешайте устройству переходить в спящий режим

В настоящее время я использую плагин «Аккумулятор», чтобы определить, идет ли речь о устройстве или нет. Использую is.

https://pub.dev/packages/wakelock

Код для этого:

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 секунд функция пробуждения по-прежнему не активируется и по-прежнему не переходит в спящий режим.

Я сделал новый проект, в котором я оставил всю плиту котла и просто добавил это в функцию _incrementCounter (). (Я также сделал это асинхронно. Здесь всякий раз, когда я нажимаю кнопку для переключения между включением и отключением wakelock, он работает просто отлично, только когда wakelock реагирует на смену батареи, он почему-то не работает.

var isEnabled = await Wakelock.isEnabled;

if (isEnabled) {
  await Wakelock.disable();
} else {
  await Wakelock.enable();
}

Надеюсь, кто-то знает, что может быть причиной странного поведения.

...