ios 在SwiftUI NavigationLink中将Environment Object传递给动态导航目标

bis0qfac  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(88)

我正在为我的SwiftUI应用程序编写一个路由器,我在视图之间共享共享注册表单数据时遇到了麻烦。
这是我的路由器

struct ScanningFlowRouter: Routing {
    func view(for route: ScanningFlowRoute) -> some View {
        var nextView: AnyView
        switch route {
        case .home:
            nextView = AnyView(Landing(startScanningFlow: .constant(false), scanningFlowRouter: self))
        case .name_email:
            nextView = AnyView(NameEmail(scanningFlowRouter: self))
        }
        
        return nextView
    }
}

以及NavigationLink

NavigationLink(
                destination:
                    scanningFlowRouter.view(for: .name_email),
                isActive: $startScanningFlow,
                label: {
                    EmptyView()
                }
            )

渲染NavigationViewNavigationLink的视图通过.environmnetObject(formData: formData)传递了一个环境对象,但是我得到了一个错误,即NameEmail视图没有对环境的引用。当我向路由器添加一个环境(编辑env使其成为共享单例)时,如

return nextView.environmentObject(FormData.shared)

...我的导航不再工作,屏幕什么也不做。
有人知道发生了什么吗?

nimxete2

nimxete21#

我可以展示一些不同于路由器的导航风格(这对我来说不是很容易理解:),这是如何处理我们的内容的例子之一。
我更喜欢使用一些基本的内容管理器。例如,在中的开头,您可以使用以下内容:

final class ContentViewModel: ObservableObject {

   var content: ContentState = .locked

}

extension ContentViewModel {
   enum ContentState {
        // show sign in / registration view
        case locked
        // show tab bar for example
        case unlocked
   }
}

在你的内容视图中实现这样的东西。我喜欢它的环境灵活性。

@EnvironmentObject var viewModel: ContentViewModel

var body: some View {
    NavigationView {
         switch viewModel.screenState {
            case .locked:
                HelloScreenView()
            case .unlocked:
                TabBarView()
        }
    }
}

因此,在您的逻辑中,您可以更改内容状态,例如成功登录后

请注意,我们从一开始就有NavigationView,所以接下来的任何地方都可以将NavigationLinks放在您想要的地方。此外,我们可以在应用程序中为一些视图实现类似的“管理器”。

相关问题