인프런 커뮤니티 질문&답변

김보겸님의 프로필 이미지
김보겸

작성한 질문수

Flutter 중급 3편 - 의존성 주입 가이드

23-Injectable 로 DI 구성

뷰 모델 분리하기

해결된 질문

작성

·

245

0

뷰모델을 분리하는 방법에 대해 질문 드립니다.

하나의 scaffold (activity) 내에 여러개의 container (fragment : no scaffold) 가 있을 때 각각 프레그 먼트에 뷰모델을 사용하면 좋겠지만 부득이하게 상위 activity 뷰모델에 모든 프레그먼트의 로직을 담당해야 하는 상황에서 각 화면별로 뷰모델을 나누고자 합니다. swift 에서는 클래스 외부에 extension 으로 메소드 들을 기능별로 분리하여 사용하는 것을 알고 있고 dart 에도 extension 이 있어서 사용하려니 extention 할때 changenotifier 의 notifyListeners() 를 사용 할 수가 없어서 어려움을 겪고 있습니다. 다중상속도 지원하지 않기 때문에 어떻게 하면 좋을 지 조언 부탁드립니다. 감사합니다.

답변 1

0

오준석님의 프로필 이미지
오준석
지식공유자

각 화면별로 ViewModel을 나누지 마시고, 상위 activity 쪽에서만 ViewModel을 사용하시고 하위 fragment 쪽으로는 UI의 State와 이벤트를 올려 받을 콜백 함수만 전달하도록 합니다.

하위 fragment 에서의 State를 받아서 화면을 그리고, 유저 액션이 있는 경우에는 콜백 함수를 통해서 상위로 이벤트를 끌어올립니다.

콜백으로 올라온 이벤트를 activity 쪽의 ViewModel 에 전달하여 처리하는 방식으로 하시면 될 것 같습니다.

즉, 모든 fragment 들은 일반적으로 컴포넌트를 작성하는 느낌으로 State 와 콜백함수를 생성자로 받도록 작성하고

activity 쪽에서 모든 이벤트를 콜백으로 받아서 ViewModel에 전달하는 방식입니다.

해 보시다가 어려우시면 샘플 코드를 제시해 드리겠습니다.

김보겸님의 프로필 이미지
김보겸
질문자

답변 감사드립니다.

Q1) 제가 현재 하고 있는 방식은 activity에 뷰모델을 두고 있고 프레그먼트에서 이벤트에 해당하는 부분은 해당 뷰모델에 context.read<>().method 이렇게 접근하고 있는데요. 이렇게 하면 문제가 생기는 지요?

 

Q2) Ui측면에서 복잡성 보다 뷰모델의 복잡성에 대해 문제점을 삼고 있었습니다. 하나의 뷰모델에 여러 프레그 먼트를 담당하다보니 코드가 너무 더러워지는 데요. 이때 기능별로 메소드를 분리하는 기법? 같은게 있을까해서 여쭤봅니다.

오준석님의 프로필 이미지
오준석
지식공유자

Q1) 상황에 따라 문제가 될 수도 안 될수도 있습니다. fragment에서 매번 context.read<>() 를 하면 모든 fragment 가 ViewModel과 Provider와의 불필요한 의존성이 생기고 UI Test 코드 를 짜야 하는 경우에는, 테스트 코드를 짜기 어렵기 때문에 개인적으로 선호하지는 않습니다.

Q2) 뷰모델이 방대해 지는 경우 최대한 모든 기능을 UseCase 로 만들어서 뷰모델측의 코드를 단순화 하는 것이 최선인 것 같습니다.

김보겸님의 프로필 이미지
김보겸

작성한 질문수

질문하기