Android 数据存储未从流接收事件
我正在玩数据存储首选项:1.0.0-alpha01,当数据存储值被更新时,我似乎无法恢复事件。我一直试图在片段和父活动中观察到它,结果是一样的。当我创建一个数据存储实例并观察一个值流时,我在声明观察者之后立即收到一个事件(在注册观察者之后似乎很常见)。这将表明流正在运行,并且观察者正在按照预期拾取事件。然后,我更新同一个观察者内部的偏好值,该观察者从不拾取事件 我使用本文作为参考,它与我用来比较我的实现的repo一起使用。显然,这一个是有效的 数据存储Android 数据存储未从流接收事件,android,android-lifecycle,kotlin-flow,android-jetpack-datastore,Android,Android Lifecycle,Kotlin Flow,Android Jetpack Datastore,我正在玩数据存储首选项:1.0.0-alpha01,当数据存储值被更新时,我似乎无法恢复事件。我一直试图在片段和父活动中观察到它,结果是一样的。当我创建一个数据存储实例并观察一个值流时,我在声明观察者之后立即收到一个事件(在注册观察者之后似乎很常见)。这将表明流正在运行,并且观察者正在按照预期拾取事件。然后,我更新同一个观察者内部的偏好值,该观察者从不拾取事件 我使用本文作为参考,它与我用来比较我的实现的repo一起使用。显然,这一个是有效的 数据存储 class DataStoreUtils(
class DataStoreUtils(context: Context) {
companion object {
private const val TAG = "DataStoreUtils"
}
private val dataStore = context.createDataStore(name = Constants.PrefName.APP_PREFS)
suspend fun setString(prefKey: String, value: String) {
Log.d(TAG, "Setting $prefKey to $value")
dataStore.edit { it[preferencesKey<String>(prefKey)] = value }
}
suspend fun getString(prefKey: String): String? {
return dataStore.data.map { it[preferencesKey<String>(prefKey)] ?: return@map null }.first()
}
val usernameFlow: Flow<String?> = dataStore.data
.catch {
if (it is IOException) {
it.printStackTrace()
emit(emptyPreferences())
}
else { throw it }
}
.map { it[preferencesKey(Constants.SharedPrefKeys.USERNAME)] ?: return@map null }
}
现在,通过其他示例,我们应该看到观察者触发了一个事件,因为已经更新了,但我没有。在其他示例中,添加相同的日志记录点,很明显观察者会收到更新事件
class UpdateConnectionDialog : DialogFragment() {
companion object {
private const val TAG = "UpdateConnectionDialog"
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
save_btn.setOnClickListener {
runBlocking { authenticateResponse(ApiCalls.postLogin(body)!!) }
}
}
override fun onResume() {
super.onResume()
dataStore ?: dataStore = DataStoreUtils(Application.appInstance?.applicationContext!!)
dataStore.usernameFlow.asLiveData().observe(this) {
Log.d(TAG, "Updated username to: $it")
}
}
private fun authenticateResponse(response: ApiResponse<String>) {
Log.d(TAG, "Auth request made.")
when (response) {
is ApiSuccessResponse<String> -> {
AppLog.d(TAG, "Auth Success")
lifecycleScope.launch {
dataStore.setString(Constants.PrefKeys.USERNAME, username_input.text.toString())
dataStore.setString(Constants.PrefKeys.PASSWORD, password_input.text.toString())
}
}
is ApiErrorResponse<String> -> {
AppLog.d(TAG, "Auth failed")
}
}
}
}
D/UpdateConnectionDialog: onCreateView()
D/UpdateConnectionDialog: onViewCreated()
D/UpdateConnectionDialog: onResume()
D/UpdateConnectionDialog: Updated username to: X // Seems to be common with other examples I have found. After registering an observer it immediately triggers the event.
D/UpdateConnectionDialog: Auth request made.
D/UpdateConnectionDialog: Auth Success
D/DataStoreUtils: Setting USERNAME to X
D/DataStoreUtils: Setting PASSWORD to X