Хранилище данных не получает событие из потока

#android #android-lifecycle #kotlin-flow #android-jetpack-datastore

#Android #android-жизненный цикл #kotlin-flow #android-jetpack-хранилище данных

Вопрос:

Я играю с хранилищем данных-preferences: 1.0.0-alpha01, и, похоже, я не могу вернуть событие, когда значение хранилища данных было обновлено. Я пытался наблюдать это во фрагменте и родительской активности с тем же результатом. Когда я создаю экземпляр хранилища данных и наблюдаю за потоком значений, я получаю событие сразу после объявления наблюдателя (кажется, это обычное явление после регистрации наблюдателя). Это будет означать, что поток функционирует, и наблюдатель собирает события, как и предполагалось. Затем я обновляю значение предпочтения внутри того же наблюдателя, который никогда не получает событие.

Я использовал эту статью в качестве ссылки https://medium.com/scalereal/hello-datastore-bye-sharedpreferences-android-f46c610b81d5 это согласуется с репо, с которым я сравнивал свою реализацию. Очевидно, что это работает. https://github.com/PatilShreyas/DataStoreExample

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 }

}
  

UpdateConnectionDialog

 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
  

Теперь, в других примерах, мы должны увидеть, что наблюдатель запускает событие за то, что оно было обновлено, но я этого не делаю. В других примерах, добавляющих те же точки регистрации, очевидно, что наблюдатель получает событие обновления.

Комментарии:

1. Вы нашли какое-либо решение для этого?

2. Нет, я отказался от этого и вернулся к общим настройкам.