2
votes

android- comment accéder au contexte ou aux préférences partagées dans la classe de modèle MVVM

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?


2 commentaires

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é


3 Réponses :


0
votes

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)


0 commentaires

0
votes

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


1 commentaires

merci pour la réponse, pourriez-vous envoyer un exemple de ceci?



2
votes

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)

    ...
}           


0 commentaires