请原谅我糟糕的英语。
我正在使用 AndroidStudio3.1.1,我尝试使用数据绑定我的项目kotlin
,但是当我尝试运行项目时出现错误。我收到的错误消息如下:
e: [kapt] 发生异常:android.databinding.tool.util.LoggedErrorException: 发现数据绑定错误。****/数据绑定错误****味精:语法错误:输入'??'没有可行的替代方案 文件:/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,我可以正确运行