Extensões Kotlin Android obsoletas. O que fazer? Instruções de migração

Você já deve ter ouvido que o plugin Kotlin Android Extensions para Kotlin agora está obsoleto.

kotlinx.android.synthetic não é mais uma prática recomendada. Removendo em favor de findViewById explícito


Claro, isso foi muito conveniente, especialmente se você tiver um projeto inteiramente em Kotlin. No entanto, o mundo está mudando e agora precisamos buscar alternativas. Neste artigo, daremos uma olhada rápida no que é o plugin Kotlin Android Extension, quais eram os problemas com ele e agora o que nós, desenvolvedores Android, devemos fazer. Em parte, o material deste artigo foi usado . Então vamos.



Resumo das Extensões Kotlin para Android



Kotlin Android Extensions é um plug-in Kotlin que permite restaurar visualizações de Activities, Fragments e Views sem escrever código clichê padrão como findViewById.

O plugin gera um código adicional que permite acessar a visão como XML, como se você estivesse lidando com as propriedades chamadas id que você usou ao definir a estrutura.



Ele também cria um cache de exibição local. No primeiro uso da propriedade, o plug-in executará o findViewById padrão. Posteriormente, a visualização será restaurada do cache, para que o acesso a ele seja mais rápido.



Se tudo isso é tão conveniente, por que o descontinuou?



Problemas de extensões Kotlin Android



  • . , view — , id.
  • Kotlin ()
  • Null Safety. , view — , .
  • . : UI Kit, UI-, . issues . findViewById :(
  • , , — , , . — Kotlin Android Extensions .




  • KotterKnife (, ).
  • FindViewById() — , .
  • AndroidAnnotations ( 2015)
  • View Binding Google — !


View Binding Google



Portanto, o vencedor nesta lista é o ViewBinding do Google (não deve ser confundido com DataBinding). Vamos dar uma olhada rápida no que é.



View Binding é uma ferramenta que torna mais fácil escrever código para interagir com uma visão. Quando você ativa a View Binding em um módulo específico, ela gera classes de binding para cada arquivo de layout no módulo. O objeto da classe de vinculação gerada contém links para todas as visualizações do arquivo de marcação para o qual android: id é especificado.



As principais vantagens da vinculação de visualização são segurança nula e segurança de tipo.



Introdução ao View Binding



Começar com ViewBinding é bastante fácil. Você precisa adicionar uma opção para build.gradle:



android {
    ...
    buildFeatures {
        viewBinding true
    }
}


Depois disso, você já pode usar. Cada classe de ligação gerada contém um link para a visualização raiz da marcação (raiz) e links para todas as visualizações que possuem id. O nome da classe gerada é formado como "nome do arquivo de marcação", traduzido para caixa de camelo + "Ligação". Por exemplo, para o arquivo de marcação result_profile.xml:



<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>


Uma classe ResultProfileBinding será gerada contendo 2 campos: nome de TextView e botão de botão.



Uso na atividade



Por exemplo, você tem este layout:



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>


O resultado da ViewBinding:



public final class ActivityMainBinding implements ViewBinding {
  @NonNull
  private final ConstraintLayout rootView;

  @NonNull
  public final TextView textView;


Você pode usar viewBinding assim:



private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}


E agora, depois de obter os links para a vista:



binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }


Se você estiver usando ViewBinding em um fragmento e manter o link para a vinculação no fragmento (e não apenas no método onCreateView ()), não se esqueça de limpar os links no método onDestroyView ().



Exemplo:



private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}


Isso deve ser feito por causa do fragmento e do ciclo de vida da visualização:



imagem



em geral, mudar para ViewBinding não é difícil o suficiente, embora seja uma pena que as extensões Kotlin para Android estejam obsoletas. Não se esqueça de se juntar a nós no Telegram e na plataforma AndroidSchool.ru , materiais úteis para desenvolvedores Android e tutoriais modernos são publicados.



Links Úteis:






All Articles