Котлін-андроїд: невирішене посилання на посилання на дані


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();
    }
}

Він компілює і працює чудово.
Я спробував переписати його в Котліні і придумав таке:

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

Як я можу використовувати андроїд-бібліотеку, що зв'язує дані разом з Котліном?

Мій найвищий рівень 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додаток (лише відповідні частини):

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 програми в останній версії.
— Гесам

приватне пов'язування латейн-вар: 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
    }
}

App build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}

1
@Irampazzo, 2.2.0-alphaXдоступний, і FYI, версія прив'язки даних є такою ж, як і для самого Android-gradle-плагіна. тож ви можете зовнішньо використовувати цю версію та використовувати її як версію компілятора.
— Avinash R

1
Я можу підтвердити, що ця відповідь вирішила мою проблему з прив'язкою даних та котліном
— Рабі Джради

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 4.4, інструменти 3.1.0)
— Серхіо

Додавання kapt 'com.android.databinding: компілятор: 3.0.1' працює для мене
— Duran Jayson

Це працювало для мене, додавши лише "Apply plugin: 'kotlin-kapt". Дякую.
— Субхан Алі

щойно додав цей рядок працює для мене (застосувати плагін: 'kotlin-kapt') Android Studio 3.2.1 - плагін Kotlin 1.3.0
— Mohamed ElSawaf

14

Оновлення 2: Це дійсно стара відповідь, замість цього зверніться до відповіді lrampazzo.

Працює з 1.0-rc4, поставлений

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

у свої залежності

Дякую Ghedeon, за посилання в коментарях

Оновлення : Ось справді простий приклад світового прикладного проекту


Я все одно отримую ту саму помилку, чи я тут щось неправильно роблю? 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 BTW Я на студії v1.5 Попередній перегляд 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


dataBinding.enabled = trueбуло те, що я забував
— Сезар Кастро

7

Щоб вирішити проблему, потрібно поставити

apply plugin: 'kotlin-kapt'

вгорі build.gradle (Модуль: додаток), а потім поставити цю лінію в залежності

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'
    }

2
ви повинні використовувати одну і ту ж версію як для компілятора, так і для плагіну інструментів для збирання андроїд gradle. Інакше це може спричинити непередбачувані проблеми побудови.
— Avinash R

Мені довелося додати плагін застосувати: 'kotlin-kapt'
— Андрій Ковальчук,


4

Прив’язка даних конфігурації в kotlin

build.gradle (додаток папки)

apply plugin: 'kotlin-kapt'

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

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

Насолоджуйтесь Котлін ...


застосувати плагін: 'kotlin-kapt' дійсно важливий у Котліні.
— Рахул Растогі

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"

Важливо Не просто копіюйте та вставляйте конфігурацію. Дивіться цю відповідь щодо налаштування версії Котліна.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

Мій проект все ще знаходиться у версії gradle 3.0.1, тому для мене це не спрацювало.
— naqi

Ви можете оновити Android Studio і gradle, щоб досягти більшої стабільності.
— Хемрайдж

3

У моєму випадку помилка полягала в тому, що Unresolved reference: RegisterationUserBindingя просто використав таке ім’я макета, fragment_registeration_userяк це, FragmentRegisterationUserBindingі зробив це в макеті Databinding, і помилка пішла.


Ти крутий! Я витратив багато часу, щоб застосувати кілька пропозицій, щоб вирішити проблему, але безпорадний, поки не знайшов цю відповідь. Зміна прив'язки відповідно до назви макета фрагмента вирішує проблему. Дуже дякую.
— Аджай

радий, що це допомогло тобі
— EL TEGANI MOHAMED HAMMAD GABIR

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 } }


0

Додайте прив'язку даних в Android Project, використовуючи коли використовується мова kotlin.

Нижче кроки

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

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

- Друге ввімкнення даних увімкнено істинно

**dataBinding {
        enabled = true
    }**

Все це додано в app.build.gradle після натискання "SYNC NOW"

Давайте, наприклад, у вас є активність редагування профілю, то як визначити змінну прив'язки в kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Тут отримання прив'язки - це метод обробляти тип об'єкта зв'язування

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }

DataBinding Librabry kapt 'com.android.databinding: компілятор: 2.3.1'
— Shripal Shah

0

У моєму випадку додаю

kapt {
    generateStubs = true
}

Вирішили проблему для мене. Я вперше проігнорував це, подумав, що це не має значення для проблеми:

Невирішене посилання на посилання на дані

Але зараз прив'язка даних працює просто чудово.


0

Я хочу поділитися власним досвідом. Для використання прив'язки даних з Kotlin в студії android достатньо додати

dataBinding {
    enabled = true
}

Після цього "синхронізуйте його" і, що дуже важливо, "зробити Project". Після цього всі ваші об’єкти будуть активними для використання.


0

Перш ніж спробувати використовувати FragmentDetailsBinding, ви повинні переконатися, що ви перетворили відповідний макет (fragment_details.xml) у макет прив'язки даних, загорнувши весь макет у батьківський тег "" та перемістіть усі xmlns у тег макета, а потім складіть проект і ось це


-1

Просто вийдіть із усіх залежностей даних, і використовуйте це замість цього

android {
    dataBinding {
        enabled = true
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.