Флаттер эквивалентен LocalBroadcastManager и NSNotificationCenter - PullRequest
0 голосов
/ 31 августа 2018

Я занимаюсь разработкой приложения Flutter, которое синхронизирует данные в фоновом режиме. На разных экранах я хочу показать статус синхронизации. Поэтому я хочу передать события «синхронизация успешно» и «синхронизация не удалась» на любой экран, который подписан на них. После некоторых исследований лучшим Flutter-эквивалентом для Android LocalBroadcastManager и iOS NSNotificationCenter представляется StreamController.broadcast. Однако во всех примерах Broadcast создается в классе / модели, когда он используется, но в моем случае, когда создается экран, он должен подписаться на него, поэтому трансляция должна быть уже там, в то время как экземпляр API можно создать до или после этого.

Единственное решение, которое я придумал, - это иметь статический StreamController.broadcast в API-классе, на который подписываются и отписываются все экраны, а сам API-класс доставляет события:

class ApiRequest {
  static StreamController syncDoneController = StreamController.broadcast();

  Future startSync() async {
    List response = await executeRequest("");
    if (response == null) {
      syncDoneController.add("failed");
    } else {
      syncDoneController.add("success");
    }
  }
}

class _SomeScreenState extends State<SomeScreen> {
  StreamSubscription<dynamic> _streamSubscription;

  @override
  void initState() {
    super.initState();
    _streamSubscription = ApiRequest.syncDoneController.stream.listen((value) {
      apiUpdated(value);
    });
  }

  @override
  void dispose() {
    _streamSubscription.cancel();
    super.dispose();
  }

  void apiUpdated(String result) async {
    if (result == "failed") {
      // show "failed" state
    } else {
      // show "success" state
    }
  }
}

Это работает нормально, но я получаю предупреждение о том, что syncDoneController должен быть закрыт. Поскольку он статичен, я хочу, чтобы он сохранялся на протяжении всего жизненного цикла приложения, но я боюсь, что это утечка памяти или могут возникнуть другие проблемы.

Есть ли лучший подход для этого или это правильный путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...