J'ai besoin d'accéder aux sharedPrefences dans ma classe de modèle car nous ne devrions pas accéder au contexte et aux vues de la classe de modèle, comment puis-je obtenir une valeur du modèle? Je ne veux pas analyser chacune de mes variables en viewmodel
et ensuite ma classe de modèle.
classe de modèle:
class CategoryModel(private val netManager: NetManager) { var dateChanges: String = "null"; var isLoading= ObservableField<Boolean>(false) fun getCats(): MutableLiveData<MutableList<Cat>> { isLoading.set(true) var list = MutableLiveData<MutableList<Cat>>(); if (netManager.isConnected!!) { list = getCatsOnline(); } return list } private fun getCatsOnline(): MutableLiveData<MutableList<Cat>> { var list = MutableLiveData<MutableList<Cat>>(); val getCats = ApiConnection.client.create(Category::class.java) Log.v("this","uid "+MyApp().uid) getCats.getCats(MyApp().uid, dateChanges) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { success -> isLoading.set(false) list+= success.cats },{ error-> isLoading.set(false) Log.v("this","ErrorGetCats "+ error.localizedMessage); } ) return list; } operator fun <T> MutableLiveData<MutableList<T>>.plusAssign(values: List<T>) { val value = this.value ?: arrayListOf() value.addAll(values) this.value = value } }
Comment puis-je faire cela?
3 Réponses :
J'ai besoin d'accéder aux sharedPrefences dans ma classe de modèle, car nous ne devrions pas accéder au contexte et aux vues de la classe de modèle, comment puis-je obtenir une valeur de modèle?
Enveloppez-le et passez-le en tant que dépendance au constructeur de votre ViewModel
.
En résumé, ce n'est qu'une recommandation au cas où vous voudriez passer de SharedPreferences
à quelque chose d'autre pour stocker des données (par exemple une bibliothèque différente)
Je envelopperais les sharedPreferences en tant que référentiel afin que votre modèle obtienne une dépendance à cette interface de référentiel et que l'implémentation du référentiel obtienne le ApplicationContext dans son constructeur
merci pour la réponse, pourriez-vous envoyer un exemple de ceci?
Vous devez d'abord changer la classe Model
:
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, ..); } }
, maintenant vous pouvez obtenir applicationContext en utilisant AndroidViewModel
au lieu de ViewModel
, ne vous inquiétez pas, car obtenir une référence statique à applicationContext n'est pas nécessairement un mauvaise idée :
public class MyViewModel extends AndroidViewModel { private val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplication()) private val netManager: NetManager private val model = CategoryModel(netManager, preferences) ... }
Tout comme vous avez un
NetManager
, créez un__Manager
qui utilise SharedPreferences ou Context comme argument du constructeur. Utilisez ensuite le contexte d'application pour cela.Salut, avez-vous résolu le problème? J'apprécierais vraiment que vous partagiez votre solution. À votre santé