Функции, сгенерированные Kotlin Android Extensions, никогда не используются

Я заметил, что синтетические свойства Kotlin Android Extensions в некоторых случаях работают несколько странно. Использование их в моих действиях пока не доставило никаких проблем, но в держателях представления он просто продолжает вызывать findViewById() вместо _$_findCachedViewById() под капотом. Обратите внимание, что я использую новейшую версию Android Studio с новейшими плагинами (и новейшей версией Kotlin).

Итак, имея такой кусок кода:

class Holder(override val containerView: View) :
    RecyclerView.ViewHolder(containerView), LayoutContainer {
fun bind() {
    containerView.my_text_view.text = "Hello Stackoverflow!"
    itemView.my_another_view.text = "Foo"
    }
}

Результаты для меня в следующем коде на Java:

TextView var10000 = (TextView)this.getContainerView().findViewById(id.my_text_view);
...
var10000 = (TextView)var1.findViewById(id.my_another_view);
...

Насколько я понимаю, это не имеет ничего общего с кэшированием представлений, так что это проблема. Самое интересное, что методы _$_findCachedViewById() и _$_clearFindViewByIdCache() делают генерацию в коде, но не используются.

Следующая проблема сохраняется даже в проектах, загруженных из Интернета.

Я ошибаюсь, думая, что это какой-то баг? Действительно ли сгенерированный код Java работает так, как задумано?


person Isao Nokarikashi    schedule 02.03.2018    source источник


Ответы (1)


Документация View Caching гласит, что кэширование выполняется только на Activity , Fragment, View или LayoutContainer:

По умолчанию Android Extensions добавляет функцию скрытого кеша и поле хранения в каждый контейнер (Activity, Fragment, View или реализацию LayoutContainer), написанный на Kotlin.

Итак, вам нужно реализовать kotlinx.android.extensions.LayoutContainer с вашим держателем представления. Это все еще экспериментальная функция, поэтому ее необходимо включить:

androidExtensions {
    experimental = true
}

Затем вам нужно напрямую вызвать синтетические свойства экземпляра. Каждый вызов их как свойства View приводит к некэшированным вызовам.

Поэтому вместо использования ontainerView.my_text_view или itemView.my_another_view вы должны использовать my_text_view или my_another_view напрямую.

Таким образом, использование любого из kotlinx.android.synthetic.main.activity_main.view.* приводит к некэшированным вызовам findViewById().

person tynn    schedule 03.03.2018
comment
В моем коде видно, что я уже реализовал LayoutContainer, так что да, экспериментальные функции тоже включены. - person Isao Nokarikashi; 03.03.2018
comment
Я добавил к нему дополнительную информацию. Вы должны использовать свойства не в представлениях, а в самом контейнере. - person tynn; 03.03.2018