O QUE EU PRECISO: Tenho um stepper para definir um valor. Esse valor é completamente diferente se o usuário estiver usando o aplicativo com unidades diferentes.
QUAL É O PROBLEMA: Enquanto eu apenas brinco com o seletor de unidade na aba de configurações, o valor (armazenado como @AppStorage na aba de configurações) na aba principal atualiza corretamente. Quando eu toco no stepper e modifico o valor na aba principal, se eu tento modificar a unidade na aba de configurações, tudo bagunça! (Enquanto o valor na aba de configurações continua atualizando corretamente, o valor exibido na aba principal não).
GUIA DE CONFIGURAÇÃO: classe
Defaults: ObservableObject {
@AppStorage("appUnits") var appUnits: String = "🇪🇺"
@AppStorage("memorizedDensity") var density: Double = 0.794
}
struct settings: View {
@ObservedObject var defaults = Defaults()
var body: some View {
List {
Section {
HStack {
ViewThatFits {
Text("App default Units")
}
Spacer(minLength: 10)
Picker(selection: $defaults.appUnits, label: Text("Unit")) {
ForEach(["🇪🇺", "🇺🇸"], id: \.self) {riga in
Text(riga)
}
}
.onChange(of: defaults.appUnits) {newValue in
if newValue == "🇪🇺" {
defaults.density = 0.793
} else if newValue == "🇺🇸" {
defaults.density = 6.66
}
// I need to set a different value when the unit changes
print(defaults.density)
}
.frame(width: 120)
.pickerStyle(.segmented)
}
}
}
}
}
GUIA PRINCIPAL:
struct stepper: View {
@ObservedObject var defaults = Defaults()
var body: some View { fuelDatas }
var fuelDatas: some View {
VStack {
Text("Fuel density")
HStack {
Text(defaults.density, format: .number.precision(.fractionLength(defaults.appUnits == "🇪🇺" ? 3 : 2)))
Text(defaults.appUnits == "🇪🇺" ? "g/ml" : "lb/US gal")
}
Stepper("", value: defaults.$density, in: defaults.appUnits == "🇪🇺" ? 0.750...0.850 : 6...7, step: defaults.appUnits == "🇪🇺" ? 0.001 : 0.01)
.frame(width: 50.0)
}
}
}
Eu sei que estou mexendo com as coisas de ligação e provavelmente estou criando 2 fontes de verdade, mas não consigo encontrar o que está errado no código! Aqui está o projeto de exemplo-
O ideal é que você apenas declare o
@AppStorage
s no seuView
s, em vez de envolvê-lo em outraDefaults
classe.Sua corrente realmente funciona se você tirar as duas visualizações do
TabView
, então parece que essa é outra daquelas peculiaridades queTabView
tem.Se você realmente quer um
Defaults
objeto por algum motivo, uma maneira de fazer isso funcionar é garantir que todas as suas visualizações usem o mesmo objeto.Na sua visualização de abas, declare a
@StateObject
e passe-o para o stepper e as configurações.Você também pode passar como um
@EnvironmentObject
,