Доступ к strings.xml из ViewModel

Я использую Dagger 2 DataBindng и новые компоненты жизненного цикла Android, в которых есть ViewModels.

Внутри моего ViewModel как я могу получить доступ к моему strings.xml? Сначала я думал ввести Context в viewModel, однако это просто приведет к утечке памяти.

Есть ли другие способы?


person Robert J. Clegg    schedule 27.09.2017    source источник


Ответы (1)


Существует AndroidViewModel, который получает экземпляр Application в качестве параметра.

Из документов:

ViewModel с учетом контекста приложения.

Подклассы должны иметь конструктор, принимающий Приложение в качестве единственного параметра.

Вы можете получить строку из strings.xml, используя этот параметр.


Однако репо в ссылке использует ViewModel, а не AndroidViewModel. Если я расширю свою ViewModel для использования AndroidViewModel и включу Приложение - он попытается ввести MyApplication вместо Application, если в этом есть смысл.

Я проверил GithubBrowserSample. Вот как выглядит UserViewModel:


    public class UserViewModel extends ViewModel {
        ...
        @Inject
        public UserViewModel(UserRepository userRepository, RepoRepository repoRepository) {
            ...
        }
        ...
    }

И вот какие изменения я сделал:


    public class UserViewModel extends AndroidViewModel {
        ...
        @Inject
        public UserViewModel(Application application, UserRepository userRepository, RepoRepository repoRepository) {
            super(application);
            ...
        }
        ...
    }

person azizbekian    schedule 27.09.2017
comment
На самом деле, у меня все еще есть проблема. Поскольку я использую Dagger, я использую инъекцию конструктора в своих моделях. Это означает, что я не могу использовать AndroidViewModel. Любые идеи? - person Robert J. Clegg; 27.09.2017
comment
Посмотрите, как ViewModels вводятся в GithubBrowserSample. - person azizbekian; 27.09.2017
comment
Вот как я ввожу свои ViewModels. Однако репо в ссылке использует ViewModel, а не AndroidViewModel. Если я расширю свою ViewModel для использования AndroidViewModel и включу приложение - он попытается ввести MyApplication вместо Application, если это имеет смысл. - person Robert J. Clegg; 27.09.2017
comment
Можете ли вы по-прежнему проводить модульное тестирование ViewModel с JUnit? Если мне просто нужно передать строки из ViewModel для просмотра, не будет ли более точным, если я передам идентификаторы строковых ресурсов обратно из Viewmodel в View? - person mallaudin; 26.04.2019
comment
@mallaudin, вы правы, лучше передавать идентификаторы строк вместо самих строк, одна из причин этого изложена в этот пост. - person azizbekian; 26.04.2019
comment
Спасибо @azizbekian за то, что поделился постом. - person mallaudin; 26.04.2019