SwiftUI:无法推断通用参数 'Subject'

SwiftUI: Generic parameter 'Subject' could not be inferred

我用 SwiftUI 构建了一个 LoadingView,用于在我从 API 获取远程数据时显示我的应用程序中的一些加载内容。我正在使用 Xcode 版本 11.0 beta 5。

这是LoadingView:

struct LoadingView<Content>: View where Content: View {

    @Binding var isShowing: Bool
    var content: () -> Content

    var body: some View {

        GeometryReader { geometry in

            ZStack(alignment: .center) {

                self.content()
                    .disabled(self.isShowing)
                    .blur(radius: self.isShowing ? 3 : 0)

                VStack {
                    Text("Loading...")
                    ActivityIndicator(isAnimating: .constant(true), style: .large)
                }
                .frame(width: geometry.size.width / 2,
                       height: geometry.size.height / 5)
                    .background(Color.white)
                    .foregroundColor(Color.primary)
                    .cornerRadius(5)
                    .opacity(self.isShowing ? 1 : 0)
            }
        }
    }
}

这是我的数据存储。它被声明为ObservableObject并且有多个@Published属性。它还从 API:

进行一些远程获取
class CharacterStore: ObservableObject {

    @Published private(set) var isLoading = false


    // Fetches some stuff from a remote api
    func fetch() {

        self.isLoading = true

        myService.getCharacters { (result) in
            DispatchQueue.main.async {
                self.isLoading = false
            }
        }
    }
}

最后,这是我要显示我的 LoadingView 的视图,其中包含 ContentView 的内容。当然,我在显示此视图之前设置 @EnvironmentObject

struct ContentView: View {

    @EnvironmentObject var charStore: CharacterStore

    var body: some View {

        LoadingView(isShowing: self.$charStore.isLoading) { // Here I get the error

            // Show some Content here
            Text("")
        }
    }
}

问题是我想将 self.$charStore.isLoading 绑定到 LoadingView。在这一行中,我收到以下错误:

Generic parameter 'Subject' could not be inferred

我尝试了几种方法,但其中 none 行得通。顺便说一句:如果我在 ContentView 中使用 @State 属性 它就像这样工作得很好:

struct ContentView: View {

    @EnvironmentObject var charStore: CharacterStore

    @State var loads: Bool = false

    var body: some View {

        LoadingView(isShowing: self.$loads) { // Here I get no error

            // Show some Content here
            Text("")
        }
    }
}

我错过了什么吗?如果您需要更多信息,请告诉我,如果需要,我可以提供更多内容。

感谢您的帮助!

由于您的 LoadingView 不会修改 .isLoading,因此您无需将其作为绑定传递:

LoadingView(isShowing: self.$charStore.isLoading)

而是删除 LoadingView 中的 @Binding:

struct LoadingView<Content>: View where Content: View {

    var isShowing: Bool
    ...

并像这样创建它(删除美元符号):

LoadingView(isShowing: self.charStore.isLoading) { ... }

相反,如果你坚持要传递一个绑定,那么你需要把private(set)从:

中去掉
@Published private(set) var isLoading = false

您不能执行以下操作:

将 @Binding 替换为与 ContentView 使用的相同的 @EnvironmentObject。

struct LoadingView<Content>: View where Content: View {
    @EnvirontmentObject var charStore: CharacterStore // added
    //@Binding var isShowing: Bool // removed
    var content: () -> Content

    var body: some View {

        GeometryReader { geometry in

            ZStack(alignment: .center) {

                self.content()
                    .disabled(self.$charStore.isLoading) // Changed
                    .blur(radius: self.$charStore.isLoading ? 3 : 0) // Changed

                VStack {
                    Text("Loading...")
                    ActivityIndicator(isAnimating: .constant(true), style: .large)
                }
                .frame(width: geometry.size.width / 2,
                       height: geometry.size.height / 5)
                    .background(Color.white)
                    .foregroundColor(Color.primary)
                    .cornerRadius(5)
                    .opacity(self.$charStore.isLoading ? 1 : 0) // Changed
            }
        }
    }
}

当然,您还必须从 ContentView 的 LoadingView() 初始化程序中删除 isShowing 参数。

如有错误请指正!