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


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.