当使用 BLoC 模式将业务逻辑与 View 隔离时(没有 bloc library ),当某些异步逻辑在 BLoC 中完成时,我们如何触发一次性 UI 调用(如显示 snackbar 或警报对话框)?例如,如果网络请求失败,我们希望显示一个对话框,通知用户无法获取某些数据。
我探索过的选项是:
StreamBuilder
来监听来自 bloc 的事件,并在 StreamBuilder 的构建方法中显示对话框。 这种方法的问题在于 StreamBuilder
的 build
方法实际上不会在这里构建任何东西。我们只是要求 Flutter 显示一个对话框。我们可以返回一些不可见的“假”小部件只是为了让 Flutter 开心,但这真的很糟糕。 initState
中,订阅来自 BLoC 的错误流,并在监听器中显示对话框。 这里我们保持逻辑/ View 的解耦,但据我所知,这个选项甚至不可行,因为我们没有显示对话框所需的 BuildContext
。 我一直在避免使用 bloc 库(为了保持简单,以及其他原因)。但是,它似乎确实以其
BlocListener
的形式提供了解决此问题的方法。在保持BLoC核心原则的情况下,有没有简单的方法可以解决这个问题?
最佳答案
我只是在研究这个确切的问题。这是我的解决方案 - 它属于第 2 类:
class CurrencyStreamListener extends StatefulWidget {
final Stream<CurrencyNotification> notificationStream;
final Widget child;
CurrencyStreamListener({this.notificationStream, this.child});
@override
_CurrencyStreamListenerState createState() => _CurrencyStreamListenerState();
}
class _CurrencyStreamListenerState extends State<CurrencyStreamListener> {
@override
void initState() {
widget.notificationStream.listen((CurrencyNotification data) {
if (data is NotificationOfIncrease) {
Scaffold.of(context).showSnackBar(
SnackBar(
duration: Duration(seconds: 1),
content: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Earned Currency'),
],
),
),
);
}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
这样我就可以在我可以访问 Bloc 流的任何地方嵌套这个小部件,所以可能在某些 Provider 或 Consumer 类下。
关于flutter - BLoC 中的逻辑应该如何触发一次性 UI 警报,例如对话框或 snackbar ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59992327/