简体   繁体   English

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

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

Please excuse my poor English.请原谅我糟糕的英语。

I'm using AndroidStudio3.1.1, I've tried to use data binding my project with kotlin , but I get an error when I'm trying to run the project.我正在使用 AndroidStudio3.1.1,我尝试使用数据绑定我的项目kotlin ,但是当我尝试运行该项目时出现错误。 The error message that I'm getting is like below:我收到的错误消息如下所示:

e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors. e: [kapt] 发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。 ****/ data binding error ****msg:Syntax error: no viable alternative at input '??' ****/ 数据绑定错误 ****msg: 语法错误: 输入 '??' 没有可行的替代方案file:/Users/eraise/Code/Demo/app/src/main/res/layout/layout_main.xml loc:20:28 - 20:64 ****\\ data binding error ****文件:/Users/eraise/Code/Demo/app/src/main/res/layout/layout_main.xml loc:20:28 - 20:64 ****\\数据绑定错误****

I can compile apk on Terminal due command: ./gradlew assembleDebug, that works fine.我可以在终端上编译apk应有的命令: ./gradlew assembleDebug,效果很好。

My top-level build.gradle has this configuration:我的顶级 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'}
    }
}

My build.gradle in app dir (only relevant parts):我在应用程序目录中的 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"
}

My layout_main.xml:我的 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>

Error on the line: android:text='@{"测试" + version??"unknow", default=版本号}'错误就行: android:text='@{"测试" + version??"unknow", default=版本号}'

LayoutMainBinding snippet: 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);
    }
}

I can run correct if do not use kotlin如果不使用 kotlin,我可以正确运行

I think the problem is with the braces.我认为问题出在牙套上。 Try to do it this way:尝试这样做:

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

I think you set the wrong expression for我认为你设置了错误的表达方式

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

I mean, what are you trying to achieve with this?我的意思是,你想通过这个实现什么? Is it if version is null then return "unknown", and if it's not, return 版本号?如果 version 为 null 则返回“unknown”,如果不是,则返回版本号? I think also because you didn't use "" (double quotes) in your 版本号我想也是因为你没有在你的版本号中使用"" (双引号)

If you want to express it that way, try this one:如果你想这样表达,试试这个:

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

Expected Result预期结果

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

If version == null -> 测试unknown If version == null -> 测试unknown

I tried and it works!我试过了,它有效! But if the expected result is not what you want, let me know and we can work around it.但是,如果预期的结果不是您想要的,请告诉我,我们可以解决它。

This problem cause by kapt not works well with Chinese character. kapt 导致的这个问题不适用于中文字符。 So replace them with English or set your computer env as below:所以将它们替换为英文或将您的计算机环境设置为如下:

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

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

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