12

dagger在 android 应用程序中使用 DI。我可以为模块之外的其他类提供变量,但如何更新它们?

示例:登录

我需要一个可以提供 User的 AuthenticationModule 。应用启动时,用户未登录,因此为空。但是在认证成功后,LoginActivity 需要设置 User 的值,使其可以通过 AuthenticationModule 被应用的其他部分访问。

简单地设置注入字段的值并不能为我完成这项工作。

甚至可能吗?

4

2 回答 2

15

我有类似的问题,我做了这样的事情:

包装:

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 LoggedUserProvidergetter/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(将登录的用户传递给构造函数)并重新创建整个图。
这只是想法,我从来没有这样做过。

于 2014-09-03T13:51:55.933 回答
1

通过一遍又一遍地重新分配用户对象本身,ObjectGraph无法将新分配的对象传递给其他类。

我通过实现一个AuthenticationHandler保存用户对象的方法解决了这个问题。所以只有一个被注入的对象实现了类似的方法setCurrentUser()

于 2014-09-03T13:30:24.853 回答