Можно ли использовать @AppStorage в среде SwiftUI?

#swift #swiftui #environment #appstorage

#swift #swiftui #Окружающая среда #appstorage

Вопрос:

Можно ли использовать @AppStorage в среде SwiftUI, если да, то как бы вы это сделали?

Я знаю, что вы можете отправить значение для @AppStorage из одного представления в другое, используя @Bindings в качестве общего вопроса, который я хотел бы знать, возможно ли поместить его в среду. У меня нет практического примера того, когда это будет применимо, но мне было интересно, возможно ли это.

Будет ли это достаточно сумасшедшим, чтобы работать? Я думаю, вы сохраните только значение, и оно не будет сохранено в 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)
    }
}
  

Комментарии:

1. Часть «только для чтения» была тем, что мне действительно было нужно. У вас будет доступ к значению, а не к AppStorage / UserDefaults.

Ответ №1:

Оказывается, можно.

 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()
    }
}