Я занимаюсь разработкой приложения 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 должен быть закрыт. Поскольку он статичен, я хочу, чтобы он сохранялся на протяжении всего жизненного цикла приложения, но я боюсь, что это утечка памяти или могут возникнуть другие проблемы.
Есть ли лучший подход для этого или это правильный путь?