繁体   English   中英

Kotlin + 数据绑定在输入'??' 处没有可行的替代方案

[英]Kotlin + Databinding throw no viable alternative at input '??'

请原谅我糟糕的英语。

我正在使用 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 ****\\数据绑定错误****

我可以在终端上编译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'}
    }
}

我在应用程序目录中的 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,我可以正确运行

我认为问题出在牙套上。 尝试这样做:

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

我认为你设置了错误的表达方式

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

我的意思是,你想通过这个实现什么? 如果 version 为 null 则返回“unknown”,如果不是,则返回版本号? 我想也是因为你没有在你的版本号中使用"" (双引号)

如果你想这样表达,试试这个:

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

预期结果

If version != null -> 测试版本号

If version == null -> 测试unknown

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

kapt 导致的这个问题不适用于中文字符。 所以将它们替换为英文或将您的计算机环境设置为如下:

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM