Not receiving events from Event flow in android

48 Views Asked by At

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

0

There are 0 best solutions below