导入包

1
implementation ("io.insert-koin:koin-androidx-compose:3.4.5")

在app中安装koin

1
2
3
4
5
6
7
8
9
10
11
12
class RainDropApp:Application(){

override fun onCreate() {
super.onCreate()

startKoin {
androidLogger(Level.INFO)
androidContext(this@RainDropApp)
modules(Appmodule)
}
}
}

然后看你安装的module

1
2
3
4
5
6
7
8
9
10
val Appmodule = module {
single { MediaReaderImpl(get()) as MediaReader }
single { AudioPlayerImpl(get()) as AudioPlayer }
viewModel {
LocalMusicViewModel(get())
}
viewModel {
HomeViewModel(get())
}
}

注入基本对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 简单的一个日志输出类
class Logger {

fun print(msg: String) {
Log.d(TAG, "Logger print: $msg")
}
}

val module = module {
// 设置它的注入类型为单例
single { Logger() }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
// 通过 koin 的 koinInject()方法进行对象注入
val logger: Logger = koinInject()

Text(
text = "Hello $name!",
modifier = modifier.clickable { logger.print("greeting") }
)
}

# 日志输出
Logger print: greeting

从上面的代码中可以看到,module{}在普通工程和 compose 工程中用法是一致的,只是在获取依赖对象时,compose 中需要使用 koinInject() 方法来获取,此方法也是被@Composable修饰,并且通过remember()来完成内部逻辑实现。

更详细的内容请查看原文,因为他确实不难理解。

引用自掘金