Skip to content

Commit add71eb

Browse files
Merge branch 'simba909/main'
2 parents 55a3718 + fbc03de commit add71eb

File tree

4 files changed

+22
-25
lines changed

4 files changed

+22
-25
lines changed

Sources/NavigationBackport/NBNavigationLink.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public struct NBNavigationLink<P: Hashable, Label: View>: View {
77
var value: P?
88
var label: Label
99

10-
@EnvironmentObject var pathAppender: PathAppender
10+
@EnvironmentObject var pathHolder: Unobserved<NavigationPathHolder>
1111

1212
public init(value: P?, @ViewBuilder label: () -> Label) {
1313
self.value = value
@@ -20,7 +20,7 @@ public struct NBNavigationLink<P: Hashable, Label: View>: View {
2020
Button(
2121
action: {
2222
guard let value = value else { return }
23-
pathAppender.append?(value)
23+
pathHolder.object.path.append(value)
2424
},
2525
label: { label }
2626
)

Sources/NavigationBackport/NBNavigationStack.swift

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ public struct NBNavigationStack<Root: View, Data: Hashable>: View {
77
@Binding var externalTypedPath: [Data]
88
@State var internalTypedPath: [Data] = []
99
@StateObject var path: NavigationPathHolder
10-
@StateObject var pathAppender = PathAppender()
1110
@StateObject var destinationBuilder = DestinationBuilderHolder()
1211
@Environment(\.useNavigationStack) var useNavigationStack
1312
var root: Root
@@ -21,33 +20,28 @@ public struct NBNavigationStack<Root: View, Data: Hashable>: View {
2120
}
2221
}
2322

23+
@ViewBuilder
2424
var content: some View {
25-
pathAppender.append = { [weak path] newElement in
26-
path?.path.append(newElement)
27-
}
2825
if #available(iOS 16.0, *, macOS 13.0, *, watchOS 9.0, *, tvOS 16.0, *), useNavigationStack == .whenAvailable {
29-
return AnyView(
30-
NavigationStack(path: $path.path) {
31-
root
32-
.navigationDestination(for: AnyHashable.self, destination: { destinationBuilder.build($0) })
33-
.navigationDestination(for: LocalDestinationID.self, destination: { destinationBuilder.build($0) })
34-
}
35-
.environment(\.isWithinNavigationStack, true)
36-
)
37-
}
38-
return AnyView(
26+
NavigationStack(path: $path.path) {
27+
root
28+
.navigationDestination(for: AnyHashable.self, destination: { destinationBuilder.build($0) })
29+
.navigationDestination(for: LocalDestinationID.self, destination: { destinationBuilder.build($0) })
30+
}
31+
.environment(\.isWithinNavigationStack, true)
32+
} else {
3933
NavigationView {
4034
Router(rootView: root, screens: $path.path)
4135
}
4236
.navigationViewStyle(supportedNavigationViewStyle)
4337
.environment(\.isWithinNavigationStack, false)
44-
)
38+
}
4539
}
4640

4741
public var body: some View {
4842
content
4943
.environmentObject(path)
50-
.environmentObject(pathAppender)
44+
.environmentObject(Unobserved(object: path))
5145
.environmentObject(destinationBuilder)
5246
.environmentObject(Navigator(useInternalTypedPath ? $internalTypedPath : $externalTypedPath))
5347
.onFirstAppear {

Sources/NavigationBackport/PathAppender.swift

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import SwiftUI
2+
3+
/// A wrapper that allows access to an observable object without publishing its changes.
4+
class Unobserved<Object: ObservableObject>: ObservableObject {
5+
let object: Object
6+
7+
init(object: Object) {
8+
self.object = object
9+
}
10+
}

0 commit comments

Comments
 (0)