【发布时间】:2021-12-10 16:40:04
【问题描述】:
我在生产中遇到此错误,无法找到重现它的方法。
致命错误 > 未找到 PurchaseManager 类型的 ObservableObject。一种 PurchaseManager 的 View.environmentObject(_:) 可能作为 这种观点的始祖。 > PurchaseManager > SwiftUI
崩溃来自这个观点:
struct PaywallView: View {
@EnvironmentObject private var purchaseManager: PurchaseManager
var body: some View {
// Call to purchaseManager causing the crash
}
}
并且这个视图在 MainView 的子视图中实例化
@main
struct MyApp: App {
let purchasesManager = PurchaseManager.shared
var body: some Scene {
WindowGroup {
MainView()
.environmentObject(purchasesManager)
}
}
}
}
或者,当从 UIKit 控制器调用时,从这个控制器:
final class PaywallHostingController: UIHostingController<AnyView> {
init() {
super.init(rootView:
AnyView(
PaywallView()
.environmentObject(PurchaseManager.shared)
)
)
}
@objc required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我测试了所有触发 PaywallView 显示的用例,我从未遇到过崩溃。
FWIW,PurchaseManager 看起来像这样:
public class PurchaseManager: ObservableObject {
static let shared = PurchaseManager()
init() {
setupRevenueCat()
fetchOfferings()
refreshPurchaserInfo()
}
}
为什么 ObservableObject 会丢失?在什么情况下?
【问题讨论】:
-
可能是因为
private。或者你应该这样做:.environmentObject(PurchaseManager.shared) -
请添加你是如何实现
PurchaseManager.shared的代码 -
@Asperi 为什么?你在找什么?
-
@Asperi 完成。我添加了实现。
-
可能你的
PurchaseManagerinit中的一些函数(比如fetchOfferings)是异步的。这可能是您的问题间歇性出现的原因。