Rufen Sie Daten basierend auf der Abfrage des Benutzers ab und übergeben Sie sie an die Datenbindung [verwendet MVVM]

Amit Parameshwar

Ich habe eine Datenbank mit Wetterdaten in imperialen und metrischen Einheiten. Jetzt habe ich zwei verschiedene Klassen erstellt, die als Modell zum Abrufen von Daten aus der DB dienen. CurrentWeatherMetrichat nur metrische Spalten und CurrentWeatherImperialnur imperiale Felder.

Da ich MVVM Architekturmuster verwenden, das ViewModelgibt mir diese Daten, indem Sie eine Funktion in Ansichtsmodell Aufruf , getData(Unit.METRIC)wo Unitein die enum classich gemacht habe , die Daten zu unterscheiden.

Das Problem tritt hier auf. Mein viewModel sieht so aus:

class WeatherViewModel(
    private val weatherRepository: WeatherRepositoryImpl
) : ViewModel() {

    lateinit var currentWeather: LiveData<CurrentWeather>
    lateinit var forecastWeather: LiveData<List<ForecastWeather>>

    fun getValuesOfUnit(unit: Unit) {
        currentWeather = when (unit) {
            Unit.IMPERIAL->weatherRepository.getCurrentWeatherImperial()
            Unit.METRIC->weatherRepository.getCurrentWeatherMetric()
        }
        getWeather()
    }

    private fun getWeather() {

        viewModelScope.launch {
            try {
                weatherRepository.getWeather()
            } catch (e: IOException) {

            }
        }
    }
}

Wie Sie sehen, lateinit var currentWeather: LiveData<CurrentWeather>musste ich eine andere Klasse erstellen, die die Daten der Abfrage mit Einheiten speichert. Ich habe dies so gemacht, dass ich damit leicht Datenbindung implementieren kann. Aber ich habe das Gefühl, dass dies ein wirklich falscher Weg ist, und deshalb habe ich diese Frage gestellt. Wie kann ich diese lateinitVariable loswerden und Databinding implementieren, um mich an alle Daten anzupassen.

In meinem aktuellen Datenbindungslayout habe ich ein Datenfeld als:

<data>
    <variable
        name="viewModel"
        type="com.mythio.weather.ui.WeatherViewModel" />
</data>

Und ich binde an Ansichten durch:

   app:someattribute="@{viewModel.currentWeather.temperature}"

Wenn der Titel der Frage für meine Frage ein wenig Sinn macht oder irreführend erscheint, können Sie ihn gerne bearbeiten, um die Frage zu verbessern.

Jeel Vankhede

Bei der Verwendung von MVVM Architekturmustern , Google empfohlene Weg zu machen , ViewModeldass die Griff Verbindung zwischen Daten und Sicht , so dass es UI - Logik enthält, sowie einen Teil der Business - Logik auf Ihre UI gebunden.

Darüber hinaus ViewModelhilft Ihnen die empfohlene Implementierung dabei, den UI-Lebenszyklus (Aktivität/Fragmente) besser und problemloser zu handhaben .

Wenn Sie die Datenbindung mit MVVM verwenden , empfiehlt es sich, ViewModeldirekt an XML zu binden , damit Sie bei Datenänderungen diese direkt auf die Benutzeroberfläche übertragen können, LiveDataohne sie manuell zu verbinden.

Daher LiveDatakann als Datenwert Halter verwendet werden , wie es auch Lifecycle-Aware - Komponente .


Auf der anderen Seite sind Repositorys eine gute Möglichkeit, die Geschäftslogik zu verwalten und eine "Single Source of Truth" für die Datenverarbeitung durch die App bereitzustellen. Daher sollte auf alle Datenquellen wie local-db, API-Aufrufe, Shared-Preferences usw. über das Repository zugegriffen werden.

Also ja!! Die Dinge, die Sie tun, sind gut und Sie sind auf dem richtigen Weg, wenn Sie dem MVVM-Architekturmuster folgen .

Hinweis: Sie können verweisen hier für weitere Informationen und einige Verbesserungen in Ihrem Code.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

heißlabel

Archiv