Open dodo849 opened 1 year ago
코디네이터 적용에 필요한 베이스들을 StackCoordinator라는 패키지로 분리했습니다. 의존성은 추가되어 있습니다.
enum HomeLink: LinkProtocol { case healthInfo case quiz(_ : Quiz, _ : BaseCoordinator<QuizLink>) func matchView() -> any View { switch self { case .healthInfo: return HealthInfoView() case .quiz(let quiz, let coordinator): return QuizBuilder( quiz: quiz, coordinator: coordinator ) } } }
LinkProtocol
path
matchView()
struct HomeBuilder: BuilderProtocol { var coordinator: BaseCoordinator<HomeLink> var body: some View { BaseBuilder(coordinator: coordinator) { HomeView( viewModel: HomeViewModel(coordinator: coordinator), predictVM: PredictionVM() ) } } }
BuilderProtocol
coordinator
BaseCoordinator
BaseBuilder
self.coordinator.path.append(HomeLink.healthInfo)
self.coordinator.sheet = HomeLink.healthInfo
NaviagtionStack이 루트에 선언되어 있기 때문에 하위뷰에서 다시 선언하면 오류가 발생합니다. (크래쉬 납니다) 따라서 절대로 NavigationStack을 재선언하지 마세요.
루트에서 path를 push하는게 아니라 하위에서 새로운 흐름을 생성해서 가져가는 방식도 있으면 좋을 것 같은데 아이디어가 아직 없네요. 좋은 생각 있으시면 알려주세요~~
아직 적용 안된 부분 (전체에 영향 없는 파트라 추후 설정하겠습니다)
그 외 적용 안된 뷰가 있거나 이슈가 있으면 말씀주세용
코디네이터 적용에 필요한 베이스들을 StackCoordinator라는 패키지로 분리했습니다. 의존성은 추가되어 있습니다.
사용법
1. LinkProtocol 구현
LinkProtocol
을 채택하는 열거형을 구현합니다.path
에 추가될 뷰 종류입니다.matchView()
를 구현해 다음 뷰를 지정해줍니다.2. BuilderProtocol구현
BuilderProtocol
를 채택하는 구조체를 구현합니다.BuilderProtocol
은coordinator
를 인자로 받아야합니다.BaseCoordinator
라는 패키지 제공 클래스를 통해 선언합니다.BaseBuilder
는 그대로 작성해주세요.BaseBuilder
클로저에 기존에 구현했던 뷰를 넣어주세요.3. 화면전환
3-1. 풀스크린모달
⚠️ 주의사항
NaviagtionStack이 루트에 선언되어 있기 때문에 하위뷰에서 다시 선언하면 오류가 발생합니다. (크래쉬 납니다) 따라서 절대로 NavigationStack을 재선언하지 마세요.
아직 적용 안된 부분 (전체에 영향 없는 파트라 추후 설정하겠습니다)