本文介绍了可以在SwiftUI的环境中使用@AppStorage吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

@AppStorage是否可以在SwiftUI的环境中使用,如果可以,您将如何使用它?

Can @AppStorage be used in the Environment in SwiftUI, if so, how would you do it?

我知道您可以使用@Bindings将@AppStorage的值从一个视图发送到另一个视图,这是一个普遍的问题,我想知道是否有可能将其放入环境中.对于何时适用,我没有实际的例子,但我想知道是否有可能.

I know you can send the value for the @AppStorage from one view to another using @Bindings as a general wondering I would like to know if its possible to put it in the environment. I don't have a practical example as to when this would be applicable, but I was wondering if it was possible.

这足以使工作疯狂吗?我认为您只会存储该值,而不会存储在UserDefault中.

Would this be crazy enough to work? I think you will only store the value and it won't be stored in the UserDefault.

struct RootView: View {
    @AppStorage("userPreferredDisplayMode") private var userPreferredDisplayMode: String = "automatic"
    @Environment(\.userPreferredDisplayMode) private var envUserPreferredDisplayMode: String

    var body: some View {
        Text(title)
            .environment(\.userPreferredDisplayMode, envUserPreferredDisplayMode)
    }
}

推荐答案

事实证明您可以.

struct CustomTextKey: EnvironmentKey {
    static var defaultValue: Binding<String> = Binding.constant("Default Text")
}

extension EnvironmentValues {
    var customText: Binding<String> {
        get { self[CustomTextKey.self] }
        set { self[CustomTextKey.self] = newValue }
    }
}

struct ContentView: View {
    @AppStorage("text") private var text: String = ""

    var body: some View {
        TextEditor(text: $text).padding()
        Divider()
        SecondView()
            .environment(\.customText, $text)
    }
}

struct SecondView: View {
    var body: some View {
        ThirdView()
    }
}
struct ThirdView: View {
    @Environment(\.customText) private var text: Binding<String>

    var body: some View {
        TextEditor(text: text).padding()
    }
}

这篇关于可以在SwiftUI的环境中使用@AppStorage吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-15 05:04