Koin入门1-快速上手

Koin是一个无代理、无代码生成、无反射的依赖注入框架。文章介绍了如何在AndroidCompose项目中使用Koin,包括定义实体类、Repository、StateHolder,设置Module,以及在MainActivity中启动和使用Koin。示例展示了如何通过Koin管理组件的状态并进行数据操作。
摘要由CSDN通过智能技术生成

概念

Koin 是一款轻量级的依赖注入框架,它无代理,无代码生成,无反射

大家可以自行查阅官方英文教程:https://insert-koin.io/docs/quickstart/android-compose


Koin 简单的来说可以包含以下四个模块:

名称作用
entity实体类
repository接口,定义针对实体类的操作,可以理解为 service 层
stateholder类,操作 repository,可以理解为 controller 层
module管理所有 repository 以及 stateholder 的文件

安装 koin 依赖:implementation "io.insert-koin:koin-androidx-compose:3.3.0"


快速上手

文件结构如下:

在这里插入图片描述


entity

为便于操作,我们定义仅有一个参数的实体 User 即可

代码清单:User.kt

data class User(
    val name:String
)

repository

同一文件下定义接口以及对应的实现类

代码清单:UserRepository.kt

// 定义了两个方法,分别是获取用户以及添加用户(均为单个!)
interface UserRepository {
    fun getUser(name: String): User?
    fun addUser(user:User)
}

// 实现接口UserRepository
class UserRepositoryImpl : UserRepository {
    private val _users = arrayListOf<User>()
    override fun getUser(name: String): User? {
        return _users.firstOrNull { it.name == name }
    }

    override fun addUser(user: User) {
        _users.add(user)
    }
}

stateholder

代码清单:UserStateHolder.kt

// 定义两个方法,调用UserRepository
class UserStateHolder(private val userRepository: UserRepository) {

    fun sayHello(name: String): String {
        val res = userRepository.getUser(name)
        return res?.let { "hello ${res.name}" }
            ?: "cannot find this user"
    }

    fun insertUser(name: String) = userRepository.addUser(User(name))
}

module

这里实际上还可以使用 viewmodel 实现单例,后面我们会有提到

声明变量 appModule,注册 repository 以及 stateholder

代码清单:KoinApp.kt

val appModule = module {
    // single生成单一对象
    single<UserRepository> { UserRepositoryImpl() }
    // factory每次都会生成新的对象
    factory { UserStateHolder(get()) }
}

主文件

目前我们所有关于 koin 的配置都准备好啦,此时关键的一步就是在 onCreate 中开启 koin
使用 lambda 函数 startKoin,依次填入下方代码的三个方法即可

最后在大家绘制组件 UI 时,形参直接初始化 stateholder 即可使用啦!

代码清单:MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 第一步:开启koin
        // 三个方法为固定格式,androidContext选择当前上下文,modules选择我们刚刚配置好的
        startKoin {
            androidLogger()
            androidContext(this@MainActivity)
            modules(appModule)
        }

        setContent {
            KoinDemoTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    koinTest()
                }
            }
        }
    }
}

// 第二步:使用
// 组件形参直接构造stateholder来调用它!!!
@Composable
private fun koinTest(presenter:UserStateHolder = get()) {
    var title by remember {
        mutableStateOf("现在还没有任何内容")
    }

    Column(
        Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text(text = title)
        Button(onClick = {
            // 插入用户
            presenter.insertUser("tom")
        }) {
            Text(text = "add user")
        }
        Button(onClick = {
            // 获取用户并更新状态
            title = presenter.sayHello("tom")
        }) {
            Text(text = "get user")
        }
    }
}

成品演示

直接点击“get user”

在这里插入图片描述


先点击“add user”再点击“get user”

在这里插入图片描述


END,下一篇文章将会介绍 koin 以及 hilt 之间使用对比

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhillery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值