admin管理员组

文章数量:1310254

I have this in my DAO

@Query("SELECT * FROM reminders")
fun getAll(): Flow<List<ReminderEntity>>

This in my Repository

override fun getAllRemindersAsFlow(): Flow<List<Reminder>> {
    return mRemindersDao.getAll().map {
        Log.e("TAG", "room emitting")
        it.map(ReminderEntity::toDomain)
    }
}

This in my ViewModel

val reminders = mRemindersRepository.getAllRemindersAsFlow().stateIn(
    scope = viewModelScope,
    started = SharingStarted.Eagerly,
    initialValue = emptyList()
)
val reminders = mRemindersRepository.getAllRemindersAsFlow().distinctUntilChanged { old, new -> 
  // old and new is equal
  // old == new returns true
}.stateIn(
    scope = viewModelScope,
    started = SharingStarted.Eagerly,
    initialValue = emptyList()
)

This in my Fragment's onViewCreated

 lifecycleScope.launch {
     mViewModel.reminders.collectLatest { reminders ->
         Log.e("TAG", "onViewCreated: Updated", )
         when (mBinding.remindersBottomNavigationView.selectedItemId) {
             R.id.upcoming_reminders -> if (reminders.isEmpty()) {
                 mBinding.reminderHelpLabel.setText(R.string.no_upcoming_reminder)
             } else mRemindersRecyclerViewAdapter.setReminders(reminders.filter(Reminder::isUpcoming))
             R.id.all_reminders -> if (reminders.isEmpty()) {
                 mBinding.reminderHelpLabel.setText(R.string.click_to_create_a_reminder)
             } else mRemindersRecyclerViewAdapter.setReminders(reminders)
         }
     }
 }

So, whenever I'm updating my Reminders I can see Room emitting in my logs but onViewCreated: Updated is not getting logged. Also, my UI is not updating.

I added some logs to check if the list is changing

room emitting: ReminderEntity(id=8, title=Test, time=[1035, 1165], days=[Tue], enabled=false)
room emitting: ReminderEntity(id=9, title=Test, time=[1040, 1115, 1110], days=[Sun, Mon, Tue, Wed, Thu, Fri, Sat], enabled=true)
room emitting: ReminderEntity(id=17, title=yui, time=[1415], days=[Sun, Mon, Tue, Wed, Thu, Fri, Sat], enabled=true)

Using UI I disabled one reminder

room emitting: ReminderEntity(id=8, title=Test, time=[1035, 1165], days=[Tue], enabled=false)
room emitting: ReminderEntity(id=9, title=Test, time=[1040, 1115, 1110], days=[Sun, Mon, Tue, Wed, Thu, Fri, Sat], enabled=true)
room emitting: ReminderEntity(id=17, title=yui, time=[1415], days=[Sun, Mon, Tue, Wed, Thu, Fri, Sat], enabled=false)

So, the last reminder is getting changed and the list is getting updated.

If I change my ViewModel code to this

val reminders = mRemindersRepository.getAllRemindersAsFlow().shareIn(
    scope = viewModelScope,
    started = SharingStarted.Eagerly,
    replay = 1
)

Then it works as expected.

本文标签: androidFlow return by Room with stateIn does not work but shareIn workingStack Overflow