android - 当我返回到 Activity 时,LiveData不会更新

标签 android mvvm android-livedata datastore

我有2个 Activity ,A和B,我更新一个实时数据值并将其存储在B中的DataStore中,当我返回A时,它将不会更新。
DataStore类;

const val PREF_NAME = "com.family_locator.panic_button.pref_name"

class DataStoreRepository(context: Context) {

private object PreferenceKeys {
    val panicButtonMessage = preferencesKey<String>("panicButtonMessage")
}

private val dataStore: DataStore<Preferences> = context.createDataStore(name 
= PREF_NAME)


suspend fun savePanicButtonMessage(message: String) {
    dataStore.edit { preferences ->
        preferences[panicButtonMessage] = message
    }
}


val readPanicButtonMessage: Flow<String> = dataStore.data
    .catch { exception ->
        if (exception is IOException) {
            emit(emptyPreferences())
        } else {
            throw  exception
        }
    }
    .map { preferences ->
        val panicButtonMessage =
            preferences[panicButtonMessage] ?: 
context.getString(R.string.panic_message)
        panicButtonMessage
    }


}
我的ViewModel;
class PanicButtonViewModel(application: Application) : AndroidViewModel(application) {

private val dataStoreRepository = DataStoreRepository(application)

val readPanicButtonMessage = dataStoreRepository.readPanicButtonMessage.asLiveData()

fun savePanicButtonMessage(message: String) {
    viewModelScope.launch(Dispatchers.IO) {
        dataStoreRepository.savePanicButtonMessage(message)
    }
}

}
在 Activity A中;
  viewModel = ViewModelProvider(this).get(PanicButtonViewModel::class.java)
  viewModel.readPanicButtonMessage.observe(this, {
        logMessage("alert message: $it")
        text_message.text = it
    })
当我重新启动应用程序时,它将被更新。

最佳答案

尝试在class DataStoreRepository(context: Context) {中创建Application.onCreate()实例

class CustomApplication: Application() {
    lateinit var dataStoreRepository: DataStoreRepository
        private set

    override fun onCreate() {
        super.onCreate()
        val dataStore: DataStore<Preferences> = createDataStore(name = PREF_NAME)
        
        dataStoreRepository = DataStoreRepository(dataStore)
    }
}

class DataStoreRepository(private val dataStore: DataStore<Preferences>) {
现在你可以做
class PanicButtonViewModel(application: Application) : AndroidViewModel(application) {
    
    private val dataStoreRepository = (application as CustomApplication).dataStoreRepository

关于android - 当我返回到 Activity 时,LiveData不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64604718/

相关文章:

android - 使用ViewModel和LiveData改造执行API多次

java - ConcurrentHashMap 作为具有同步的单例缓存

android - fragment 回栈清除问题

android - 如何在 xml 中重新创建此背景?

wpf - 如何在 Dispatcher 中访问 WPF 对象?

c# - 如何最好地应用WPF MVVM?

android LiveData 或协程 channel

android - 为什么这个 Android Room 插件不起作用?

android - 自定义启动器不再作为华为设备中的默认启动器

android - 将 CalendarView 与数据绑定(bind)结合使用