Флаттер: как отслеживать жизненный цикл приложения без виджета - PullRequest
0 голосов
/ 27 апреля 2020

Я участвую в проекте FlutterSound, который поставляется в виде пакета, содержащего API, который для целей этого вопроса не содержит виджет.

API должен обрабатывать события, когда приложение меняет свое состояние (AppLifecycleState.pause / resume). (нам нужно остановить / возобновить звук, когда приложение приостановлено / возобновлено).

Я могу видеть, как сделать это в виджете, используя WidgetsBindingObserver, но API нуждается в этой же информации, не полагаясь на виджет.

Класс SchedulerBinding имеет метод handleAppLifecycleStateChanged, который, по-видимому, предоставляет требуемую информацию, но неясно, как реализовать это вне виджета.

1 Ответ

1 голос
/ 05 мая 2020

Ниже приведен пример кода, который может прослушивать AppLifecycleState изменения событий без непосредственного участия виджета:

import 'package:flutter/material.dart';

class MyLibrary with WidgetsBindingObserver {
  AppLifecycleState _state;

  AppLifecycleState get state => _state;

  MyLibrary() {
    WidgetsBinding.instance.addObserver(this);
  }

  /// make sure the clients of this library invoke the dispose method
  /// so that the observer can be unregistered
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    this._state = state;
  }

  void someFunctionality() {
    // your library feature
  }
}

Теперь вы можете создать экземпляр библиотеки в виджете флаттера, например, откуда он начнет прослушивать любые изменения в AppLifecycleState.

Обратите внимание, что приведенный выше код не заботится о избыточных привязках. Например, если клиент вашей библиотеки предназначен для инициализации библиотеки более одного раза в разных местах, метод didChangeAppLifecycleState() будет запускаться несколько раз за изменение состояния (в зависимости от количества созданных экземпляров библиотеки). Также я не уверен, что предлагаемое решение соответствует лучшим практикам. Тем не менее, это решает проблему и надеюсь, что это поможет!

...