我正在开发一个Flutter应用,该应用在后台同步数据。我想在不同的屏幕上显示同步状态。因此,我想将事件“同步成功”和“同步失败”传递给订阅它们的任何屏幕。经过一些调查,最好的Flutter等效于Android LocalBroadcastManager和iOS NSNotificationCenter似乎是StreamController.broadcast
。但是,在所有示例中,使用广播时都会在类/模型中实例化广播,但是在我的情况下,创建屏幕时必须订阅它,因此广播必须已经存在,而可以实例化API类在此之前或之后。
我想到的唯一解决方案是在API类中有一个静态StreamController.broadcast
,所有屏幕都可以订阅和取消订阅,而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。由于它是静态的,因此我希望它可以保留整个应用程序生命周期,但是我担心这是内存泄漏,否则可能会导致其他任何问题。
有更好的方法还是正确的方法?