Kotlin-android: неразрешенная привязка эталонных данных

143

У меня есть следующий класс фрагмента, написанный на Java с использованием новой библиотеки привязки данных

import com.example.app.databinding.FragmentDataBdinding;

public class DataFragment extends Fragment {

    @Nullable
    private FragmentDataBinding mBinding;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false);
        return mBinding.getRoot();
    }
}

Он компилируется и работает нормально.
Я попытался переписать это в Kotlin и придумал следующее:

import com.example.app.databinding.FragmentDataBdinding

class ProfileFragment : Fragment() {

    private var mBinding: FragmentDataBinding? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false)
        return mBinding!!.getRoot()
    }
}

Но теперь шаг :app:compileDebugKotlinвыводит следующее:

Ошибка: (16, 38) Неразрешенная ссылка: привязка данных
Ошибка: (37, 27) Неразрешенная ссылка: FragmentDataBinding

Как я могу использовать библиотеку android-databinding с Kotlin?

Мой высший уровень build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.android.databinding:dataBinder:1.0-rc4'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Мой build.gradleв приложении DIR (только соответствующие части):

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'
apply plugin: 'kotlin-android'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

buildscript {
    ext.kotlin_version = '0.14.451'
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}
repositories {
    mavenCentral()
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
}

Я использую Android Studio 1.4, инструменты сборки версии 23.0.1, Android SDK 23, инструменты SDK 24.4.0

Михаил
источник
3
Пожалуйста, не стесняйтесь голосовать за соответствующий вопрос: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon
1
Вы должны иметь только apply plugin: 'kotlin-kapt'в файле приложения Gradle в последней версии.
Хесам
частное связывание с lateinit var: FragmentDataBinding - лучший способ инициализации
Dino Sunny

Ответы:

85

Попробуйте использовать эту конфигурацию:

В основном build.gradle :

buildscript {
    ext.kotlin_version = '<kotlin-version>'
    ext.android_plugin_version = '2.2.0-alpha4'
    dependencies {
        classpath "com.android.tools.build:gradle:$android_plugin_version"
    //... rest of the content
    }
}

Приложение build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

dependencies {
    kapt "com.android.databinding:compiler:$android_plugin_version"
}

kapt {
    generateStubs = true
}
lrampazzo
источник
1
@Irampazzo, 2.2.0-alphaXдоступен, и к вашему сведению версия привязки данных такая же, как и у самого android-gradle-plugin. так что вы можете использовать эту версию и использовать ее в качестве версии компилятора.
Авинаш Р
1
Я могу подтвердить, что этот ответ исправил мою проблему с привязкой данных и kotlin
Раби Джради
12
Я должен был apply plugin: 'kotlin-kapt'также добавить . См stackoverflow.com/a/42974558/1916449
arekolek
Я попробовал это. Теперь это дает мне круговую ошибку зависимости. Есть идеи по этому поводу?
leoOrion
Проверьте kotlinlang.org/docs/tutorials/… для официальной документации по этому вопросу.
Брайан
72

Я нашел новое решение, надеюсь, оно поможет вам.

Прежде всего, проверьте, применяется ли плагин:

apply plugin: 'kotlin-kapt'

затем

android {
    ...
    ...
    dataBinding {
        enabled = true
    }
    ...
    ...
}

У вас может быть ошибка в зависимости:

ИСПОЛЬЗОВАНИЕ

kapt 'com.android.databinding:compiler:3.0.1'

вместо того

compile 'com.android.databinding:compiler:3.0.1'

Вы можете посетить здесь для новой версии

Спасибо.

Пратик Бутани
источник
6
У меня все еще есть эта проблема :(
Младен Раконяц
Это работает для меня (Gradle Wrap 4.4, инструменты 3.1.0)
Серхио
Добавление kapt 'com.android.databinding: compiler: 3.0.1' работает для меня
Duran Jayson
Это сработало для меня, добавив только «применить плагин:« kotlin-kapt ». Спасибо.
Субхан Али
только что добавленная строка работает для меня (примените плагин: 'kotlin-kapt') Android Studio 3.2.1 - плагин Kotlin 1.3.0
Mohamed ElSawaf
14

Обновление 2: Это действительно старый ответ, вместо этого обратитесь к ответу Лрампаццо.

Работает с 1.0-rc4, поставил

kapt 'com.android.databinding:compiler:1.0-rc4' 

в ваши зависимости

Спасибо Гедеон, за ссылку в комментариях

Обновление : Вот действительно простой пример проекта "Здравствуй, мир!"

Джейди Соланки
источник
Я все еще получаю ту же ошибку, я делаю что-то здесь не так? gist.github.com/xdgimf/820c433efa8307821788
Мигель Фермин
вот мой файл build.gradle если вам нужен опорный gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki
@Jaydeep Только что попробовал, и это работает. Однако студия Android не выделяет синтаксис и генерирует множество ошибок IDE с сообщением Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. У вас есть такие же ошибки? А какая у тебя версия андроид студии?
Михаил
@Arkadiy Об этом уже сообщалось youtrack.jetbrains.com/issue/KT-8007 Кстати, я на студии v1.5 Preview 2
Jaydeep Solanki
Это больше не последняя версия плагина. Это вызовет ненужную боль.
Avinash R
13

Версия компилятора привязки данных совпадает с версией gradle в вашем файле build.gradle проекта:

// at the top of file 
apply plugin: 'kotlin-kapt'


android {
  dataBinding.enabled = true
}

dependencies {
  kapt "com.android.databinding:compiler:3.0.0-beta1"
}

и версия Gradle

classpath 'com.android.tools.build:gradle:3.0.0-beta1'

Вот пример ссылки для завершения использования библиотеки привязки данных в kotlin.

https://proandroiddev.com/modern-android-development-with-kotlin-september-2017-part-1-f976483f7bd6

Sijansd
источник
dataBinding.enabled = trueбыло то, что я забыл
Сезар Кастро
7

Чтобы решить проблему, нужно поставить

apply plugin: 'kotlin-kapt'

в верхней части build.gradle (Module: app), затем поместите эту строку в зависимости

kapt "com.android.databinding:compiler:[YOUR_ANDROID_PLUGIN_VERSION]"

Вы можете найти версию плагина для Android, перейдя в меню

File > Project Structure > Project

Затем снова синхронизируйте. Если вы видите это предупреждение, игнорируйте его.

Сторонние плагины Gradle могут быть причиной

Соваттана Сиген
источник
6

Попробуйте это. Andrid studio 2.0 (2.1)

В build.gradle

android{
   dataBinding {
        enabled = true
    }
...
}
dependencies {
 kapt 'com.android.databinding:compiler:2.0.0-rc1'
....
}

kapt {
    generateStubs = true
}

В моем проекте: buildToolsVersion = "23.0.3"

в верхнем уровне build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }
Garf1eld
источник
2
вы должны использовать одну и ту же версию как для компилятора, так и для плагина для сборки инструментов Android. В противном случае это может привести к непредсказуемым проблемам при сборке.
Avinash R
Пришлось добавить плагин для применения: 'kotlin-kapt'
Андрей Ковальчук
6

эта работа для меня в androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

показать пример использования

эмад пираеш
источник
4

Конфигурация привязки данных в котлине

build.gradle (папка app)

apply plugin: 'kotlin-kapt'

android {
   ...
   dataBinding {
      enabled = true
   }
}

dependencies {
   // data binding
   kapt "com.android.databinding:compiler:3.1.3"
}

Наслаждайтесь Kotlin ...

Джедсада Тивонгворакул
источник
применить плагин: «Kotlin-Kapt» действительно важно в Kotlin.
Рахул Растоги
3

Важное обновление

Вы можете увидеть в документации Android.

Новый компилятор в версии 3.2 включен по умолчанию.

Так что просто обновите вашу Android Studio до V3.2 или новее . и удалите все ненужные конфигурации.

Так что просто включите привязку данных на уровне приложения build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Он сделает все для вас автоматически.

Вы можете безопасно удалить ниже линии-

  • Удалить databinding.compiler

    kapt 'com.android.databinding:compiler:3.0.1'
  • удалять kapt

    kapt {
        generateStubs = true
    }

Мой полный конфиг

build.gradle (проект)

kotlin_version = '1.2.71'    
classpath 'com.android.tools.build:gradle:3.2.0'

Используйте Gradle последней версии . Используйте последнюю версию kotlin .

build.gradle (приложение)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

compileSdkVersion 28
targetSdkVersion 28

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

Важно ! Не просто скопируйте и вставьте конфигурацию. Смотрите этот ответ для настройки версии Kotlin.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
Khemraj
источник
Мой проект все еще находится на выпуске Gradle 3.0.1, поэтому у меня это не сработало.
Наки
Вы можете обновить Android Studio и Gradle для достижения большей стабильности.
Хемрай
3

В моем случае ошибка состояла в том, что Unresolved reference: RegisterationUserBindingя просто использовал свое имя макета fragment_registeration_userвот так FragmentRegisterationUserBindingи сделал его в макете привязки данных, и ошибка исчезла.

ЭЛЬ ТЕГАНИ МОХАМЕД ХАММАД ГАБИР
источник
Ты замечательный! Я потратил много времени, чтобы применить несколько предложений для решения проблемы, но безрезультатно, пока не нашел этот ответ. Изменение привязки в соответствии с именем макета фрагмента решает проблему. Большое спасибо.
Ajay
рад, что это помогло вам
ЭЛЬ ТЕГАНИ МОХАМЕД ХАММАД ГАБИР
2

Добавить следующее в вас app build.gradle

kapt "com.android.databinding:compiler:$android_plugin_version"
apply plugin: 'kotlin-kapt' // This one at top where plugin belong to

Это сделает свое дело.

$android_plugin_versionэто версия com.android.tools.build:gradleвapplication build.gradle

Кроме того, добавьте это в свой модуль build.gradle

android { /// Existing Code kapt { generateStubs = true } }

RKS
источник
0

Добавить привязку данных в Android Project, используя, когда вы используете язык kotlin.

Ниже шаги

- Сначала вам нужно добавить плагин ниже

**apply plugin: 'kotlin-kapt'**

- Второе связывание данных включено true

**dataBinding {
        enabled = true
    }**

Все это добавлено в app.build.gradle после нажатия «SYNC NOW».

Например, у вас есть редактировать профиль деятельности, а затем определить переменную привязки в kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Здесь get binding - это метод для обработки типа привязываемого объекта.

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }
Шрипал Шах
источник
Связывание данных Librabry kapt 'com.android.databinding: компилятор: 2.3.1'
Шрипал Шах,
0

В моем случае добавление

kapt {
    generateStubs = true
}

Решил проблему для меня. Я проигнорировал это в первый раз, я думал, что это не имеет отношения к проблеме:

Неразрешенная привязка эталонных данных

Но теперь привязка данных работает просто отлично.

Махмуд
источник
0

Я хочу поделиться своим собственным опытом. Для использования привязки данных с Kotlin в Android Studio достаточно добавить

dataBinding {
    enabled = true
}

После этого «синхронизируй это» и, очень важно, «сделай проект». После этого все ваши объекты будут активны для использования.

gloomyad
источник
0

Прежде чем пытаться использовать FragmentDetailsBinding, вам необходимо убедиться, что вы преобразовали соответствующий макет (фрагмент_детали.xml) в макет привязки данных, обернув весь макет в родительский тег тега "" и переместив все xmlns в тег макета, затем построите проект и все.

TarekB
источник
-1

Просто выйдите из всех зависимостей привязки данных и используйте это вместо

android {
    dataBinding {
        enabled = true
    }
}
Карим Алсаифи
источник