Ich verwende oft Settings in meinen Apps, um einzelne Werte ausserhalb einer Datenbank zu speichern. Es ist selten, dass ich eine App schreibe, ohne Settings in irgendeiner Weise zu verwenden.

Dieses Tutorial zeigt plattformunabhaengige Settings. Wir werden eine einzige Codebasis erstellen, die sowohl auf Apple- als auch auf Android-Plattformen funktioniert.

Hier ist ein einfaches Beispiel. Zuerst deklarieren und instanziieren wir unsere Settings. Dann speichern wir einen Wert fuer einen bestimmten Schluessel. In der dritten Zeile rufen wir die Einstellung ab. So einfach ist das.

val settings: Settings = Settings()
settings.putInt("key", 3)
settings["key"] = 3

Wie sieht das im Kontext einer Kotlin Multiplatform Anwendung aus?

Im folgenden Beispiel wollen wir den myBool-Wert beibehalten, wann immer der Benutzer den Switch umschaltet. Der Wert sollte auch nach dem Neustart der App erhalten bleiben.

import androidx.compose.material.MaterialTheme
import androidx.compose.material.Switch
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.russhwolf.settings.Settings
 
@Composable
fun App() {
 MaterialTheme {
  var myBool by remember { mutableStateOf(false) }
 
  Switch(
   checked = myBool,
   onCheckedChange = {
    myBool = it
   }
  )
 }
}

Beginnen wir mit dem Hinzufuegen der Abhaengigkeit:

implementation("com.russhwolf:multiplatform-settings-no-arg:1.1.1")

Unten ist unsere Anwendung, die den Boolean-Wert persistiert. Um zu testen, starte die Anwendung nach dem Aendern des Werts neu.

import androidx.compose.material.MaterialTheme
import androidx.compose.material.Switch
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.russhwolf.settings.Settings
 
@Composable
fun App() {
 MaterialTheme {
  val settings: Settings = remember { Settings() }
 
  var myBool by remember { mutableStateOf(settings.getBoolean("bool", false)) }
 
  Switch(
   checked = myBool,
   onCheckedChange = {
    settings.putBoolean("bool", it)
    myBool = settings.getBoolean("bool", false)
   }
  )
 }
}

Ich bevorzuge eine einzige Quelle der Wahrheit. Derzeit haben wir zwei: die Settings und myBool.

Ich verwende gerne Flows, insbesondere um Settings an Code zu exponieren, der automatisch aktualisiert werden sollte, wenn sich eine Einstellung aendert.

Wenden wir dieses Konzept auf unsere Beispielanwendung an.

Fuege zuerst diese Abhaengigkeit hinzu:

implementation("com.russhwolf:multiplatform-settings-coroutines:1.1.1")

Die bedeutendste Aenderung ist die Umwandlung von normalen Settings in FlowSettings.

import androidx.compose.material.MaterialTheme
import androidx.compose.material.Switch
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import com.russhwolf.settings.ExperimentalSettingsApi
import com.russhwolf.settings.ObservableSettings
import com.russhwolf.settings.Settings
import com.russhwolf.settings.coroutines.toFlowSettings
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
 
@OptIn(ExperimentalSettingsApi::class, DelicateCoroutinesApi::class)
@Composable
fun App() {
 MaterialTheme {
  val flowSettings = remember { (Settings() as ObservableSettings).toFlowSettings() }
 
  val boolState by flowSettings
  .getBooleanFlow(key = "bool", defaultValue = false)
  .collectAsState(initial = false)
 
  Switch(
   checked = boolState,
   onCheckedChange = { checked ->
    GlobalScope.launch {
     flowSettings.putBoolean("bool", checked)
    }
   }
  )
 }
}

Diese kurze Anleitung sollte dich schnell mit der Verwendung von Settings in deinem KMP-Projekt vertraut machen. Ich hoffe, du findest sie nuetzlich!

Vielen Dank fuers Lesen!

Ressourcen