【发布时间】:2021-05-08 23:34:02
【问题描述】:
我有一个应用程序以类似 redux 的模式使用 StateObject。它一直运行良好 - 直到我尝试使用可以以编程方式使用的 NavigationLinks 实现 NavigationView。
每次我尝试从子视图发送“调度”操作时,都会将子视图从导航堆栈中弹出。我想这个问题可能与我传递环境对象的位置有关,所以我将它从 NavigationView 移动到子视图。没有变化。
为什么我的视图会立即弹出?是否有一些我不知道的重绘触发?
enum NavigationTag: String {
case page1
case page2
}
struct ContentView: View {
@StateObject private var store = AppStore(
initialState: .init(),
reducer: appReducer)
@State private var linkTag: NavigationTag? = .page1
var body: some View {
let splashNavView = NavigationView {
VStack(alignment: .center) {
Text("Loading..." + (linkTag?.rawValue ?? "nil"))
Text("Something went wrong. You shouldn't be seeing this.")
NavigationLink(destination: Page1View().environmentObject(store), tag: .page1, selection: $linkTag) {EmptyView()}
NavigationLink(destination: Text("page 2 view").environmentObject(store), tag: .page2, selection: $linkTag) {EmptyView()}
}
}
return splashNavView
}
}
子视图
struct Page1View: View {
@EnvironmentObject var store: AppStore
var body: some View {
ZStack {
Color.orange
}
.onAppear(perform: {
store.dispatch(.floatingView(action: .setSize(width: 414, height: 590)))
})
.navigationBarTitle("")
.navigationBarHidden(true)
}
}
结果如下:
【问题讨论】:
-
切换到
LazyVStackvsVStack -
@loremipsum 似乎没有任何改变。仍然得到相同的结果。
-
众所周知,SwiftUI 预加载
NavigationLinks 在 SO 中有很多关于它的问题,使用ListLazyVStack应该可以防止它,但有些解决方案需要自定义LazyView -
尝试将 LazyVStack 放在 ScrollView 中