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

Android中无法预览含Koin依赖注入的Composable组件

解决Koin Compose预览中"KoinApplication has not been started"错误

问题根源

报错栈指向MyHelper类的inject调用,说明它没有使用预览中KoinApplication创建的局部Koin实例,而是默认调用了全局Koin上下文(GlobalContext),但预览的迷你Koin不会注册到全局上下文,导致找不到已启动的Koin实例。

解决方案

1. 改用Compose专用的注入API

如果MyHelper是在Composable中使用,替换普通的inject()为Koin Compose提供的koinInject()或rememberKoinInject(),它们会自动绑定当前KoinApplication提供的局部Koin实例:

// 在Composable组件中注入MyHelper
@Composable
fun Preferences() {
    val myHelper: MyHelper = koinInject()
    // ... 组件逻辑
}

2. 给普通类传递Koin实例

如果MyHelper是普通类(非Composable),不要让它直接实现KoinComponent依赖全局上下文,改为通过构造函数接收Koin实例:

class MyHelper(private val koin: Koin) {
    private val someDependency by koin.inject<SomeDependency>()
    // ... 类逻辑
}

// 在Composable中获取局部Koin实例并传入
@Composable
fun Preferences() {
    val koin = getKoin()
    val myHelper = remember { MyHelper(koin) }
    // ... 组件逻辑
}

3. 检查依赖模块配置

确保预览的KoinApplication中注册了MyHelper及其依赖的所有模块,没有遗漏必要的依赖声明:

@Preview
@Composable
fun PreferencesPreview() {
    KoinApplication(application = {
        modules(
            databaseModule,
            networkModule,
            helperModule // 确保包含MyHelper的提供模块
        )
    }) {
        Preferences()
    }
}

4. 避免非Composable上下文提前调用注入

检查MyHelper是否在初始化块、静态代码块等非Composable时机调用了inject(),这类代码会在预览的Koin实例启动前执行,导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:10