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
相关产品推荐
相关产品推荐

