Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

코디네이터 패턴(StackCoordinator) 사용법 #88

Open
2 tasks
dodo849 opened this issue Jun 6, 2023 · 0 comments
Open
2 tasks

코디네이터 패턴(StackCoordinator) 사용법 #88

dodo849 opened this issue Jun 6, 2023 · 0 comments
Labels
documentation Improvements or additions to documentation

Comments

@dodo849
Copy link
Contributor

dodo849 commented Jun 6, 2023

코디네이터 적용에 필요한 베이스들을 StackCoordinator라는 패키지로 분리했습니다.
의존성은 추가되어 있습니다.

사용법

1. LinkProtocol 구현

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을 채택하는 열거형을 구현합니다.
  • case는 path에 추가될 뷰 종류입니다.
  • matchView() 를 구현해 다음 뷰를 지정해줍니다.
  • 이전 뷰에서 받아야하는 정보가 있다면 Associate Values(enum 파라미터)로 전달합니다.
    • 이때 전달받는 인자는 HashableEqutable을 채택해야합니다. 따라서 전달하고자 하는 구조체, 클래스에 두 프로토콜과 구현을 추가해주세요.
    • BaseCoordinator는 Hashable, Equtable를 채택하고 있어서 추가 구현 없이 전달할 수 있습니다.

2. BuilderProtocol구현

struct HomeBuilder: BuilderProtocol {
    
    var coordinator: BaseCoordinator<HomeLink>
    
    var body: some View {
        BaseBuilder(coordinator: coordinator) {
            HomeView(
                viewModel: HomeViewModel(coordinator: coordinator),
                predictVM: PredictionVM()
           )
        }
    }
}
  • 위와 같이 BuilderProtocol를 채택하는 구조체를 구현합니다.
  • BuilderProtocolcoordinator를 인자로 받아야합니다.
    • coordinator는 BaseCoordinator라는 패키지 제공 클래스를 통해 선언합니다.
    • 제네릭에 알맞은 Link 타입을 전달해주세요
  • 구현부의 BaseBuilder는 그대로 작성해주세요.
  • BaseBuilder 클로저에 기존에 구현했던 뷰를 넣어주세요.

3. 화면전환

self.coordinator.path.append(HomeLink.healthInfo)
  • 화면을 전환할 때는 위와 같이 작성합니다.
  • 이때 Link타입을 꼭 명시해주세요.

3-1. 풀스크린모달

self.coordinator.sheet = HomeLink.healthInfo
  • fullsheet으로 올리고 싶다면 위와 같이 작성합니다.

⚠️ 주의사항

NaviagtionStack이 루트에 선언되어 있기 때문에 하위뷰에서 다시 선언하면 오류가 발생합니다. (크래쉬 납니다)
따라서 절대로 NavigationStack을 재선언하지 마세요.

루트에서 path를 push하는게 아니라 하위에서 새로운 흐름을 생성해서 가져가는 방식도 있으면 좋을 것 같은데 아이디어가 아직 없네요.
좋은 생각 있으시면 알려주세요~~


아직 적용 안된 부분 (전체에 영향 없는 파트라 추후 설정하겠습니다)

  • 설정뷰
  • 홈 화면 자가진단 바로가기 버튼

그 외 적용 안된 뷰가 있거나 이슈가 있으면 말씀주세용

@dodo849 dodo849 added the documentation Improvements or additions to documentation label Jun 6, 2023
@dodo849 dodo849 pinned this issue Jun 6, 2023
@KoreaMango KoreaMango mentioned this issue Jun 7, 2023
12 tasks
@dodo849 dodo849 unpinned this issue Jun 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant