You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM iOS端启动报错:KoinApplication has not been started

KMM iOS端Koin初始化后仍提示未启动的解决方案

问题核心分析

崩溃日志kotlin.IllegalStateException: KoinApplication has not been started的本质原因是:iOS端直接实例化了依赖Koin注入的CharacterListStateMachine,导致类内部的by inject()无法获取到Koin上下文,同时需要确认Koin初始化时机是否早于所有依赖注入代码的执行。

具体解决步骤

1. 确保Koin初始化时机优先

检查iOS端@main入口的初始化顺序,必须在创建任何依赖Koin的实例(如ViewModel、StateMachine)之前完成Koin启动:

@main
struct RickAndMortyApp: App {
    init() {
        // 先执行Koin初始化,再加载UI
        DIHelper().initKoin()
    }
    
    var body: some Scene {
        WindowGroup {
            CharacterListView()
        }
    }
}

2. 替换直接实例化,改用Koin获取StateMachine

iOS端CharacterListVM中不能手动new CharacterListStateMachine(),必须通过Koin获取实例,确保StateMachine内部的by inject()能访问到Koin上下文:

// 修改前
class CharacterListVM: ObservableObject {
    private let stateMachine: CharacterListStateMachine
    
    init() {
        self.stateMachine = CharacterListStateMachine() // 直接实例化导致注入失败
    }
}

// 修改后
class CharacterListVM: ObservableObject {
    private let stateMachine: CharacterListStateMachine
    
    init() {
        self.stateMachine = Koin.shared.get() // 通过Koin获取实例
    }
}

3. 验证Koin模块的iOS平台配置

检查DIHelper中的initKoin方法,确保为iOS平台正确配置了所有依赖(如协程Dispatcher、SQLDelight数据库实例等),避免模块加载不完整导致Koin启动异常:

class DIHelper {
    fun initKoin() {
        startKoin {
            modules(
                coreModule,
                dataModule,
                domainModule,
                stateModule
            )
            // iOS平台专属配置
            if (Platform.isIOS()) {
                single { Dispatchers.Default }
                // 补充SQLDelight iOS数据库实例等依赖
            }
        }
    }
}

4. 调整StateMachine中协程调用时机(可选)

如果CharacterListStateMachine的init块中直接启动协程调用用例,可考虑将调用逻辑延迟到单独的start()方法,确保实例注入完成后再执行:

class CharacterListStateMachine {
    private val getAllCharactersUseCase by inject<GetAllCharacters>()
    
    fun start() {
        CoroutineScope(Dispatchers.Default).launch {
            getAllCharactersUseCase.invoke()
        }
    }
}

然后在CharacterListVM中调用stateMachine.start(),而非在init块自动执行。

内容的提问来源于stack exchange,提问作者Subfly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:32:03