我有一个
NavigationStack
,里面有一个按钮。点击按钮会在 SubscriptionStoreView
内显示 Apple 的 fullScreenCover
。让我惊讶的是,当我点击视图内的“订阅”时,Apple 用于完成购买的控制器被呈现/关闭,它会导致 fullScreenCover
被重新绘制,导致闪烁并重置商店视图的状态。
import SwiftUI
import StoreKit
struct TestView: View {
@State private var isShowingSubscriptionScreen: Bool = false
var body: some View {
NavigationStack {
List {
Section {
HStack {
Label("Subscribe", systemImage:"crown.fill")
.fullScreenCover(isPresented: $isShowingSubscriptionScreen) {
SubscriptionStoreView(groupID: "4CD3E8A1")
}
.onTapGesture {
isShowingSubscriptionScreen = true
}
}
}
}
}
}
}
此外,令我惊讶的是删除
HStack
部分解决了问题。
我可以通过将
fullScreenCover
附加到导航堆栈之外的不同视图来轻松解决此问题,但是我想知道为什么会发生这种情况的解释。即使没有状态,Apple 的控制器如何影响状态并导致我的视图重绘。
状态问题是因为你没有在任何地方调用
isShowingSubscriptionScreen
getter。这是因为你的事实来源是错误的,它不应该是布尔值,而应该是你想要显示的组ID,例如像这样的东西:
struct TestView: View {
@State private var showGroupID: Group.ID? = nil
var body: some View {
NavigationStack {
List {
Section {
HStack {
Label("Subscribe", systemImage:"crown.fill")
.fullScreenCover(item: $showGroupID) { groupID in
SubscriptionStoreView(groupID: groupID)
}
.onTapGesture {
showGroupID = "4CD3E8A1"
}
}
}
}
}
}
}