Flutter 颤振提供者之间的相互依赖关系

Flutter 颤振提供者之间的相互依赖关系,flutter,dart,state,Flutter,Dart,State,一个“提供者”类如何访问另一个“提供者”类中的元素 例如,“ApiController”需要UserInfo提供者提供的“userID”和“sessionToken” UserInfo提供程序需要从共享首选项加载这些项,但是如果这些项还不在SharedReferences中,例如在用户登录之前,那么它将为null,UserInfo需要提供这些项 UserInfo还需要ApiController从Api获取关于用户的其他信息,例如化身和其他属性。这是自愿不支持的。 提供者强制单向数据流以获得更好的

一个“提供者”类如何访问另一个“提供者”类中的元素

例如,“ApiController”需要UserInfo提供者提供的“userID”和“sessionToken”

UserInfo提供程序需要从共享首选项加载这些项,但是如果这些项还不在SharedReferences中,例如在用户登录之前,那么它将为null,UserInfo需要提供这些项


UserInfo还需要ApiController从Api获取关于用户的其他信息,例如化身和其他属性。

这是自愿不支持的。 提供者强制单向数据流以获得更好的代码质量


在您的情况下,一个潜在的解决方案是将ApicController拆分为多个部分,如UserController和SomethingController。

这是我关于如何处理这种特殊情况的建议:


您可以创建一个启动视图,该页面将在登录之前,在该页面上,您需要处理数据是否保存在SharedReferences中。因此,让我们执行以下操作:您需要在这个类中创建一个用户DAO,您将包括3个函数(saveUser()、getUser()和removeUser()),因此在API类中,当您记录响应成功时,您将调用saveUser()并将用户数据保存到getUser()中的SharedReferences中检查SharedReferences中是否存在这些值,如果存在,则返回数据,如果不存在,则返回消息。稍后在Splash bloc中调用getUser()的值,并在视图中检查这些值是否存在,然后导航到下一页或发出错误消息,这需要编写很多代码,但相信我是最好的方法。我差点忘了说removeUser()用于注销,函数非常简单,只需从SharedReferences中删除值即可

我想我会使ApicController本身成为单例。你可以。但这不是提供商希望您做的。单例太容易访问,也不容易测试ApiController来自一个外部包,所以我将把它的测试委托给另一个包。但这更复杂。在加载页面上,如果应用程序尚未登录,则重定向到登录流(步骤1询问用户电子邮件,步骤2询问一次性PIn,步骤3欢迎/设置自己的个人资料,然后直接转到登录页面)。另一方面,如果用户已登录,则还有许多其他工作要做(自上次登录后进行同步等)