androidkotlinandroid-jetpack-composeandroid-jetpack-datastore

android datastore-preferences: Property delegate must have a 'getValue(Context, KProperty<*>)' method


I'm writing a jetpack compose android app, I need to store some settings permanently.

I decided to use androidx.datastore:datastore-preferences:1.0.0 library, I have added this to my classpath.

According to the https://developer.android.com/topic/libraries/architecture/datastore descripton I have added this line of code to my kotlin file at the top level:

val Context.prefsDataStore: DataStore by preferencesDataStore(name = "settings")

But I get a compile error:

e: ...SettingsViewModel.kt: (13, 50): Property delegate must have a 'getValue(Context, KProperty<*>)' method. None of the following functions is suitable: 
public abstract operator fun getValue(thisRef: Context, property: KProperty<*>): DataStore<Preferences> defined in kotlin.properties.ReadOnlyProperty

How can I use the datastore-preferences?

My build.gradle file:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'

}

apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'kotlinx-serialization'


android {
    compileSdk 31

    defaultConfig {
        applicationId "hu.homedashboard.mobile"
        minSdk 22
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
        useIR = true
    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion compose_version
        kotlinCompilerVersion "$kotlinVersion"
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }
}

dependencies {

    implementation "androidx.activity:activity-compose:1.3.1"
    implementation "androidx.appcompat:appcompat:1.3.1"
    implementation "androidx.datastore:datastore-preferences:1.0.0"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "com.google.accompanist:accompanist-swiperefresh:0.20.3"
    implementation "androidx.core:core-ktx:1.6.0"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1"
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
    implementation "com.google.android.material:material:1.4.0"
    implementation "com.google.dagger:hilt-android:2.40.1"
    implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0"
    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.0"
    implementation "org.ocpsoft.prettytime:prettytime:5.0.2.Final"
    implementation 'androidx.hilt:hilt-navigation-compose:1.0.0-alpha03'

    kapt "com.google.dagger:hilt-compiler:2.38.1"
    kapt "com.google.dagger:dagger-android-processor:2.40.1"
    kapt "com.google.guava:guava:31.0.1-android"

    api "com.google.guava:guava:31.0.1-android"

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
}

kapt {
    correctErrorTypes true
    javacOptions {
        option("-Xmaxerrs", 500)
    }
}

Solution

  • I got this error because of an incorrect import:

    import java.util.prefs.Preferences
    

    So fix it by

    import androidx.datastore.preferences.core.Preferences
    

    or

    val Context.dataStore by preferencesDataStore(name = "settings")
    

    Note that this declaration must be at the top level of your Kotlin file. You will get the same error if you try to use by preferencesDataStore() in your Activity class.