我有一个声明了接口的Activity,并且有一个ViewModel
类,该类已覆盖接口,并希望从Activity
调用接口的方法以在ViewModel
类中进行更改,但无法调用Activity
中的方法,说明ViewModel类没有伴随对象,因此必须在此处初始化。如何解决此问题?
var selection: setSelectionSubRow? = null
selection=RowSubTShirtViewModel
selection!!.setNameSelection(false)
上述代码位于名称为TShirtActivity
的Activity
中。
以下代码来自RowViewModel
类
class RowSubTShirtViewModel(private val subTShirtAdapter: SubTShirtAdapter, val context: TShirtActivity,
val tShirtBean: CommonItemBean, private val parentPosition: Int, private val position: Int) : BaseObservable() ,TShirtActivity.setSelectionSubRow{
fun getImageDrawable(): Drawable {
return if (tShirtBean.isSelected)
ContextCompat.getDrawable(context, R.drawable.green_border_circle)!!
else
ContextCompat.getDrawable(context, R.drawable.border_circle)!!
}
override fun setNameSelection(selection: Boolean) {
if (parentPosition == 6) {
if (position == 1) {
tShirtBean.isSelected = false
}
}
}
4条答案
按热度按时间0wi1tuuw1#
selection=RowSubTShirtViewModel
这一行引用视图模型,就好像它是一个命名对象一样,这意味着您应该编写而不是class object:然而,由于事实并非如此,Kotlin告诉你,你不能这样引用它,而必须初始化它,构造函数有很多参数,我猜不出它们是什么,但本质上你必须传入它们:
rjee0c152#
在Kotlin中有一个伴随对象(并且在该伴随对象中有成员)等价于在Java中有静态成员(静态方法或字段),并且众所周知,Java中的静态成员可以在不初始化类或不引用该类的对象的情况下被访问。
我们可以调用
s()
方法而不初始化类A
,如下所示:A.s();
,它会打印“static”,但是为了能够调用d()
方法,我们需要一个A
类的 object,我们可以通过在其他地方初始化它来获得,如下所示:A a = A();
,然后执行a.d();
,或者像这样一起执行:A().d();
,这两个都将打印“dynamic”。即使Kotlin没有
static
关键字,它也必须具有相同的功能,因为任何Java代码都可以被翻译成Kotlin代码。现在,当我们想把这个思路转移到Kotlin中时,我们会说类似于“为了使用伴随对象中的成员(基本上是静态成员),必须初始化类名(即创建一个对象)"。因此,当Kotlin抱怨说Classifier
Something
没有伴随对象,因此必须在这里初始化时,它基本上是在告诉您该类没有任何静态成员(因为它没有伴随对象),因此如果要使用它,请将它与括号一起使用(初始化它以创建它的对象),或者在其中声明一个伴随对象(使用companion object
关键字)。我希望这能澄清一些事情。可悲的是,像这样没有信息的消息证明您需要事先了解Java才能学习Kotlin,这一事实困扰着它,并将阻碍它作为一种语言独立存在的能力。
kpbpu0083#
在我例子中,我在
ApplicationModule
中为dagger2
得到这个错误。我只是重命名参数!
uubf1zoe4#
对于那些没有找到正确答案的人来说,问题是因为内联函数语法错误。
正确的语法为:
将类分配给变量要求该类是对象。