В чем разница между статическим методом Java и сопутствующим объектом Kotlin?Почему это дает ошибку в привязке данных Андорид? - PullRequest
0 голосов
/ 24 декабря 2018

Привет, ребята, у меня есть один сценарий, где я работаю с привязкой данных Android.Я пытаюсь привязать один небольшой метод util к представлению, как показано ниже

//Java Code
    public class Util {
            public static String capitalize(String text) {
                return text.toUpperCase();
            }
    }

И код макета Xml, как показано ниже

//layout.xml--Android
    <data>
        <import type="com.lkb.baseandroidproject.Util"/>
    </data>

...

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{Util.capitalize(user.name)}"/>

Это просыпается нормально, но когда я конвертирую класс Java в kotlin как

class Util {
    companion object {
        fun capitalize(text:String): String {
            return text.toUpperCase()
        }
    }
}


 <TextView  android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@{Util.Companion.capitalize(user.name)}"/>

Это выдает ошибку

[kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:cannot find method capitalize(java.lang.String) in class com.lkb.baseandroidproject.Util.Companion file:/Users/leo/code/Android/Android_projects/Android_projects/BaseAndroidProject/app/src/main/res/layout/content_main.xml loc:23:32 - 23:68 ****\ data binding error ****

    at android.databinding.tool.processing.Scope.assertNoError(Scope.java:112)
    at android.databinding.annotationprocessor.ProcessDataBinding.doProcess(ProcessDataBinding.java:109)
    at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:73)
    at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:99)

1 Ответ

0 голосов
/ 24 декабря 2018

Байт-код, сгенерированный вашим кодом Kotlin, выглядит следующим образом (Kotlin 1.3):

public final class com/example/testapp/Util$Companion {
  // access flags 0x11
  public final capitalize(Ljava/lang/String;)Ljava/lang/String;

Как вы видите, создается внутренний класс Companion, который на самом деле имеет метод capitalize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...