LiveData doesn't get updated when I return to Activity

Viewed 234

I have 2 activities, A and B, I update a live data value and store it in DataStore in B and when I return to A it will be not updated.

DataStore class;

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
    }


}

My 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)
    }
}

}

and in Activity A;

  viewModel = ViewModelProvider(this).get(PanicButtonViewModel::class.java)
  viewModel.readPanicButtonMessage.observe(this, {
        logMessage("alert message: $it")
        text_message.text = it
    })

When I restart the app it will be updated.

1 Answers

Try to create class DataStoreRepository(context: Context) { instance in 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>) {

Now you can do

class PanicButtonViewModel(application: Application) : AndroidViewModel(application) {
    
    private val dataStoreRepository = (application as CustomApplication).dataStoreRepository
Related