{"id":15288663,"url":"https://github.com/kvyatkovskys/kvkflowcoordinators","last_synced_at":"2026-05-01T10:32:30.681Z","repository":{"id":222118319,"uuid":"755940569","full_name":"kvyatkovskys/KVKFlowCoordinators","owner":"kvyatkovskys","description":"SwiftUI flow coordinators","archived":false,"fork":false,"pushed_at":"2024-12-02T09:37:42.000Z","size":84,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-01T01:46:30.114Z","etag":null,"topics":["coordinators","flow","swiftui"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kvyatkovskys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-11T14:33:01.000Z","updated_at":"2024-10-04T14:58:25.000Z","dependencies_parsed_at":"2024-02-17T10:33:26.477Z","dependency_job_id":"6e3981dd-4510-4d17-a38e-5e3043126d4d","html_url":"https://github.com/kvyatkovskys/KVKFlowCoordinators","commit_stats":null,"previous_names":["kvyatkovskys/kvkflowcoordinators"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kvyatkovskys%2FKVKFlowCoordinators","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kvyatkovskys%2FKVKFlowCoordinators/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kvyatkovskys%2FKVKFlowCoordinators/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kvyatkovskys%2FKVKFlowCoordinators/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kvyatkovskys","download_url":"https://codeload.github.com/kvyatkovskys/KVKFlowCoordinators/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245217791,"owners_count":20579297,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coordinators","flow","swiftui"],"created_at":"2024-09-30T15:51:53.094Z","updated_at":"2026-05-01T10:32:30.625Z","avatar_url":"https://github.com/kvyatkovskys.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-orange.svg)](https://swiftpackageindex.com/kvyatkovskys/KVKFlowCoordinators)\n[![License](https://img.shields.io/cocoapods/l/KVKCalendar.svg?style=flat)](https://cocoapods.org/pods/KVKFlowCoordinators)\n\n# KVKFlowCoordinators\nSwiftUI flow coordinator to control navigation in your App.\n\n## Requirements\n\n- iOS 16.0+, iPadOS 16.0+, MacOS 13.0+ (supports Mac Catalyst)\n- Swift 5.0+\n\n## Installation\n\n**KVKFlowCoordinators** is available through [CocoaPods](https://cocoapods.org) or [Swift Package Manager](https://swift.org/package-manager/).\n\n### CocoaPods\n~~~bash\npod 'KVKFlowCoordinators'\n~~~\n\n[Adding Pods to an Xcode project](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n### Swift Package Manager (Xcode 12 or higher)\n\n1. In Xcode navigate to **File** → **Swift Packages** → **Add Package Dependency...**\n2. Select a project\n3. Paste the repository URL (`https://github.com/kvyatkovskys/KVKFlowCoordinators`) and click **Next**.\n4. For **Rules**, select **Version (Up to Next Major)** and click **Next**.\n5. Click **Finish**.\n\n[Adding Package Dependencies to Your App](https://developer.apple.com/documentation/swift_packages/adding_package_dependencies_to_your_app)\n\n## Usage for SwiftUI\n- Import `KVKFlowCoordinators`\n- Create an entities with type of navigation (for ex.):\n  ```swift\n  enum SheetType: FlowTypeProtocol {\n      case detail\n\n      var pathID: String {\n          \"detail\"\n      }\n  }\n  ```\n- Create a coordinator that inherits from the`FlowCoordinator` base class if you want to use:\n  - `.sheet`\n  - `.navigationDestination`\n  - `.fullScreenCover`\n- Or use a specific coordinator class:\n  - `SheetCoordinator`\n  - `LinkCoordinator`\n  - `CoverCoordinator`\n  - `SheetAndLinkCoordinator`\n  - `SheetAndCoverCoordinator`\n  - `LinkAndCoverCoordinator`\n- Create a `CoordinatorView` -\u003e use the `FlowCoordinatorView` or `FlowCoordinatorSplitView` view with the created coordinator inside body\n  ```swift\n  var body: some View {\n      FlowCoordinatorView(coordinator) {\n          // content\n      }\n  }\n  \n  var body: some View {\n      content\n         .flowCoordinator(coordinator)\n  }\n  \n  var body: some View {\n      FlowCoordinatorSplitView(sideBarCoordinator, detailCoordinator) {\n          // side bar content\n      } detail: {\n          // detail content\n      }\n  }\n  ```\n\nTo work with _navigation link_ use \n```swift\n.flowLink(for: NavigationLinkType.self) { (item) in\n  // content\n}\n```\n###  Doesn't work correctly ❗️\n```swift\n  - .navigationDestination(item: $item)\n  - .flowLink(item: $item)\n```\n\n### Navigation Link Features\n- Pops all the views on the stack except the root view:\n  ```swift\n  func popToRoot()\n  ```\n- Pops the top view from the navigation stack:\n  ```swift\n  func popView()\n  ```\n- Pops views until the specified view is at the top of the navigation stack. Works only if use `coordinator.linkType`: \n  ```swift\n  func popToView(_ pathID: String) -\u003e [String]\n  ```\n  #### Parameter\n  ##### pathID\n  The `pathID` that you want to be at the top of the stack. This view must currently be on the navigation stack.\n  #### Return Value\n  An array containing the path link IDs that were popped from the stack.\n  \n##\n```swift\nfinal class ContentCoordinator: FlowCoordinator\u003cSheetType, LinkType, CoverType\u003e {\n    @Published var vm: ContentViewModel!\n    \n    private(set) var secondContentCoordinator: SecondContentCoordinator!\n    \n    init() {\n        super.init()\n        vm = ContentViewModel(coordinator: self)\n        secondContentCoordinator = SecondContentCoordinator(parentCoordinator: self, title: \"Second Coordinator\")\n    }\n}\n\nstruct ContentCoordinatorView: View {\n    @StateObject private var coordinator = ContentCoordinator()\n    \n    var body: some View {\n        ContentView(vm: coordinator.vm)\n            .fullScreenCover(item: $coordinator.coverType) { (item) in\n                SheetView(title: \"Cover View\")\n            }\n            .sheet(item: $coordinator.sheetType) { (item) in\n                switch item {\n                case .sheetFirst(let title):\n                    SheetView(title: title)\n                }\n            }\n            .flowLink(for: NavigationLinkType.self) { (item) in\n                switch item {\n                case .linkFirstWithParams(let title):\n                    NavigationLinkView(title: title)\n                case .linkSecond:\n                    NavigationLinkView(title: \"Test Second Link\")\n                case .linkSecondCoordinator:\n                    SecondContentCoordinatorView(coordinator: coordinator.secondContentCoordinator)\n                }\n            }\n    }\n}\n\nfinal class ContentViewModel: ObservableObject {    \n    private let coordinator: ContentCoordinator\n    \n    init(coordinator: ContentCoordinator) {\n        self.coordinator = coordinator\n    }\n    \n    func openFirstLink() {\n        coordinator.linkType = .linkFirstWithParams(\"First Link View\")\n    }\n}\n\nstruct ContentView: View {\n    @ObservedObject var vm: ContentViewModel\n    \n    var body: some View {\n        VStack(spacing: 30) {\n            Button(\"Open Sheet\") {\n                vm.openSheetFirst(autoClose: false)\n            }\n            Button(\"Open Auto Close Sheet\") {\n                vm.openSheetFirst(autoClose: true)\n            }\n            Button(\"Open Cover\") {\n                vm.openCoverFirst()\n            }\n            Button(\"Open Link First\") {\n                vm.openFirstLink()\n            }\n            Button(\"Open Complex Btn Link\") {\n                vm.openComplexLink()\n            }\n            NavigationLink(\"Open Complex Nav Link\",\n                           value: ContentViewModel.LinkType.linkSecondCoordinator)\n        }\n    }\n}\n```\n\n## Demo\nhttps://github.com/kvyatkovskys/KVKFlowCoordinators/assets/8233076/4f4bd26b-8103-41a4-94ff-a9e25249bd02\n\n## Author\n\n[Sergei Kviatkovskii](https://github.com/kvyatkovskys)\n\n## License\n\nKVKFlowCoordinators is available under the [MIT license](https://github.com/kvyatkovskys/KVKFlowCoordinators/blob/master/LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkvyatkovskys%2Fkvkflowcoordinators","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkvyatkovskys%2Fkvkflowcoordinators","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkvyatkovskys%2Fkvkflowcoordinators/lists"}