0

在过去的一天里,我一直在尝试在 kodein 中实现一个自定义范围,我正要扯掉我的头发。我的应用程序基于 2 个活动,一个用于登录,另一个在用户登录时(我将其称为 MainActivity)。我有几个单例服务从我在 MainActivity 中的许多片段中使用的 Firestore 数据库获取数据,我目前正在使用 Kodein 获取每个服务的单例对象。

我的服务总结:

class TagsService(context: Context): KodeinAware {
    override val kodein by closestKodein(context)

    val tags: MutableLiveData<ArrayList<Tag>> = MutableLiveData(ArrayList())

    // Other stuff fetching data and storing it in tags
}

还有我的 Kodein 应用程序中的服务

bind() from singleton { TagsService(applicationContext) }

在我的片段中,我只需获取我的 tagsService 类

private val tagsService: TagsService by instance()

现在的问题是,当用户退出时,我必须在这种情况下清理所有标签,等待用户登录,创建一个新的查询等等,很多工作。但是,如果这个服务可以以某种方式被“杀死”,然后在用户登录时再次启动(回到 MainActivity,也没有保存它的最后一个状态,只是一个新对象),那么一切都会自动清理,而无需我编写很多代码。

目标:由于 MainActivity 仅在用户登录并经过正确身份验证时才处于“活动状态”,因此我想将生命周期附加到我的 TagsService 对象,每当 MainActivity 死时它也会杀死我的 tagsService ,然后每当 MainActivity “活着”时“重新初始化”再次。

如果很难掌握我想要做什么,我感到非常抱歉,我对 kotlin 和整个编程都很陌生

4

1 回答 1

0

要达到这一点,您可以使用 Kodein-DI 范围(https://docs.kodein.org/kodein-di/7.3/core/using-environment.html#scope)。

您绑定您的服务,如:

bind() from scoped(ActivityScope).singleton { TagsService(applicationContext) }

whereActivityScope是您在 Kodein-DI ( https://docs.kodein.org/kodein-di/7.3/framework/android.html )WeakContextScope.of<Activity>()的 Android 模块中创建的范围、a 或已经捆绑的范围。

因此,您可以通过以下方式注入您的服务:

private val tagsService: TagsService by on(activityReference).instance()
于 2021-02-15T05:24:34.613 回答