如何使用Koin管理用户范围?

9

我正在尝试使用Koin创建用户范围。 当用户登录时,我正在创建该范围:

val scope = getKoin().createScope("USER_SCOPE")

当用户点击注销时,我会销毁该作用域。
    scope?.let {userScope ->
        userScope.close()
        getKoin().deleteScope(userScope.id)
    }

在我的koin模块中,我有一个scoped UserRepository,它只应该在用户会话期间存在。我还有使用此存储库的ViewModel和Use Cases,并且我尝试在其中注入scoped repo。
val appModule = module {
    scoped<UserRepository> { UserDataRepository() }
    viewModel { UserViewModel(getScope("USER_SCOPE").get()) }
    factory { MyUseCase(getScope("USER_SCOPE").get()) }
}

第一次登录时,一切正常。我的用户仓库已注入到视图模型和用例中。但是在注销后(删除作用域)再次登录后,UserRepository实例仍然完全相同。

我在使用作用域时漏掉了什么吗?


你确定 scope 不是空的并且 let 块被调用了吗? - tynn
是的,scope变量不为空,并且它正在进入let块。 - Mathieu H.
1个回答

10

从koin 2.0.0-rc-2迁移到koin 2.0.0-GA解决了我的问题。

迁移后,不可能在scope之外声明一个scoped实例。因此,我按照如下方式修改了我的appmodule

   val appModule = module {
        scope(named("USER_SCOPE")) {
            scoped<UserRepository> { UserDataRepository() }
        }
        viewModel { UserViewModel(getScope("USER_SCOPE").get()) }
        factory { MyUseCase(getScope("USER_SCOPE").get()) }
    }

范围声明也有一些不同:

val scope = getKoin().createScope("USER_SCOPE", named("USER_SCOPE"))

这样,我就可以在注销/登录后重新创建UserRepository


1
你还需要在注销时删除范围吗?(我也在尝试同样的事情:P) - Thiago Moura
你有更完整的示例吗?我正在尝试类似的东西。 - jteichert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接