BLoC 中的逻辑应如何触发一次性 UI 警报(例如对话框或小吃栏)?

Bry*_*ill 8 dart flutter bloc

当使用 BLoC 模式将业务逻辑与视图隔离(没有bloc 库)时,当 BLoC 中的某些异步逻辑完成时,我们如何触发一次性 UI 调用(例如显示小吃栏或警报对话框)?例如,如果网络请求失败,我们希望显示一个对话框,通知用户无法获取某些数据。

我探索过的选项是:

  1. 在小部件的构建方法中使用 aStreamBuilder来侦听来自块的事件,并在 StreamBuilder 的构建方法中显示对话框。这种方法的问题在于StreamBuildersbuild方法实际上不会在这里构建任何东西。我们只是要求 Flutter 显示一个对话框。我们可以返回一些看不见的“假”小部件,只是为了让 Flutter 高兴,但这确实很hacky。

  2. 使小部件有状态。在 中initState,订阅来自 BLoC 的错误流,并在侦听器中显示对话框。这里我们保持逻辑/视图的解耦,但据我所知,这个选项甚至不可行,因为我们不需要BuildContext显示对话框。

  3. 当小部件调用 BLoC 上的某些逻辑(可能会导致触发对话框的更改)时,请传入显示对话框的回调。在这里列出的选项中,我更喜欢这个。逻辑和视图仍然是相当分离的,但感觉有点奇怪。BLoC 模式中的数据流通常纯粹是“小部件 -> 通过接收器或函数的 BLoC”和“BLoC -> 通过流的小部件”。在执行某些逻辑后,让小部件要求 BLoC 调用回调(将数据传回)是违反此模式的。

我一直在避免使用 bloc 库(为了保持简单,以及其他原因)。然而,它似乎确实以其BlocListener. 有没有一种简单的方法可以解决这个问题,同时保持 BLoC 的核心原则?

Bry*_*ill 1

经过StatefulWidget更多研究后,我发现我们实际上确实可以访问BuildContext contextin initState。因此,选项 #2 毕竟是可行的。它允许我们将逻辑和视图分开,并保持数据仅使用流从 BLoC 流到小部件的模式。

State重申一下解决方案:BLoC 可以公开有状态小部件可以在的中订阅的数据流(例如错误代码)initStatecontext当流发出一些数据时,侦听器可以使用该属性来显示对话框。