【问题标题】:Global dependency on flutter_bloc对flutter_bloc的全局依赖
【发布时间】:2020-07-24 17:00:39
【问题描述】:

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

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

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

第二个问题是:

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

感谢您的帮助!

【问题讨论】:

    标签: flutter dart bloc flutter-bloc


    【解决方案1】:

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

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

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

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

    但这不是 Bloc 库的问题。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 2015-07-15
      • 2020-08-21
      • 1970-01-01
      • 2011-05-27
      • 2015-07-24
      • 2013-05-17
      • 1970-01-01
      相关资源
      最近更新 更多