Como otros han mencionado, hay algo de AndroidViewModel
lo que puede derivar para obtener la aplicación, Context
pero por lo que recopilé en los comentarios, está tratando de manipular los mensajes de correo electrónico @drawable
desde su interior, lo ViewModel
que frustra el propósito de MVVM.
En general, la necesidad de tener un Context
en su ViewModel
casi universal sugiere que debería considerar repensar cómo divide la lógica entre sus View
y ViewModels
.
En lugar de ViewModel
resolver los elementos dibujables y alimentarlos con la Actividad / Fragmento, considere hacer que el Fragmento / Actividad haga malabarismos con los elementos dibujables en función de los datos que posee ViewModel
. Digamos que necesita que se muestren diferentes elementos de diseño en una vista para el estado de encendido / apagado; es el ViewModel
que debería contener el estado (probablemente booleano), pero View
es asunto de ellos seleccionar el elemento de diseño en consecuencia.
Se puede hacer bastante fácil con DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Si tiene más estados y elementos de diseño, para evitar una lógica difícil de manejar en el archivo de diseño, puede escribir un BindingAdapter personalizado que traduzca, digamos, un Enum
valor en R.drawable.*
(por ejemplo, juegos de cartas)
O tal vez lo que necesita el Context
por algún componente que se utiliza dentro de su ViewModel
- a continuación, crear el componente fuera del mismo ViewModel
y pasarlo en Puede utilizar DI, o únicos, o crear el. Context
Derecho componente dependiente antes de inicializar el ViewModel
en Fragment
/ Activity
.
Por qué molestarse: Context
es algo específico de Android, y depender de los de ViewModel
s es una mala práctica: se interponen en el camino de las pruebas unitarias. Por otro lado, sus propias interfaces de componentes / servicios están completamente bajo su control, por lo que puede simularlas fácilmente para probarlas.
AndroidViewModel
pero lo obtengaCannot create instance exception
, puede consultar esta respuesta stackoverflow.com/a/62626408/1055241