Я пытался удалить использование в Синглтоне в своем приложении, и вместо этого использовал значения @environment swiftui, но мое приложение вылетает. Может ли кто -нибудь указать, как исправить ошибку или некоторые шаги отладки для этого? Спасибо.Thread 1: Fatal error: ExperimentManager not set in environment.
< /code>
Ключи моей среды: < /p>
import SwiftUI
// MARK: - TaskManager
private struct TaskManagerKey: EnvironmentKey {
static let defaultValue: TaskManager = {
fatalError("TaskManager not set in environment.")
}()
}
extension EnvironmentValues {
var taskManager: TaskManager {
get { self[TaskManagerKey.self] }
set { self[TaskManagerKey.self] = newValue }
}
}
// MARK: - AssessmentManager
private struct AssessmentManagerKey: EnvironmentKey {
static let defaultValue: AssessmentManager = {
fatalError("AssessmentManager not set in environment.")
}()
}
extension EnvironmentValues {
var assessmentManager: AssessmentManager {
get { self[AssessmentManagerKey.self] }
set { self[AssessmentManagerKey.self] = newValue }
}
}
// MARK: - WorkoutManager
private struct WorkoutManagerKey: EnvironmentKey {
static let defaultValue: WorkoutManager = {
fatalError("WorkoutManager not set in environment.")
}()
}
extension EnvironmentValues {
var workoutManager: WorkoutManager {
get { self[WorkoutManagerKey.self] }
set { self[WorkoutManagerKey.self] = newValue }
}
}
// MARK: - BlueprintManager
private struct BlueprintManagerKey: EnvironmentKey {
static let defaultValue: BlueprintManager = {
fatalError("BlueprintManager not set in environment.")
}()
}
extension EnvironmentValues {
var blueprintManager: BlueprintManager {
get { self[BlueprintManagerKey.self] }
set { self[BlueprintManagerKey.self] = newValue }
}
}
// MARK: - GoalManager
private struct GoalManagerKey: EnvironmentKey {
static let defaultValue: GoalManager = {
fatalError("GoalManager not set in environment.")
}()
}
extension EnvironmentValues {
var goalManager: GoalManager {
get { self[GoalManagerKey.self] }
set { self[GoalManagerKey.self] = newValue }
}
}
// MARK: - ImageManager
private struct ImageManagerKey: EnvironmentKey {
static let defaultValue: ImageManager = {
fatalError("ImageManager not set in environment.")
}()
}
extension EnvironmentValues {
var imageManager: ImageManager {
get { self[ImageManagerKey.self] }
set { self[ImageManagerKey.self] = newValue }
}
}
// MARK: - ServiceManager
private struct ServiceManagerKey: EnvironmentKey {
static let defaultValue: ServiceManager = {
fatalError("ServiceManager not set in environment.")
}()
}
extension EnvironmentValues {
var serviceManager: ServiceManager {
get { self[ServiceManagerKey.self] }
set { self[ServiceManagerKey.self] = newValue }
}
}
// MARK: - SuggestedGoalsDataSource
private struct SuggestedGoalsDataSourceKey: EnvironmentKey {
static let defaultValue: SuggestedGoalsDataSource = {
fatalError("SuggestedGoalsDataSource not set in environment.")
}()
}
extension EnvironmentValues {
var suggestedGoalsDataSource: SuggestedGoalsDataSource {
get { self[SuggestedGoalsDataSourceKey.self] }
set { self[SuggestedGoalsDataSourceKey.self] = newValue }
}
}
// MARK: - ExperimentManager
private struct ExperimentManagerKey: EnvironmentKey {
static let defaultValue: ExperimentManager = {
fatalError("ExperimentManager not set in environment.")
}()
}
extension EnvironmentValues {
var experimentManager: ExperimentManager {
get { self[ExperimentManagerKey.self] }
set { self[ExperimentManagerKey.self] = newValue }
}
}
< /code>
app struct: < /p>
import Supabase
import SwiftData
import SwiftUI
@main
struct ImproveMyselfApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
@StateObject private var accountManager: AccountManager
@StateObject private var blueprintManager: BlueprintManager
private var taskManager: TaskManager
private var workoutManager: WorkoutManager
private var assessmentManager: AssessmentManager
private var goalManager: GoalManager
private var imageManager: ImageManager
private var serviceManager: ServiceManager
private var suggestedGoalsDataSource: SuggestedGoalsDataSource
private var experimentManager: ExperimentManager
@State private var hasCompletedOnboarding = UserDefaults.standard.bool(
forKey: "HasCompletedOnboarding"
)
@State private var isInitialized = false
@State private var errorMessage: String?
let userDataContainer: ModelContainer
init() {
do {
userDataContainer = try ModelContainer(
for: UserData.self,
BeforePhoto.self,
Blueprint.self,
InspirationImage.self,
QuoteFileUsage1.self,
LifeAreaRating1.self,
MentalState.self,
SuggestedGoalChoices.self,
SuggestedGoalPairEntity.self,
TaskItem.self,
TaskCompletion.self,
ShareItem.self,
Suggestion.self,
Comment.self,
Vote.self,
Tag.self,
WorkoutPlan.self,
WorkoutExercise.self,
Subtask.self
)
let modelContext = userDataContainer.mainContext
let accountMgr = AccountManager(modelContext: modelContext)
_accountManager = StateObject(wrappedValue: accountMgr)
let blueprintMgr = BlueprintManager(
modelContext: modelContext,
accountManager: accountMgr
)
_blueprintManager = StateObject(wrappedValue: blueprintMgr)
taskManager = TaskManager(
modelContext: modelContext,
accountManager: accountMgr
)
workoutManager = WorkoutManager(
modelContext: modelContext,
accountManager: accountMgr
)
assessmentManager = AssessmentManager(
modelContext: modelContext,
accountManager: accountMgr
)
goalManager = GoalManager(
modelContext: modelContext,
accountManager: accountMgr
)
imageManager = ImageManager(
modelContext: modelContext,
accountManager: accountMgr
)
serviceManager = ServiceManager(modelContext: modelContext)
suggestedGoalsDataSource = SuggestedGoalsDataSource(
modelContext: modelContext
)
experimentManager = ExperimentManager()
} catch {
fatalError("Failed to initialize ModelContainer: \(error)")
}
print(URL.applicationSupportDirectory.path(percentEncoded: false))
}
var body: some Scene {
WindowGroup {
if isInitialized {
RootView(hasCompletedOnboarding: $hasCompletedOnboarding)
.onOpenURL { url in
handleDeepLink(url)
}
.modelContext(userDataContainer.mainContext)
.environmentObject(accountManager)
.environmentObject(blueprintManager)
.environment(\.taskManager, taskManager)
.environment(\.assessmentManager, assessmentManager)
.environment(\.workoutManager, workoutManager)
.environment(\.goalManager, goalManager)
.environment(\.imageManager, imageManager)
.environment(\.serviceManager, serviceManager)
.environment(\.suggestedGoalsDataSource, suggestedGoalsDataSource)
.environment(\.experimentManager, experimentManager)
} else if let errorMessage {
VStack {
Text(errorMessage)
.foregroundColor(.red)
Button("Retry") {
Task {
await initializeApp()
}
}
}
// Apply modifiers here if this view accesses any environments; otherwise, you can omit them
.modelContext(userDataContainer.mainContext)
.environmentObject(accountManager)
.environmentObject(blueprintManager)
.environment(\.taskManager, taskManager)
.environment(\.assessmentManager, assessmentManager)
.environment(\.workoutManager, workoutManager)
.environment(\.goalManager, goalManager)
.environment(\.imageManager, imageManager)
.environment(\.serviceManager, serviceManager)
.environment(\.suggestedGoalsDataSource, suggestedGoalsDataSource)
.environment(\.experimentManager, experimentManager)
} else {
ProgressView("Loading...")
.task {
await initializeApp()
}
// Apply modifiers here if needed
.modelContext(userDataContainer.mainContext)
.environmentObject(accountManager)
.environmentObject(blueprintManager)
.environment(\.taskManager, taskManager)
.environment(\.assessmentManager, assessmentManager)
.environment(\.workoutManager, workoutManager)
.environment(\.goalManager, goalManager)
.environment(\.imageManager, imageManager)
.environment(\.serviceManager, serviceManager)
.environment(\.suggestedGoalsDataSource, suggestedGoalsDataSource)
.environment(\.experimentManager, experimentManager)
}
}
}
private func handleDeepLink(_ url: URL) {
// Check if this is our auth callback
if url.scheme == "improvemyself", url.host == "auth-callback" {
Task {
do {
try await SupabaseConfig.client.auth.session(from: url)
} catch {
print("Error handling auth callback: \(error)")
errorMessage =
"Authentication failed: \(error.localizedDescription)"
}
}
}
}
private func initializeApp() async {
do {
// Check for existing Supabase session
await accountManager.checkSession()
// Initialize user data
let userData = try await accountManager.getOrCreateUserData()
// Identify user in Mixpanel (no tracking here)
MixpanelManager.shared.identify(userId: userData.uid)
// Set minimal user properties for segmentation
let userProperties: [String: Any] = [
"is_temp_user": userData.isTempUID,
"has_blueprints": !userData.blueprints.isEmpty,
]
MixpanelManager.shared.setUserProperties(userProperties)
isInitialized = true
// No app initialization tracking - handled by AppDelegate DAU
} catch {
errorMessage =
"Failed to initialize app: \(error.localizedDescription)"
// Track critical errors only
MixpanelManager.shared.trackEvent(
"Critical Error",
properties: [
"error": error.localizedDescription,
"location": "app_initialization",
]
)
}
}
}
struct RootView: View {
@Binding var hasCompletedOnboarding: Bool
@EnvironmentObject var accountManager: AccountManager
@EnvironmentObject var blueprintManager: BlueprintManager
@Environment(\.taskManager) var taskManager
@Environment(\.assessmentManager) var assessmentManager
@Environment(\.workoutManager) var workoutManager
@Environment(\.goalManager) var goalManager
@Environment(\.imageManager) var imageManager
@Environment(\.serviceManager) var serviceManager
@Environment(\.suggestedGoalsDataSource) var suggestedGoalsDataSource
@Environment(\.experimentManager) var experimentManager
@State private var isInitialized = false
@State private var errorMessage: String?
@State private var showingSignIn = false
var body: some View {
if accountManager.isLoading {
ProgressView("Loading...")
} else if hasCompletedOnboarding {
if accountManager.isAuthenticated {
// User has completed onboarding and is authenticated
if isInitialized {
MainViewWrapper(variant: experimentManager.mainViewVariant)
.environmentObject(accountManager)
} else if let errorMessage {
VStack {
Text(errorMessage)
.foregroundColor(.red)
Button("Retry") {
self.errorMessage = nil
}
}
} else {
ProgressView("Loading user data...")
.onAppear {
Task {
do {
_ =
try await accountManager
.getOrCreateUserData()
isInitialized = true
} catch {
errorMessage =
"Failed to load user data: \(error.localizedDescription)"
}
}
}
}
} else {
// User has completed onboarding but is not authenticated
SignInRequiredView()
.environmentObject(accountManager)
}
} else {
// User has not completed onboarding
OnboardingView(
hasCompletedOnboarding: $hasCompletedOnboarding,
accountManager: accountManager,
assessmentManager: assessmentManager,
blueprintManager: blueprintManager,
goalManager: goalManager,
imageManager: imageManager,
experimentManager: experimentManager
)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... or-swiftui
Установка окружающей среды для Swiftui ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как остановить отслеживание стека в файле журналов окружающей среды? [закрыто]
Anonymous » » в форуме Php - 0 Ответы
- 68 Просмотры
-
Последнее сообщение Anonymous
-