是否可以使用.task修饰符更新基于两个值的视图



我有一个视图,一旦用户位置发生变化,它将更新:

...
.task(id: locationManager.currentLocation){

...

}

我添加了一个设置,要求视图更新,即使他们的位置没有。如果位置改变,我将如何对两者进行操作,以便视图更新设置(bool)改变?我可以在.task()修饰符中使用两个值吗?

.task(id: locationManager.currentLocation, someBoolForSetting)

可以是一个简单的String,将两个

.task(id: "(locationManager.currentLocation) (someBoolForSetting)") 

或者一个简单的struct如果你想做一些更花哨的

struct TaskId: Equatable{
var location: CLLocation
var bool: Bool
}
}.task(id: TaskId(location: locationManager.currentLocation, bool: someBoolForSetting)) {

您可以自定义Equatable与第二个一致性,例如仅在坐标发生变化时触发更改,而不触发speed

如果你创建了一个Equatable结构体,它包含了Location和Bool值,你可以使用它作为任务id,例如

struct Model: Equatable {
var location: CLLocation = .init() {
didSet {
print("location", location)
}
}
var someBoolForSetting: Bool = false {
didSet {
print("someBoolForSetting", someBoolForSetting)
}
}
}
struct ContentView: View {

@State private var model = Model()
var body: some View {
VStack {
Button("Update location") {
model.location = CLLocation(latitude: CLLocationDegrees.random(in: -90...90), longitude: CLLocationDegrees.random(in: -180...180))
}
.buttonStyle(.borderedProminent)
Button("toggle setting") {
model.someBoolForSetting.toggle()
}
.buttonStyle(.borderedProminent)
}
.padding()
.task(id: model) {
print("Starting Task")
try? await Task.sleep(nanoseconds: 1_000_000_000)
print("Finishing Task")
}
}
}
Starting Task
Finishing Task
location <-15.42715506,-109.30132874> +/- 0.00m (speed -1.00 mps / course -1.00) @ 10/01/2023, 12:37:14 Greenwich Mean Time
Starting Task
Finishing Task
someBoolForSetting true
Starting Task
Finishing Task
someBoolForSetting false
Starting Task
Finishing Task

最新更新