Replies: 1 comment
-
One fix I can find is to use a StackState, which would handle dismiss for me. However, to use it without a NavigationStack requires some custom container view, which I hope I don't get wrong: struct StackForEach<State: ObservableState, Action, Content: View>: View {
var store: Store<StackState<State>, StackAction<State, Action>>
var content: (Store<State, Action>) -> Content
private var pathView: StackState<State>.PathView
init(store: Store<StackState<State>, StackAction<State, Action>>,
@ViewBuilder content: @escaping (Store<State, Action>) -> Content,
fileID: StaticString = #fileID,
filePath: StaticString = #filePath,
line: UInt = #line,
column: UInt = #column
) {
self.store = store
self.content = content
pathView = store[fileID: #fileID, filePath: #filePath, line: #line, column: #column]
}
var body: some View {
ForEach(pathView, id: \.id) { component in
content(scope(to: component))
}
}
func scope(to component: StackState<State>.Component) -> Store<State, Action> {
let scopeID = store.id(state: \.[id: component.id], action: \.[id: component.id])
var element = component.element
return store.scope(
id: scopeID,
state: ToState {
element = $0[id: component.id] ?? element
return element
},
action: { .element(id: component.id, action: $0) },
isInvalid: { !$0.ids.contains(component.id) })
}
} IMO this is still not ideal. One reason I opt for |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
I am working on a simple main-detail app, where you can open a child page representing some document:
In this design, the child store is always the same object, thanks to the scoping cache, even if the child feature changes its identity logically. For instance, there could be a “Create a Copy” button, which would do something like:
One issue I have observed is that for some conditional view that might crash on the new doc, a re-render is triggered before it is removed:
This view would have being fine:
But when the underlying document is swapped, under some complicated case (in my code, I used UIHostingController and put resolved views (from the new custom container API) into states, so it is really hard to analyze), ActiveSelectionView will re-render and just crash.
I have to admit that this is not a good example. For instance, we should scope to an active selection store and pass it to the
ActiveSelectionView
instead. But I just want to address the other problem. Is there a way to actually get a new child store for the new document?I know that TCA supports multiple presentation destinations using enum:
Is there a similar way for my case here, like
, which does not work with the current macro. It just generates an empty reducer.
Beta Was this translation helpful? Give feedback.
All reactions