我在android应用程序中使用dagger
进行DI。我可以向模块之外的其他类提供变量,但如何更新它们
示例:登录
我需要一个能够提供用户的AuthenticationModule。当应用程序启动时,用户未登录,因此为null。但在成功验证后,LoginActivity需要设置用户的值,使其可以通过应用程序的其他部分访问通过AuthenticationModule。
简单地设置注入字段的值对我来说是不可行的。
这可能吗?
我遇到了类似的问题,我做了这样的事情:
包装:
class LoggedUserProvider {
private User user;
User getLoggedUser() {
return user;
}
void setLoggedUser(User user) {
this.user = user;
}
}
模块:
@Module(injects = Endpoint.class)
public class AuthenticationModule {
@Provides
@Singleton
LoggedUserProvider provideLoggedUserProvider() {
return new LoggedUserProvider();
}
}
之后,您可以使用@Inject LoggedUserProvider
,只需使用getter/setter来设置当前登录的用户
或
如果你想在没有包装的情况下制作这个模块,我想你需要制作这个模块:
@Module(injects = Endpoint.class)
public class AuthenticationModule {
@Provides
User provideUser() {
return null;
}
}
这个,但在授权之前不包括这个:
@Module(overrides = true)
public class CurrentUserModule {
User currentUser;
public CurrentUserModule(User currentUser) {
this.currentUser = currentUser;
}
@Provides
@Singleton
User provideUser() {
return currentUser;
}
}
然后,在授权之后,将该模块添加到objectGraph中(将记录的用户传递给构造函数),并重新创建整个图
这只是个主意,我从来没有这样做过。
通过一次又一次地重新分配User对象本身,ObjectGraph无法将新分配的对象传递给其他类。
我通过实现一个保存用户对象的AuthenticationHandler
解决了这个问题。因此,只有一个Object被注入,它实现了setCurrentUser()
等方法