swift - 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
不会调用函数,但onChange
可以在AppStorage
更改时调用函数。
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)"
}
}
推荐阅读
- laravel - Laravel Mailgun 电子邮件发送需要 10 秒
- kubernetes - Kubernetes - 守护进程错误原因
- ios - UICollectionView:随机单元格突出显示
- node.js - TypeScript:使用 ZeroMQ ROUTER/DEALER 时会消耗大量内存
- java - Spring boot hibernate中@OneToOne的真正目的是什么?
- tfs - TF400813: 用户 {userguid} 无权访问此资源
- spring-boot - 无法读取 intellij 属性文件中新输入的字段
- django - Django-jet admin-为每一行添加按钮
- ckeditor - CKEditor - 将现有图像路径传递给文件浏览器
- angular - Ionic 3 - Angular 5 -- 时间格式更改