我有一个 Activity,其中声明了一个接口,我有一个
ViewModel
类,它具有重写的接口,并希望从 Activity
调用接口的方法以在 ViewModel
类中进行更改,但无法调用 Activity
中的方法
说 ViewModel 类没有伴随对象,因此必须在这里初始化。如何解决这个问题?
var selection: setSelectionSubRow? = null
selection=RowSubTShirtViewModel
selection!!.setNameSelection(false)
以上代码在
Activity
中,其名称为TShirtActivity
.
以下代码来自
RowViewModel
class
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
}
}
}
这一行
selection=RowSubTShirtViewModel
引用视图模型,就好像它是一个命名对象,这意味着你会写而不是类对象:
object RowSubTShirtViewModel {
//...
}
但是,由于情况并非如此,kotlin 告诉您不能那样引用它并且必须对其进行初始化。构造函数有很多参数让我猜测它们是什么,但基本上你必须将它们传递进来:
selection=RowSubTShirtViewModel(/*parameters here*/)
在 Kotlin 中拥有伴生对象(并在伴生对象中拥有成员in)等同于在 Java 中拥有静态成员(静态方法或字段),众所周知,Java 中的静态成员无需初始化类即可访问或引用该类的对象。例如,给定:
// this is Java
class A {
static void s() {System.out.println("static");}
void d() {System.out.println("dynamic");}
}
我们可以在不初始化类
s()
的情况下调用A
方法,像这样:A.s();
,它会打印“static”,但是为了能够调用d()
方法,我们需要一个 A
类的对象,我们可以通过像这样在其他地方初始化它来获得它:
A a = A();
,然后做a.d();
或者像这样一起做它们:A().d();
,两者都会打印“动态” .
即使 Kotlin 没有
static
关键字,它也必须具有相同的功能,因为任何 Java 代码都可以翻译成 Kotlin 代码。现在,当我们想将这种思路转移到 Kotlin 中时,我们会说“为了使用伴随对象中的成员(基本上是静态成员),您必须初始化类名(即创建一个对象)”。
所以当 Kotlin 抱怨说 Classifier
Something
没有伴随对象,因此必须在这里初始化,它基本上是在告诉你那个类没有任何静态成员(因为它没有伴随对象), 所以如果你想使用它,要么用括号使用它(初始化它以创建它的对象),要么在其中声明一个伴随对象(使用 companion object
关键字)。
我希望这能解决问题。可悲的是,像这样没有信息的消息证明你需要事先了解 Java 才能学习 Kotlin,这个事实困扰着它并将阻碍它作为一种语言独立存在的能力。
在我的例子中,我在
ApplicationModule
中为 dagger2
得到了这个错误。
@Provides
@Singleton
internal fun providesxx(xx: xxx): xx {
return xx
}
我只是重命名参数!
对于那些没有找到正确答案的人,问题是因为内联函数语法错误。
正确的语法是:
val selection: RowSubTShirtViewModel by viewModels()
将类赋值给变量需要类是一个对象。