DataStore (Kotlin multiplataforma)

A biblioteca DataStore armazena dados de forma assíncrona, consistente e de maneira transacional, superando algumas das desvantagens de SharedPreferences. Isso o foco desta página é a criação de DataStore em projetos Kotlin Multiplatform (KMP). Para saber mais sobre o DataStore, consulte a Documentação principal do DataStore e exemplos oficiais (links em inglês).

Como configurar dependências

O DataStore oferece suporte ao KMP nas versões 1.1.0 e mais recentes.

Para configurar o DataStore no seu projeto KMP, adicione as dependências dos artefatos no arquivo build.gradle.kts do seu módulo:

  • androidx.datastore:datastore: biblioteca DataStore
  • androidx.datastore:datastore-preferences: biblioteca Preferences DataStore

Definir as classes do DataStore

É possível definir a classe DataStore com DataStoreFactory dentro do fonte do seu módulo KMP compartilhado. Colocar essas classes em fontes comuns permite que eles sejam compartilhados em todas as plataformas de destino. Você pode usar Declarações actual e expect para criar em implementações específicas da plataforma.

Criar a instância do DataStore

Você precisa definir como instanciar o objeto DataStore em cada plataforma. Essa é a única parte da API que precisa estar na plataforma específica. conjuntos de origem devido às diferenças nas APIs do sistema de arquivos.

Comum

// shared/src/androidMain/kotlin/createDataStore.kt

/**
 * Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(producePath: () -> String): DataStore<Preferences> =
        PreferenceDataStoreFactory.createWithPath(
            produceFile = { producePath().toPath() }
        )

internal const val dataStoreFileName = "dice.preferences_pb"

Android

Para criar a instância DataStore, você precisa de um Context junto com a caminho do arquivo.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

Para criar a instância do DataStore, você precisa de uma fábrica de banco de dados com as caminho do banco de dados.

// shared/src/iosMain/kotlin/createDataStore.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
        val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
            directory = NSDocumentDirectory,
            inDomain = NSUserDomainMask,
            appropriateForURL = null,
            create = false,
            error = null,
        )
        requireNotNull(documentDirectory).path + "/$dataStoreFileName"
    }
)