Android依赖注入框架

dagger2/Hilt是我们常用的依赖注入框架,由谷歌公司维护,性能强大,但是也有很多缺点,比如学习成本高,上手慢,代码量大,编译慢等等。Koin就能解决这些问题。

Koin是一款轻量级的依赖注入框架,虽然它性能不及dagger2/Hilt,但是它易上手、易调试、代码少,并且对kotlin和jetpack都有很好的支持。下面就让我们来看看Koin的简单使用。


Koin在Android中的简单使用(kotlin)

(1)添加依赖

dependencies {

    implementation "io.insert-koin:koin-android:$koin_version"

}

(2)创建待注入组件类

创建提供数据的仓库

interface TestRepository {
    fun provideData():String
}

class TestRepositoryImpl():TestRepository{

    override fun provideData(): String="testRepository"

}

创建控制器类来操作仓库的数据

class MyTestPresenter(val repo: TestRepository){
    fun getData()="${repo.provideData()} form $this"
}

(3)创建Koin module(依赖提供方)

使用module来声明待注入的组件

val appModule= module {

    //single表明TestRepository是单例的
    single<TestRepository> { TestRepositoryImpl() }

    /**
     * factory工厂模式,在我们需要时创建一个新的实例
     * get()会自动搜索已经声明的仓库,这里就是TestRepository
     */
    factory { MyTestPresenter(get()) }

}

(4)启动Koin

需要在Application中启动Koin

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        //开启Koin
        startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}

(5)注入依赖

在程序中需要使用的地方注入依赖,比如Activity, fragment, Service…

class MainActivity : AppCompatActivity() {
	//使用by inject()注入依赖
    val myPresenter:MyTestPresenter by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //..
        
    }
}

Koin配合ViewModel使用

和前面直接使用的流程差不多

(1)添加依赖

dependencies {
    implementation "io.insert-koin:koin-android:$koin_version"
    implementation "io.insert-koin:koin-android-viewmodel:$koin_version"
}

(2)创建待注入ViewModel组件

这里创建提供数据的仓库与前面一致
只不过是使用ViewModel来处理数据

class MainViewModel(val repo:TestRepository):ViewModel(){
    
    fun getData()="${repo.provideData()} form $this"
    
}

(3)创建Koin module

val appModule= module {

    single<TestRepository> { TestRepositoryImpl() }

    viewModel { MainViewModel(get()) } }

}

(4)启动Koin

启动方式不变

(5)注入依赖

val mainViewModel: MainViewModel by viewModel()

需要了解更多内容,请点击访问官网

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐