SwiftUI @AppStorage不会在函数中刷新



我正在尝试每隔.onAppear重新加载数据,但如果我在SettingsView中更改@AppStorage nearMeter的值,它不会更新reloadNearStops函数中的值并使用以前的@AppStorage值。

struct SettingsView: View {
@AppStorage(“nearMeter”) var nearMeter: Int = 1
@State var meters = ["100 m","200 m","400 m","500 m","750 m","1 km"]

var body: some View {

………

Picker(selection: $nearMeter, label: HStack {
Text(NSLocalizedString(“near_stops_distance”, comment: ""))
}) {
ForEach(0 ..< meters.count, id: .self) {
Text(meters[$0])
}
}}}

struct FavouritesView: View {
@AppStorage(“nearMeter”) var nearMeter: Int = 1

func reloadNearStops(nearMeter: Int) {

print(nearMeter)
readNearStopsTimeTable.fetchTimeTable(nearMeter:        getLonLatSpan(nearMeter: nearMeter), lat: (locationManager.lastLocation?.coordinate.latitude)!, lon: (locationManager.lastLocation?.coordinate.longitude)!)
}


func getLonLatSpan(nearMeter: Int) -> Double {
let meters = [100,200,400,500,750,1000]

if nearMeter < meters.count {
return Double(meters[nearMeter]) * 0.00001
}
else {
return 0.001
}
}
var body: some View {


.....

……….
.onAppear() {

if locationManager.lastLocation?.coordinate.longitude != nil {
if hasInternetConnection {
reloadNearStops(nearMeter: nearMeter)
}
}

}}

AppStorage不会调用函数,但当AppStorage发生更改时,onChange可以调用函数。

struct StorageFunctionView: View {
@AppStorage("nearMeter") var nearMeter: Int = 1
@State var text: String = ""
var body: some View {
VStack{
Text(text)
Button("change-storage", action: {
nearMeter = Int.random(in: 0...100)
})
}
//This will listed for changes in AppStorage
.onChange(of: nearMeter, perform: { newNearMeter in
//Then call the function and if you need to pass the new value do it like this
fetchSomething(value: newNearMeter)
})
}
func fetchSomething(value: Int)  {
text = "I'm fetching (value)"
}
}

最新更新