androidのPreferences DataStoreのv1.1.5は使えない

AndroidでComposeアプリを書いていて設定画面を書こうとしたときに、

最近ではPreferences DataStoreというものが推奨されているらしい。

公式のチュートリアルに従って実装していたところで、ライブラリの関数などがどうやっても認識されず、情報も少なくて死ぬほどハマったのでメモ。

Preferences DataStore を使用する  |  Android Developers
この Codelab では、サンプルアプリを変更して、Jetpack Preferences DataStore を組み込みます。これは、SharedPreferences に代わるものとして改善された新しいデータストア ソリューションです。

結論、今の最新の1.1.5は使えない。1.1.4を使え。

implementation "androidx.datastore:datastore-preferences:1.1.4"

以下stackoverflowで2日前のコメントでその旨を見つけてようやく解決。。。

Just a moment...

現象

ライブラリも正しくインポートされているにもかかわらず、いくつかの関数がimportできずundefined referenceとなる。以下の部分のbooleanPreferencesKeyが認識されない。

private object PreferencesKeys {
  val SHOW_COMPLETED = booleanPreferencesKey("show_completed")
}

これはライブラリのPreferencesKeys.ktに以下のように定義してある

/**
 * Get a key for a Boolean preference. You should not have multiple keys with the same name (for use
 * with the same Preferences). Using overlapping keys with different types can result in
 * ClassCastException.
 *
 * @param name the name of the preference
 * @return the Preferences.Key<Boolean> for [name]
 */
@JvmName("booleanKey")
public fun booleanPreferencesKey(name: String): Preferences.Key<Boolean> = Preferences.Key(name)

他にも、以下のeditが認識されない。

suspend fun updateShowCompleted(showCompleted: Boolean) {
    dataStore.edit { preferences ->
        preferences[PreferencesKeys.SHOW_COMPLETED] = showCompleted
    }
}

ちなみに、このeditは拡張関数であり、Preferences.ktに以下のように定義されている。

当初、拡張関数らへんがおかしいのかな?など疑ったが関係なかった。

public suspend fun DataStore<Preferences>.edit(
    transform: suspend (MutablePreferences) -> Unit
): Preferences {
    return this.updateData {
        // It's safe to return MutablePreferences since we freeze it in
        // PreferencesDataStore.updateData()
        it.toMutablePreferences().apply { transform(this) }
    }
}

正直パット見では1.1.5と1.1.4で何が変わったのかはわからず。一旦すすめる。

コメント

タイトルとURLをコピーしました