Установка окружающей среды для SwiftuiIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Установка окружающей среды для Swiftui

Сообщение Anonymous »

Я пытался удалить использование в Синглтоне в своем приложении, и вместо этого использовал значения @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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Установка окружающей среды
    Anonymous » » в форуме IOS
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как сгруппировать объект окружающей среды (массив словарей) в SwiftUI
    Anonymous » » в форуме IOS
    0 Ответы
    76 Просмотры
    Последнее сообщение Anonymous
  • Я не могу узнать температуру окружающей среды на своем телефоне
    Гость » » в форуме Android
    0 Ответы
    48 Просмотры
    Последнее сообщение Гость
  • Как остановить отслеживание стека в файле журналов окружающей среды? [закрыто]
    Anonymous » » в форуме Php
    0 Ответы
    68 Просмотры
    Последнее сообщение Anonymous
  • Подключение PHP к MySQL для установки кода окружающей среды и VS.
    Anonymous » » в форуме Php
    0 Ответы
    57 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»