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__Managerqui 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é