我在使用flutter_bloc在Flutter上实现一个应用程序时遇到了问题。我理解了核心概念,但我发现了一个“边缘情况”,其中没有示例或指南(至少我能找到):
(我将简化问题)我有一个名为AuthBloc的块来管理App。如果状态为NotAuthenticated,则应用程序应显示LoginScreen,但如果状态为Authenticated,则应用程序应显示HomeScreen。在API内部,我有4个块,每个块都有自己的状态和事件,但它们都依赖于不同的Repositories来从HomeScreen获取一些数据。
所有的Repositories都需要一个令牌来发出请求。第一个问题出现在这里。如何从所有存储库获取令牌?如果我使用UserRepository来存储令牌,我将需要将其作为依赖项传递给每个存储库(可能可以工作,但我不认为这是正确的方法)。那么,管理这一问题的正确方法是什么呢?
第二个问题是:
如果我以某种方式可以在所有存储库查询中获得令牌,那么当令牌被撤销时会发生什么?应用程序应该返回到LoginScreen,为此,我需要通过一个事件(例如InvalidTokenEvent)通知AuthBloc。AuthBloc应将其状态更改为NotAuthenticated,这将重建LoginScreen。但问题是:我如何从其他区块或存储库通知AuthBloc?我的第一个想法是通过依赖注入:我可以将AuthBloc传递给构造函数中的每个其他块,这样当存储库请求返回一个过期的令牌时,XBloc就可以调用AuthBloc.add(InvalidTokenEvent)。但同样,如果我有很多区块,我需要在每个区块中这样做。那么,什么才是正确的方法呢?
谢谢你的帮助!
发布于 2021-09-17 16:32:55
所有的存储库都需要一个令牌来发出API请求。第一个问题出现在这里。如何从所有存储库获取令牌?如果我使用UserRepository来存储令牌,我将需要将其作为依赖项传递给每个存储库(可能可以工作,但我不认为这是正确的方法)。那么,管理这一问题的正确方法是什么呢?
这不是一个糟糕的实践(将其作为依赖项添加),但为了使其更容易,您可以使用getIt和可注入库来获得适当的依赖项注入解决方案。
另一种方法是向网络层添加拦截器,即在发出http请求之前,您可以拦截您的请求,将token添加到该层的请求中,然后进入请求阶段。
大多数网络库都有请求和响应拦截器,如下所示:
但这不是Bloc库的问题。
如果我以某种方式可以在所有存储库查询中获得令牌,那么当令牌被撤销时会发生什么?
您可以添加另一个响应拦截器来检测您是否有未经验证的响应,以便您可以注销用户。
使用getIt,您可以从全局依赖项容器和注销用户中获得该块。
https://stackoverflow.com/questions/61165810
复制相似问题