5

我在使用Flutter_bloc在 Flutter 上实现应用程序时遇到问题。我理解了核心概念,但我发现了一个没有示例或指南的“边缘案例”(至少我能找到):

(我将简化问题)我有一个名为的集团AuthBloc来管理App. 如果状态是NotAuthenticated,则应用程序应显示 ,LoginScreen但如果是Authenticated,则应用程序应显示HomeScreen. 在里面HomeScreen我有 4 个块,每个块都有它的状态和事件,但是它们都依赖于不同Repositories的从 API 获取一些数据。

所有这些都Repositories需要一个令牌来发出 API 请求。第一个问题来了。如何从所有存储库中获取令牌?如果我使用 aUserRepository来存储令牌,我需要将它作为依赖项传递给每个存储库(可能有效,但我认为它不是正确的方法)。那么,管理这个问题的正确方法是什么?

第二个问题是:

如果我能以某种方式在所有存储库查询中获得令牌,那么当令牌被撤销时会发生什么?该应用程序应该返回到LoginScreen并且为此我需要AuthBloc通过事件通知 (例如InvalidTokenEvent)。并且AuthBloc应该将其状态更改为NotAuthenticated并且将重建LoginScreen. 但问题是:我如何AuthBloc从其他集团或存储库通知?我的第一个想法是通过依赖注入:我可以将 AuthBloc 传递给构造函数中的每个其他块,因此当存储库请求返回令牌过期时,XBloc可以调用AuthBloc.add(InvalidTokenEvent). 但同样,如果我有很多集团,我需要在每个集团中都这样做。那么,这样做的正确方法是什么?

感谢您的任何帮助!

4

1 回答 1

0

所有存储库都需要一个令牌来发出 API 请求。第一个问题来了。如何从所有存储库中获取令牌?如果我使用 UserRepository 来存储令牌,我需要将它作为依赖项传递给每个存储库(可能有效,但我认为这不是正确的方法)。那么,管理这个问题的正确方法是什么?

这不是一个不好的做法(将其添加为依赖项),但为了使其更容易,您可以使用 getIt 和可注入库来获得适当的依赖项注入解决方案。

另一种方法是,在你的网络层添加一个拦截器,也就是说,在发出 http 请求之前,你可以拦截你的请求,在该层向你的请求添加令牌,然后进入请求阶段。

大多数网络库都有请求和响应拦截器,如下所示:

但这不是 Bloc 库的问题。

如果我能以某种方式在所有存储库查询中获得令牌,那么当令牌被撤销时会发生什么?

您可以添加另一个响应拦截器来检测您是否有未经身份验证的响应,以便您可以注销用户。

使用getIt,您可以从全局依赖容器和注销用户中收集该块。

于 2021-09-17T16:32:55.060 回答