Сначала вам нужно изменить класс Model
:
class CategoryModel(.. NetManager, private val sharedPrefences: SharedPrefences)
, теперь вы можете получить applicationContext, используя AndroidViewModel
вместо ViewModel
, не пугайтесь получения статической ссылкиto applicationContext не обязательно плохая идея :
public class MyViewModel extends AndroidViewModel {
private val preferences: SharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getApplication())
private val netManager: NetManager
private val model = CategoryModel(netManager, preferences)
...
}
Теперь более элегантный способ - использовать Factory
для вставки зависимостей в ViewModel
this:
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final SharedPreferences mPreferences;
...
public Factory(@NonNull SharedPreferences preferences, ...) {
mPreferences = preferences;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked
return (T) new MyViewModel(mPreferences, ..);
}
}
PS: В идеале я хотел бы создать модель с использованием ServiceLocator или DependencyInjector и внедрить ее непосредственно в ViewModel
, используя упомянутый Factory
.