MVI

MVI에서 state 는 한개로 통일, evnet, reducer만 분리해야할까?

redux 에서는 store한개로 상태를 표현하고, 여러개의 reducer를 사용한다.


화면전환을 굳이 state로 관리해야할까?

LaunchedEffect(uiState.screenState) {
        when (uiState.screenState) {
            ScreenState.ScanState -> {
                if (currentRoute != Route.ScanScreen.route) {
                    navController.navigateWithClearBackStack(Route.ScanScreen.route)
                }
            }
      }

이런식으로 screenState가 변할 때 마다 navigation composable에서 관찰하여 화면 이동을 컨트롤 하고 있다. 하지만 여기서 드는 의문은 굳이? 그냥 코드에 순차적으로 navigate를 해주면 안되나? 인 것이다.

  Button(onClick = { navController.navigate("route") }){
					   Text("btn") 
			}

—> 물론 단순하게 ui이벤트 → 화면전환. 정도의 로직이라면 충분히 가능하다.

하지만 뷰모델에서 api가 진행된 후, 라던지 특정 데이터로직이 완료된 이후에 navigate가 수행되어야한다면? 물론 로직이 완료된 후에 뷰모델의 로직에서 navcontroller.navigate를 수행해주어도 가능하지만, 이는 뷰모델의 적절한 역할이 아니다. navigate는 ui에 직접적으로 관여하기 때문에 ui layer에서 수행되어야 한다.

따라서

repository.requestDrugDelivery(
            ...
            onSuccess = { response ->
                setDialog()
                mainReducer.sendEvent(
                    uiState.sendEvent(MainEvent.SetScreenState(ScreenState.ScanScree)
                )
            })

이런식으로 api가 성공했을때, 상태변화를 주어 특정 모먼트에 수행될 수 있도록 하는 것이 좋다.


view에서 사용할 변수들도 다 state로 관리해야할까?