작성
·
257
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
클린아키텍쳐를 구현중인데요
노트를 수정하는 플로우에서
viewModel -> useCase.update -> repository.update -> remoteDatasource.update 의 과정을 거치고
노트리스트 조회의 플로우를 생각해보면
viewModel -> useCase.getList -> repository.getList -> remoteDatasource.getLIst 처럼 같은 과정을 거치게 됩니다.
updateapi를 성공했다면 리스트화면으로 돌아올때 데이터 최신화를 위해 다시한번 조회하는 의미없는 리소스를 없애고싶습니다. 혹은 화면 A,B에서 같은리스트를 보여주는 상황이라면 update 성공 하고나서 A,B화면에 어떤방식으로 notify를 해줄 수 있을까요? 클린아키텍쳐의 구조를 구현하기 전에는 SingleTon으로 구현된 Repository에서 stream을 열어서 viewModelA와 viewModelB 에서 같은 repository의 stream을 구독해서 state를 바꿔주는 방식으로 했는데 usecase를 사용하려고하니 해당구조는 어려움이 생겨서 어떻게 할지 고민하다가 질문 드립니다!
답변 4
0
peedListViewModel 에서 사용되는 state와 peedDetailViewModel에서 사용되는 state가 peedList 외에 공통되는게 없는 상황이라면 peedViewModel 에 view를 컨트롤하는 기능들을 통합하는 방향이 괜찮을까요? 좋은 구조는 아닌거같아서 고민중입니다. useCase를 싱글톤으로 repository처럼 injection해주고 useCase에 Stream을 두고 viewModel에서 하나의 useCase를 구독하는 방향도 생각중이었는데 어떻게 생각하시나요!
0
인스타그램을 예로들면
내가 올린피드 리스트 (peedLIst)
피드를 탭하면 피드의 내용을볼 수 있는 화면 (peedDetail)
peedDetail에서 아래로 내리면 peedLIst에서 조회한 리스트의 데이터와 같아야함
이런 상황일때 peedDetail에서 글을 수정을하면 수정한 내용이 똑같이 peedList에서 보여져야하는 상황이 생기는데
네비게이션 peedList -> peedDetail 이 된 상황에서 peedDetail에서 update이벤트가 일어나고 pop을하면 peedList에서 최적화 및 ux를 위해 다시 조회하느라 필요한 로딩화면을 없애고싶은 상황일때 클린아키텍쳐 구조에서 어떤방식으로 구현을 해야 좋은 패턴이 될까요?
상황을 보니 ViewModel 을 peedList 와 peedDetail 에서 공용으로 사용해야 할 것 같습니다.
보는 관점에 따라 두번째 화면이 앞 화면의 다이얼로그 같은 느낌일 수도 있는데 이런 경우 ViewModel을 공유하는 형태로 했을때가 가장 쉽게 해결이 되었습니다.
저는 이런 화면 구조에서는 두 화면을 모두 화면으로 보지 않고 section 으로 취급합니다.
예를 들어 위 두 화면을 다음과 같이 하나의 화면 안에 두 개의 섹션으로 봅니다.
그럼 PeedViewModel 이 두 섹션에서 동시에 활용이 되기 때문에 원하시는 내용을 구현하기에 좋습니다
PeedScreen - PeedListSection
- PeedDetaionSection
저도 하나의 화면에서 하나의 ViewModel을 가지는 것이 가장 이상적이라고 생각합니다.
다만, 실제 업무를 하다보면 화면으로 볼지, 화면의 일부로 볼지 경계가 애매한 경우가 있더라고요.
참고가 되실지 모르겠지만 제가 수업에 사용하던 소스를 첨부합니다.
https://github.com/junsuk5/flutter-contact
화면에 나오는 요소들을 화면의 일부로 생각하고 ViewModel은 한개로 활용하고 있습니다.
여러 예외 케이스들이 있기 때문에 상황에 맞게 저도 여러 패턴을 연구중입니다.