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で何が変わったのかはわからず。一旦すすめる。
コメント