I have a .navigationDestination that when it opens the view the .task{} runs twice or three times. This is bad for url requests. How do I stop this?
<code>NavigationStack(path: $router.navigationPath) {
ZStack {
//....
}
.navigationDestination(for: Router.Destination.self) { destination in
switch destination {
case .book(let book, let location):
BookDetailsView(book: book, location: location)
case .collection(let collection, let location):
CollectionDetailsView(collection: collection, location: location)
case .topic(let topic, let location):
TopicDetailsView(topic: topic, location: location)
case .author(let author, let location):
AuthorDetailsView(author: author, location: location)
}
}
}
</code>
<code>NavigationStack(path: $router.navigationPath) {
ZStack {
//....
}
.navigationDestination(for: Router.Destination.self) { destination in
switch destination {
case .book(let book, let location):
BookDetailsView(book: book, location: location)
case .collection(let collection, let location):
CollectionDetailsView(collection: collection, location: location)
case .topic(let topic, let location):
TopicDetailsView(topic: topic, location: location)
case .author(let author, let location):
AuthorDetailsView(author: author, location: location)
}
}
}
</code>
NavigationStack(path: $router.navigationPath) {
ZStack {
//....
}
.navigationDestination(for: Router.Destination.self) { destination in
switch destination {
case .book(let book, let location):
BookDetailsView(book: book, location: location)
case .collection(let collection, let location):
CollectionDetailsView(collection: collection, location: location)
case .topic(let topic, let location):
TopicDetailsView(topic: topic, location: location)
case .author(let author, let location):
AuthorDetailsView(author: author, location: location)
}
}
}
A .onAppear{} or a .task{} in any of these views will be called twice and sometimes three times.
Here is some of the other code:
<code>func navigate(to destination: Destination) {
navigationPath.append(destination)
}
</code>
<code>func navigate(to destination: Destination) {
navigationPath.append(destination)
}
</code>
func navigate(to destination: Destination) {
navigationPath.append(destination)
}
This is called from a button in another view.
<code>public enum Destination: Hashable {
case book(_ book: BookViewModel, _ location: Storage.Location)
case collection(_ collection: CollectionViewModel, _ location: Storage.Location)
case topic(_ topic: TopicViewModel, _ location: Storage.Location)
case author(_ author: AuthorViewModel, _ location: Storage.Location)
}
</code>
<code>public enum Destination: Hashable {
case book(_ book: BookViewModel, _ location: Storage.Location)
case collection(_ collection: CollectionViewModel, _ location: Storage.Location)
case topic(_ topic: TopicViewModel, _ location: Storage.Location)
case author(_ author: AuthorViewModel, _ location: Storage.Location)
}
</code>
public enum Destination: Hashable {
case book(_ book: BookViewModel, _ location: Storage.Location)
case collection(_ collection: CollectionViewModel, _ location: Storage.Location)
case topic(_ topic: TopicViewModel, _ location: Storage.Location)
case author(_ author: AuthorViewModel, _ location: Storage.Location)
}
And this is what is being passed to the navigationStack. The ViewModels are ObservableObjects
Is there any way to stop this?