Kotlin + Databinding在输入中没有可行的选择' ??

时间:2018-04-18 08:46:48

标签: android kotlin android-databinding kapt

请原谅我可怜的英语。

我使用的是AndroidStudio3.1.1,我尝试使用kotlin将数据绑定到我的项目,但是当我尝试运行该项目时出现错误。我收到的错误消息如下所示:

  

e:[kapt]发生异常:   android.databinding.tool.util.LoggedErrorException:找到数据绑定   错误。   **** /数据绑定错误**** msg:语法错误:在输入时没有可行的选择' ??'   文件:/Users/eraise/Code/Demo/app/src/main/res/layout/layout_main.xml   loc:20:28 - 20:64 **** \ data binding error ****

我可以在终端到期命令上编译apk./gradlew assembleDebug,工作正常。

我的顶级build.gradle具有以下配置:

buildscript {
ext.kotlin_version = '1.2.31'
repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.1.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://www.jitpack.io'}
    }
}

我在app dir中的build.gradle(只有相关部分):

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android{
    compileSdkVersion 27
    buildToolsVersion 27.1.0
    dataBinding {
        enabled = true
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    kapt "com.android.databinding:compiler:3.1.1"
}

我的layout_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>
        <variable
            name="version"
            type="String"/>
    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">

        <TextView
            android:id="@+id/tv_version_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text='@{"测试" + version??"unknow", default=版本号}'
            />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#EEE"                    
            app:layoutManager="android.support.v7.widget.LinearLayoutManager"
            />

    </LinearLayout>
</layout>

该行出错:android:text='@{"测试" + version??"unknow", default=版本号}'

LayoutMainBinding片段:

@Override
protected void executeBindings() {
    long dirtyFlags = 0;
    synchronized(this) {
        dirtyFlags = mDirtyFlags;
        mDirtyFlags = 0;
    }
    java.lang.String version = mVersion;
    java.lang.String javaLangStringVersion = null;
    java.lang.String javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion = null;
    boolean javaLangStringVersionJavaLangObjectNull = false;

    if ((dirtyFlags & 0x3L) != 0) {


            // Here's ?????? is 测试 if correct result.
            // read ("??????") + (version)
            javaLangStringVersion = ("??????") + (version);


            // read ("??????") + (version) == null
            javaLangStringVersionJavaLangObjectNull = (javaLangStringVersion) == (null);
        if((dirtyFlags & 0x3L) != 0) {
            if(javaLangStringVersionJavaLangObjectNull) {
                    dirtyFlags |= 0x8L;
            }
            else {
                    dirtyFlags |= 0x4L;
            }
        }
    }
    // batch finished

    if ((dirtyFlags & 0x3L) != 0) {

            // read ("??????") + (version) == null ? "unknow" : ("??????") + (version)
            javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion = ((javaLangStringVersionJavaLangObjectNull) ? ("unknow") : (javaLangStringVersion));
    }
    // batch finished
    if ((dirtyFlags & 0x3L) != 0) {
        // api target 1

        android.databinding.adapters.TextViewBindingAdapter.setText(this.tvVersionName, javaLangStringVersionJavaLangObjectNullJavaLangStringUnknowJavaLangStringVersion);
    }
}

如果不使用kotlin,我可以正确运行

3 个答案:

答案 0 :(得分:2)

我认为问题出在括号上。尝试这样做:

@{"test" + (user.name??"unknow", default=versionnumber)}'

答案 1 :(得分:1)

我认为你为

设置了错误的表达方式

android:text='@{"测试" + version??"unknow", default=版本号}'

我的意思是,你想用这个来实现什么?如果版本为null然后返回“unknown”,如果不是,返回版本号?我想也是因为你没有在你的版本号

中使用""(双引号)

如果你想以这种方式表达,试试这个:

android:text='@{"测试" + (version != null ? "版本号" : "unknown")}'

预期结果

如果version != null - &gt;测试版本号

如果version == null - &gt;测试未知

我尝试过它的确有效!但如果预期的结果不是你想要的,请告诉我,我们可以解决它。

答案 2 :(得分:0)

由kapt引起的此问题不适用于汉字。 因此,请用英语替换它们或将您的计算机环境设置如下:

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8