Обновление значений кинжала Android за пределами модуля

Я использую dagger для DI в приложении для Android. Я могу предоставить переменные другим классам за пределами модулей , но как их обновить?

Пример: Вход

Мне нужен AuthenticationModule, который может Предоставить пользователя. Когда приложение запускается, Пользователь не входит в систему, поэтому он равен нулю. Но после успешной аутентификации LoginActivity необходимо установить значение Пользователя, чтобы сделать его доступным через другие части приложения через AuthenticationModule.

Просто установка значений введенного поля не выполняет эту работу для меня.

Возможно ли это?

Ответ 1

У меня была проблема simillar, и я сделал что-то вроде этого:

обертка:

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;
    }
}

то после авторизации добавьте этот модуль к объектуGraph (передайте зарегистрированного пользователя в конструктор) и заново создайте весь граф.
Это просто идея, я никогда не делаю этого таким образом.

Ответ 2

Повторно назначая сам объект User снова и снова, ObjectGraph не может передать вновь назначенный объект другим классам.

Я решил проблему, выполнив AuthenticationHandler, который содержит пользовательский объект. Таким образом, вводится только один объект, который реализует такие методы, как setCurrentUser()