Come altri hanno già detto, c'è da AndroidViewModel
cui puoi derivare per ottenere l'app, Context
ma da quello che raccolgo nei commenti, stai cercando di manipolare @drawable
i messaggi di posta elettronica dall'interno del tuo ViewModel
che sconfigge lo scopo MVVM.
In generale, la necessità di avere una Context
nella vostra ViewModel
suggerisce quasi universalmente si dovrebbe considerare ripensare come si divide la logica tra le View
s e ViewModels
.
Invece di dover ViewModel
risolvere i drawable e fornirli all'attività / frammento, considera che il frammento / attività manipoli i drawables in base ai dati posseduti dal file ViewModel
. Supponiamo che tu abbia bisogno di diversi drawable da visualizzare in una vista per lo stato on / off - è lo stato ViewModel
che dovrebbe contenere lo stato (probabilmente booleano) ma è View
compito di selezionare il drawable di conseguenza.
Può essere fatto abbastanza facilmente con DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Se hai più stati e drawables, per evitare logiche ingombranti nel file di layout puoi scrivere un BindingAdapter personalizzato che traduca, ad esempio, un Enum
valore in R.drawable.*
(ad esempio semi di carte)
O forse hai bisogno Context
di qualche componente che usi all'interno del tuo ViewModel
- quindi, crea il componente all'esterno di ViewModel
e passalo dentro. Puoi usare DI, o singleton, o creare il Context
componente -dependent subito prima di inizializzare l' ViewModel
in Fragment
/ Activity
.
Perché preoccuparsi: Context
è una cosa specifica di Android e dipendere da quelli in ViewModel
s è una cattiva pratica: ostacolano i test unitari. D'altra parte, le interfacce dei tuoi componenti / servizi sono completamente sotto il tuo controllo, quindi puoi facilmente deriderle per i test.
AndroidViewModel
ma ottenereCannot create instance exception
allora si può fare riferimento alla mia questa risposta stackoverflow.com/a/62626408/1055241