Skip to main content
Setting up DataStore in Kotlin Multiplatform typically requires platform-specific code for each target. FileKit simplifies this by providing a unified path API.

The Problem

The official DataStore setup requires expect/actual declarations with platform-specific implementations:
  • Android needs Context.filesDir
  • iOS needs NSDocumentDirectory
  • JVM needs System.getProperty("java.io.tmpdir") or a custom path
This means writing and maintaining code in androidMain, iosMain, and jvmMain source sets.

The Solution

With FileKit, you can define everything in commonMain:
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import io.github.vinceglb.filekit.FileKit
import io.github.vinceglb.filekit.databasesDir
import kotlinx.io.files.Path

fun createDataStore(fileName: String = "settings.preferences_pb"): DataStore<Preferences> =
    PreferenceDataStoreFactory.createWithPath {
        FileKit.databasesDir.resolve(fileName).path.toPath()
    }
That’s it! No platform-specific code needed.

Complete Example

Here’s a complete setup for a preferences manager:
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import io.github.vinceglb.filekit.FileKit
import io.github.vinceglb.filekit.databasesDir
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

object AppPreferences {
    private val dataStore: DataStore<Preferences> = PreferenceDataStoreFactory.createWithPath {
        FileKit.databasesDir.resolve("app.preferences_pb").path.toPath()
    }

    private val DARK_MODE_KEY = booleanPreferencesKey("dark_mode")

    val darkMode: Flow<Boolean> = dataStore.data.map { preferences ->
        preferences[DARK_MODE_KEY] ?: false
    }

    suspend fun setDarkMode(enabled: Boolean) {
        dataStore.edit { preferences ->
            preferences[DARK_MODE_KEY] = enabled
        }
    }
}

Why databasesDir?

FileKit.databasesDir returns a platform-appropriate location for persistent data:
PlatformLocation
AndroidApp’s internal databases directory
iOSNSDocumentDirectory
macOS~/Library/Application Support/{bundle-id}
JVMUser’s app data directory
This ensures your preferences are stored in a safe, persistent location on each platform.

Dependencies

Add the DataStore dependencies alongside FileKit Core:
commonMain.dependencies {
    // FileKit Core
    implementation("io.github.vinceglb:filekit-core:<version>")

    // DataStore
    implementation("androidx.datastore:datastore-preferences:<version>")
}