I'm using MVVM architecture along with dagger hilt. I'm using event channel to send my events then retrieve them using event flow like shown below. I wanted to test everything by just ticking or unticking a checkbox which isn't working. From logcat I could see that my event was being triggered but some how is not sent or received.
State:
data class BottomNavigationSharedStates(
val isPopupMenuShowing: Boolean = false,
val showingVerseOfTheDay: Boolean = true,
val showingDynamicWords: Boolean = true,
val showingVerseGuesser: Boolean = true,
val isCheckBoxTicked: Boolean = false,
val isMenuSideBarShowing: Boolean = true,
val isSearchBarExpanded: Boolean = true,
val showingAddingVerseFloatingButton: Boolean = true,
val lastOpenedTheme: String = "",
val sortType: SortType = SortType.byDate,
val selectedIndex: Byte = 0
)
Events:
data class TickOrUntickCheckBoxToMemoriseVerse(val isCheckBoxTicked: Boolean): BottomNavigationScreensSharedEvents
object HidePopUpMenu: BottomNavigationScreensSharedEvents
object ShowMenuSideBar: BottomNavigationScreensSharedEvents
object HideMenuSideBar: BottomNavigationScreensSharedEvents
object ExpandSearchBar: BottomNavigationScreensSharedEvents
object CollapseSearchBar: BottomNavigationScreensSharedEvents
object ShowAddingVerseFloatingButton: BottomNavigationScreensSharedEvents
object HideAddingVerseFloatingButton: BottomNavigationScreensSharedEvents
data class ChangeSortTypeTo(val sortType: SortType): BottomNavigationScreensSharedEvents
In the View Model:
@HiltViewModel
class BottomNavigationSharedViewModel @Inject constructor(
val daoFunctions: DataBaseRepositoryImpl
): ViewModel() {
private val _state = MutableStateFlow(BottomNavigationSharedStates())
val state = _state.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), BottomNavigationSharedStates())
val allVerses = Pager(
config = PagingConfig(
pageSize = 60,
enablePlaceholders = true,
maxSize = 200
) // PAGING CONFIG ENDS
) {
daoFunctions.getVersesByDate()
}// PAGER ENDS
private val eventsChannel = Channel<BottomNavigationScreensSharedEvents>()
val eventFlow = eventsChannel.receiveAsFlow()
fun onEvent(event: BottomNavigationScreensSharedEvents){
when(event){
is BottomNavigationScreensSharedEvents.ChangeSortTypeTo -> triggerChangingSortTypeEvent(event.sortType)
BottomNavigationScreensSharedEvents.CollapseSearchBar -> triggerCollapsingSearchBarEvent()
BottomNavigationScreensSharedEvents.ExpandSearchBar -> triggerExpandingSearchBarEvent()
BottomNavigationScreensSharedEvents.HideAddingVerseFloatingButton -> triggerHidingAddVerseFloatingButton()
BottomNavigationScreensSharedEvents.HideMenuSideBar -> triggerHidingMenuSideBarEvent()
BottomNavigationScreensSharedEvents.HidePopUpMenu -> triggerHidingPopUpMenuEvent()
BottomNavigationScreensSharedEvents.ShowAddingVerseFloatingButton -> triggerShowingAddVerseFloatingButton()
BottomNavigationScreensSharedEvents.ShowMenuSideBar -> triggerShowingMenuSideBarEvent()
BottomNavigationScreensSharedEvents.ShowPopUpMenu -> triggerShowingPopUpMenuEvent()
is BottomNavigationScreensSharedEvents.UpdateUiThemeTo -> TODO()
is BottomNavigationScreensSharedEvents.TickOrUntickCheckBoxToMemoriseVerse -> {
Log.d("CheckBoxOnEvent", event.isCheckBoxTicked.toString()) // Testing to see whether event is triggered
triggerTickOrUntickCheckBoxToMemoriseVerseEvent(event.isCheckBoxTicked)
}
}
}
private fun triggerShowingPopUpMenuEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ShowPopUpMenu)
}
}
private fun triggerHidingPopUpMenuEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.HidePopUpMenu)
}
}
private fun triggerShowingMenuSideBarEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ShowMenuSideBar)
}
}
private fun triggerHidingMenuSideBarEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.HideMenuSideBar)
}
}
private fun triggerExpandingSearchBarEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ExpandSearchBar)
}
}
private fun triggerCollapsingSearchBarEvent(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.CollapseSearchBar)
}
}
private fun triggerShowingAddVerseFloatingButton(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ShowAddingVerseFloatingButton)
}
}
private fun triggerHidingAddVerseFloatingButton(){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ShowAddingVerseFloatingButton)
}
}
private fun triggerChangingSortTypeEvent(sortType: SortType){
viewModelScope.launch {
eventsChannel.send(BottomNavigationScreensSharedEvents.ChangeSortTypeTo(sortType))
}
}
fun triggerTickOrUntickCheckBoxToMemoriseVerseEvent(isCheckBoxTicked: Boolean)
= viewModelScope.launch {
Log.d("CheckBoxTrigger", isCheckBoxTicked.toString())
eventsChannel.send(BottomNavigationScreensSharedEvents.TickOrUntickCheckBoxToMemoriseVerse(isCheckBoxTicked))
}
fun showPopUpMenu(){
_state.update { it.copy(isPopupMenuShowing = true) }
}
fun hidePopUpMenu(){
_state.update { it.copy(isPopupMenuShowing = false) }
}
fun showMenuSideBar(){
_state.update { it.copy(isMenuSideBarShowing = false) }
}
fun hideMenuSideBar(){
_state.update { it.copy(isMenuSideBarShowing = false) }
}
fun expandSearchBar(){
_state.update { it.copy(isSearchBarExpanded = true) }
}
fun collapseSearchBar(){
_state.update { it.copy(isSearchBarExpanded = false) }
}
fun showAddingVerseFloatingButton(){
_state.update { it.copy(showingAddingVerseFloatingButton = true) }
}
fun hideAddingVerseFloatingButton(){
_state.update { it.copy(showingAddingVerseFloatingButton = false) }
}
fun changeSortTypeTo(sortType: SortType){
_state.update { it.copy(sortType = sortType) }
}
fun updateUiThemeTo(theme: String){
_state.update { it.copy(lastOpenedTheme = theme) }
}
fun tickOrUntickMemoriseVerseCheckBox(isCheckBoxTicked: Boolean){
Log.d("CheckBoxTrigger", isCheckBoxTicked.toString())
_state.update { it.copy(isCheckBoxTicked = isCheckBoxTicked) }
}
}
CheckBox:
Checkbox(
checked = state.isCheckBoxTicked,
onCheckedChange = { isCheckBoxTicked ->
Log.d("CheckBoxContent", isCheckBoxTicked.toString())
onEvent(BottomNavigationScreensSharedEvents.TickOrUntickCheckBoxToMemoriseVerse(isCheckBoxTicked))
}
)
MainActivity:
@ExperimentalMaterial3Api
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private val viewModel: BottomNavigationSharedViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
viewModel.eventFlow.collect { event ->
Log.d("CheckBox","here")
when (event) {
BottomNavigationScreensSharedEvents.ShowMenuSideBar -> viewModel.showMenuSideBar()
is BottomNavigationScreensSharedEvents.ChangeSortTypeTo -> viewModel.changeSortTypeTo(SortType.byDate)
BottomNavigationScreensSharedEvents.CollapseSearchBar -> viewModel.collapseSearchBar()
BottomNavigationScreensSharedEvents.ExpandSearchBar -> viewModel.expandSearchBar()
BottomNavigationScreensSharedEvents.HideAddingVerseFloatingButton -> viewModel.hideAddingVerseFloatingButton()
BottomNavigationScreensSharedEvents.HideMenuSideBar -> viewModel.hideMenuSideBar()
BottomNavigationScreensSharedEvents.HidePopUpMenu -> viewModel.hidePopUpMenu()
BottomNavigationScreensSharedEvents.ShowAddingVerseFloatingButton -> viewModel.showAddingVerseFloatingButton()
BottomNavigationScreensSharedEvents.ShowPopUpMenu -> viewModel.showPopUpMenu()
is BottomNavigationScreensSharedEvents.UpdateUiThemeTo -> viewModel.updateUiThemeTo(
""
)
is BottomNavigationScreensSharedEvents.TickOrUntickCheckBoxToMemoriseVerse -> {
Log.d("CheckBoxMain", event.isCheckBoxTicked.toString())
viewModel.tickOrUntickMemoriseVerseCheckBox(event.isCheckBoxTicked)
}
} // WHEN ENDS
} // COLLECT ENDS
}
setContent {
val state = viewModel.state.collectAsStateWithLifecycle()
// val pagingItems = viewModel.allVerses.flow.collectAsLazyPagingItems()
val navController = rememberNavController()
mainScreen(
context = this,
navController = navController,
state.value,
viewModel::onEvent)
}
}
}
I've tried to collect the events inside a composable using Launched effect + lifecycle but still got nothing, check box didn't tick at all
setContent {
val state = viewModel.state.collectAsStateWithLifecycle()
// val pagingItems = viewModel.allVerses.flow.collectAsLazyPagingItems()
val navController = rememberNavController()
val lifeCycleOwner = LocalLifecycleOwner.current
LaunchedEffect(viewModel.eventFlow,lifeCycleOwner.lifecycle){
lifeCycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED){
withContext(Dispatchers.Main.immediate){
viewModel.eventFlow.collect { event ->
Log.d("CheckBox","here")
when (event) {
BottomNavigationScreensSharedEvents.ShowMenuSideBar -> viewModel.showMenuSideBar()
is BottomNavigationScreensSharedEvents.ChangeSortTypeTo -> viewModel.changeSortTypeTo(SortType.byDate)
BottomNavigationScreensSharedEvents.CollapseSearchBar -> viewModel.collapseSearchBar()
BottomNavigationScreensSharedEvents.ExpandSearchBar -> viewModel.expandSearchBar()
BottomNavigationScreensSharedEvents.HideAddingVerseFloatingButton -> viewModel.hideAddingVerseFloatingButton()
BottomNavigationScreensSharedEvents.HideMenuSideBar -> viewModel.hideMenuSideBar()
BottomNavigationScreensSharedEvents.HidePopUpMenu -> viewModel.hidePopUpMenu()
BottomNavigationScreensSharedEvents.ShowAddingVerseFloatingButton -> viewModel.showAddingVerseFloatingButton()
BottomNavigationScreensSharedEvents.ShowPopUpMenu -> viewModel.showPopUpMenu()
is BottomNavigationScreensSharedEvents.UpdateUiThemeTo -> viewModel.updateUiThemeTo(
""
)
is BottomNavigationScreensSharedEvents.TickOrUntickCheckBoxToMemoriseVerse -> {
Log.d("CheckBoxMain", event.isCheckBoxTicked.toString())
viewModel.tickOrUntickMemoriseVerseCheckBox(event.isCheckBoxTicked)
}
} // WHEN ENDS
} // COLLECT ENDS
} // WITH CONTEXT ENDS
} // OWNER ENDS
}
mainScreen(
context = this,
navController = navController,
state.value,
viewModel::onEvent)
}
Everything seems fine but I don't know why I'm not receiving the event,Your help will be highly appreciated