android 分类器没有伴随对象,因此必须在此处初始化

unguejic  于 2023-03-16  发布在  Android
关注(0)|答案(4)|浏览(149)

我有一个声明了接口的Activity,并且有一个ViewModel类,该类已覆盖接口,并希望从Activity调用接口的方法以在ViewModel类中进行更改,但无法调用Activity中的方法,说明ViewModel类没有伴随对象,因此必须在此处初始化。如何解决此问题?

var selection: setSelectionSubRow? = null
    selection=RowSubTShirtViewModel
    selection!!.setNameSelection(false)

上述代码位于名称为TShirtActivityActivity中。
以下代码来自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
        }
    }
}
0wi1tuuw

0wi1tuuw1#

selection=RowSubTShirtViewModel这一行引用视图模型,就好像它是一个命名对象一样,这意味着您应该编写而不是class object:

object RowSubTShirtViewModel {
   //...
}

然而,由于事实并非如此,Kotlin告诉你,你不能这样引用它,而必须初始化它,构造函数有很多参数,我猜不出它们是什么,但本质上你必须传入它们:

selection=RowSubTShirtViewModel(/*parameters here*/)
rjee0c15

rjee0c152#

在Kotlin中有一个伴随对象(并且在该伴随对象中有成员)等价于在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类的 object,我们可以通过在其他地方初始化它来获得,如下所示:A a = A();,然后执行a.d();,或者像这样一起执行:A().d();,这两个都将打印“dynamic”。
即使Kotlin没有static关键字,它也必须具有相同的功能,因为任何Java代码都可以被翻译成Kotlin代码。现在,当我们想把这个思路转移到Kotlin中时,我们会说类似于“为了使用伴随对象中的成员(基本上是静态成员),必须初始化类名(即创建一个对象)"。
因此,当Kotlin抱怨说Classifier Something没有伴随对象,因此必须在这里初始化时,它基本上是在告诉您该类没有任何静态成员(因为它没有伴随对象),因此如果要使用它,请将它与括号一起使用(初始化它以创建它的对象),或者在其中声明一个伴随对象(使用companion object关键字)。
我希望这能澄清一些事情。可悲的是,像这样没有信息的消息证明您需要事先了解Java才能学习Kotlin,这一事实困扰着它,并将阻碍它作为一种语言独立存在的能力。

kpbpu008

kpbpu0083#

在我例子中,我在ApplicationModule中为dagger2得到这个错误。

@Provides
@Singleton

 internal fun providesxx(xx: xxx): xx {
        return xx
    }

我只是重命名参数!

uubf1zoe

uubf1zoe4#

对于那些没有找到正确答案的人来说,问题是因为内联函数语法错误。
正确的语法为:

val selection: RowSubTShirtViewModel by viewModels()

将类分配给变量要求该类是对象。

相关问题