简体   繁体   English

SwiftUI View 协议中的 EnvironmentObject

[英]EnvironmentObject in protocol of SwiftUI View

I want to make protocol like this :我想制作这样的协议:

protocol SubscriptionManagerView: View {
    var subscriptionManager: EnvironmentObject<SubscriptionManager> { get set }
}

To use in view like this for exemple :像这样在视图中使用,例如:

struct Shop: View, SubscriptionManager {
    @EnvironmentObject var subscriptionManager: SubscriptionManager

First problem is that property wrapper @EnvironmentObject can't make me respond to protocol SubscriptionManagerView.第一个问题是属性包装器@EnvironmentObject 不能让我响应协议 SubscriptionManagerView。

Finally I want to use for a custom modifier like this :最后,我想用于这样的自定义修饰符:

extension View where Self : SubscriptionManagerView {
    func subscriptionManagerAlert() -> some View {
        self.alert(isPresented: self.$subscriptionManager.stateShowAlert) {
            Alert(title: Text(self.subscriptionManager.transactionStateTitle)
                ...
                  }))
        }
    }
}

Any idea to work in this way ?任何想法以这种方式工作?

Here is a demo of possible approach - the idea is to use view modifier with explicitly injected subscription manager, so contract of interface guaranties that client view of modifier will provide us required object.这是一个可能的方法的演示 - 想法是使用带有显式注入订阅管理器的视图修饰符,因此接口合同保证修饰符的客户端视图将为我们提供所需的对象。

Tested with Xcode 12 / iOS 14.使用 Xcode 12 / iOS 14 测试。

class SubscriptionManager: ObservableObject {
    @Published var stateShowAlert: Bool = false
    @Published var transactionStateTitle = "Test"
}

struct SubscriptionManagerModifier: ViewModifier {
    @ObservedObject var subscriptionManager: SubscriptionManager
    func body(content: Content) -> some View {
        content
            .alert(isPresented: self.$subscriptionManager.stateShowAlert) {
                Alert(title: Text(self.subscriptionManager.transactionStateTitle))
            }
    }
}

extension View {
    func subscriptionManagerAlert(with subscriptionManager: SubscriptionManager) -> some View {
        self.modifier(SubscriptionManagerModifier(subscriptionManager: subscriptionManager))
    }
}

struct Shop: View {
    
    @EnvironmentObject var subscriptionManager: SubscriptionManager
    
    var body: some View {
        Button("Test") {
            subscriptionManager.stateShowAlert.toggle()
        }
        .subscriptionManagerAlert(with: subscriptionManager)
    }
}

struct Shop_Previews: PreviewProvider {
    static var previews: some View {
        Shop().environmentObject(SubscriptionManager())
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SwiftUI @EnvironmentObject 在嵌套视图中共享 - SwiftUI @EnvironmentObject shared in nested view SwiftUI 视图未更新为 EnvironmentObject 更改 - SwiftUI view is not updating to EnvironmentObject change SwiftUI EnvironmentObject 与 View 不同步 - SwiftUI EnvironmentObject out of sync with View 如何在 Swiftui View 函数中使用 EnvironmentObject? - how to use EnvironmentObject in a Swiftui View function? SwiftUI - 使用&#39;ObservableObject&#39; 和@EnvironmentObject 有条件地显示视图 - SwiftUI - Using 'ObservableObject' and @EnvironmentObject to Conditionally Display View SwiftUI @EnvironmentObject 错误:可能缺少此视图的祖先 - SwiftUI @EnvironmentObject error: may be missing as an ancestor of this view SwiftUI - 如何将 EnvironmentObject 传递到视图模型中? - SwiftUI - How to pass EnvironmentObject into View Model? SwiftUI A View.environmentObject(_:) for 可能作为此视图的祖先丢失。:文件 - SwiftUI A View.environmentObject(_:) for may be missing as an ancestor of this view.: file SwiftUI EnvironmentObject 不会重绘当前视图,而是重绘其父视图 - SwiftUI EnvironmentObject does not redraw the current view but its parent view SwiftUI @EnvironmentObject 错误:可能缺少此视图的祖先——访问 init() 中的对象 - SwiftUI @EnvironmentObject error: may be missing as an ancestor of this view -- accessing object in the init()
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM