首页 > 解决方案 > 是否可以在 kotlin 中为多个伴随对象创建一个全局通用函数

问题描述

我在 Kotlin 中开发了一个应用程序,其中包含许多Activities. 大多数导航只是基本的,开始新的活动,而不是向意图传递任何东西。对于几组活动,我可能会传递标志,这在我的项目中也是重复的(例如 5 个设置的活动intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)。因此,如果我能找到一种方法来实现这一点,那么事情就会变得更好一些。

为了使事情变得更容易和更整洁,我为具有Activities以下功能的 对象创建了伴随对象:

class MyActivity: AppCompatActivity() {
   companion object {
        fun startActivity(context: Context) {
            context.startActivity(
                Intent(context, MyActivity::class.java)
            )
        }
    }
...

其他类可以简单地调用MyActivity.startActivity(context).

该功能非常基本,不同活动中的实现之间的唯一区别显然是MyActivity::class.java- 部分。所以我想知道是否可以只声明这个函数一次,并以某种方式在多个伴生对象中使用它来进行不同的活动。

现在,我知道我可以做这样的事情:

我定义了一个具有泛型函数的对象,并将其设置如下:

object MyObject {
    inline fun <reified T: AppCompatActivity>startActivity(context: Context) {
        context.startActivity(
            Intent(context, T::class.java)
        )
    }
}

class MyActivity() : AppCompatActivity() {
    companion object {
        fun start(context: Context) = MyObject.startActivity<MyActivity>(context)
    }
}

但这似乎仍然有点 hacky。我正在寻找的是类似于继承或接口的实现版本,以简单地添加到我的伴随对象中。就像是:

companion object : MyObject<MyActivity>
// Assuming I can somehow put the generic parameter into the object declaration instead of the function or do something similar

或者

companion object {
    import MyObject.startActivity<MyActivity>
}

第一个选项特别有用,因为它会自动设置MyObjectfor的多个功能MyActivity。这样的事情甚至可能吗?

标签: javaandroidkotlin

解决方案


你甚至不需要伴侣,只需要一个扩展功能。

inline fun <reified T: AppCompatActivity> Activity.startActivity() {
    startActivity(Intent(this, T::class.java))
}

如果你需要额外的配置,你可以传递一个 lambda。

inline fun <reified T: AppCompatActivity> Activity.startActivity(intentConfiguration: Intent.() -> Unit) {
    startActivity(Intent(this, T::class.java).apply(intentConfiguration))
}

推荐阅读