<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kotlinautas</title>
    <description>The latest articles on Forem by Kotlinautas (@kotlinautas).</description>
    <link>https://forem.com/kotlinautas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4448%2F65c8ed2f-c9f3-40c0-b69e-f4195daf27ed.png</url>
      <title>Forem: Kotlinautas</title>
      <link>https://forem.com/kotlinautas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kotlinautas"/>
    <language>en</language>
    <item>
      <title>Kotlin Playground para aprendizes de Kotlin</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Thu, 24 Feb 2022 01:01:58 +0000</pubDate>
      <link>https://forem.com/kotlinautas/kotlin-playground-para-aprendizes-de-kotlin-2a0l</link>
      <guid>https://forem.com/kotlinautas/kotlin-playground-para-aprendizes-de-kotlin-2a0l</guid>
      <description>&lt;h2&gt;
  
  
  O quê é Kotlin Playground?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://play.kotlinlang.org" rel="noopener noreferrer"&gt;Kotlin Playground&lt;/a&gt; é uma plataforma criada pela &lt;a href="https://www.jetbrains.com/pt-br/" rel="noopener noreferrer"&gt;Jetbrains&lt;/a&gt; para permitir que pessoas que estejam aprendendo Kotlin possam testar conceitos e códigos sem precisar de ter a linguagem instalada na própria máquina.&lt;/p&gt;

&lt;p&gt;Kotlin Playground pode ser utilizado completamente via web, sem precisar instalar nada no computador, o link da plataforma é &lt;a href="https://play.kotlinlang.org" rel="noopener noreferrer"&gt;este&lt;/a&gt;. Inicialmente, a plataforma estará com essa aparência:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8svkj26fgjwak0gkphs9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8svkj26fgjwak0gkphs9.png" alt="Interface do Kotlin Playground"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Para quê Kotlin Playground pode ser utilizado?
&lt;/h2&gt;

&lt;p&gt;Kotlin Playground pode ser usado por pessoas que estão começando a aprender Kotlin, oferecendo uma interface simples, e a possibilidade de programar e testar códigos Kotlin sem nem mesmo ter a linguagem instalada no computador ou um editor de texto ou &lt;em&gt;IDE&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interface do Kotlin Playground
&lt;/h2&gt;

&lt;p&gt;A interface do Kotlin Playground é bem simples, primeiramente, temos uma barra onde temos algumas opções, sendo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Versão do Kotlin
&lt;/h3&gt;

&lt;p&gt;Nessa opção podemos mudar a versão do Kotlin que vamos utilizar no nosso código. Geralmente, &lt;strong&gt;deixe essa opção na versão mais nova disponível.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Plataforma do Kotlin (JVM, JS, Junit, etc.)
&lt;/h3&gt;

&lt;p&gt;Com essa opção, você pode escolher qual plataforma que o seu código será rodado. Caso você esteja começando a aprender Kotlin, &lt;strong&gt;pule essa opção por enquanto.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Argumentos do programa (--algumacoisa)
&lt;/h3&gt;

&lt;p&gt;Utilizando essa opção, você irá poder escolher alguns argumentos para passar ao seu programa. Isso é útil caso o seu código utilize argumentos, como &lt;code&gt;--numero&lt;/code&gt; ou &lt;code&gt;--nome&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copiar Link
&lt;/h3&gt;

&lt;p&gt;Essa opção serve para copiar o link do seu código, e compartilhar esse link para outras pessoas, facilitando o processo de passar esse código que você criou para outra pessoa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compartilhar Código
&lt;/h3&gt;

&lt;p&gt;Essa opção é útil para compartilhar seu código em um &lt;a href="https://www.w3schools.com/tags/tag_iframe.asp" rel="noopener noreferrer"&gt;&lt;em&gt;iframe&lt;/em&gt;&lt;/a&gt;, podendo assim colocar seu código em artigos e blogs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run
&lt;/h3&gt;

&lt;p&gt;E também temos a opção Run podemos rodar o nosso código, onde o resultado irá aparecer abaixo do editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Editor
&lt;/h2&gt;

&lt;p&gt;Na maior parte da tela, temos o editor do Kotlin Playground, que será o local onde iremos escrever o nosso código Kotlin. Mesmo sendo completamente via navegador, o editor tem alguns recursos para facilitar a programação, como um &lt;em&gt;autocomplete&lt;/em&gt; para completar o nosso código enquanto estamos escrevendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Nesse pequeno artigo, te mostrei o quê é o Kotlin Playground, e como usá-lo para programar Kotlin completamente pelo navegador.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda" rel="noopener noreferrer"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Explorando a documentação: Números em Kotlin</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Sun, 30 Jan 2022 23:28:25 +0000</pubDate>
      <link>https://forem.com/kotlinautas/explorando-a-documentacao-numeros-em-kotlin-15go</link>
      <guid>https://forem.com/kotlinautas/explorando-a-documentacao-numeros-em-kotlin-15go</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/" rel="noopener noreferrer"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" alt="capa Kotlinautas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como representar números no Kotlin?
&lt;/h2&gt;

&lt;p&gt;Números em Kotlin podem ser representados de duas maneiras, essas maneiras são os tipos de números que o Kotlin suporta, sendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inteiros (&lt;em&gt;Byte&lt;/em&gt;, &lt;em&gt;Short&lt;/em&gt;, &lt;em&gt;Int&lt;/em&gt; e &lt;em&gt;Long&lt;/em&gt;): números negativos e positivos sem casas decimais&lt;/li&gt;
&lt;li&gt;Racionais (&lt;em&gt;Float&lt;/em&gt;/&lt;em&gt;Double&lt;/em&gt;): Número negativos e positivos com casas decimais&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quais são os tipos inteiros?
&lt;/h3&gt;

&lt;p&gt;Os tipos inteiros se dividem em quatro, sendo esses quatro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Byte: Números inteiros de -128 á 127&lt;/li&gt;
&lt;li&gt;Short: Números inteiros de -32768 á 32767&lt;/li&gt;
&lt;li&gt;Int: Números de -2,147,483,648 á 2,147,483,647&lt;/li&gt;
&lt;li&gt;Long: Números de -9,223,372,036,854,775,808 á 9,223,372,036,854,775,807&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por conta desses tipos de números diferentes, devemos pensar em qual será o tamanho do número que vamos guardar, para usar um tipo apropriado para esse número.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são os tipos racionais?
&lt;/h3&gt;

&lt;p&gt;Os tipos racionais se dividem em Float e Double. A diferença entre Float e Double, é que o número máximo de casas decimais do float são de 7 números, enquanto que o número máximo de casas decimais do &lt;em&gt;Double&lt;/em&gt; são de 16 números.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando números inteiros no Kotlin
&lt;/h2&gt;

&lt;p&gt;Podemos usar números inteiros no Kotlin definindo em variáveis, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;exemploNúmero&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como não informamos o tipo de número no exemplo acima, O Kotlin irá entender automaticamente qual é o melhor tipo para usar nesse número, que no caso, será &lt;code&gt;Int&lt;/code&gt;. Mas caso você prefira, também é possível de informar o tipo do número, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;exemploNúmero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando números racionais no Kotlin
&lt;/h2&gt;

&lt;p&gt;A mesma coisa acontece com os números racionais, podendo ser definidos sem determinarmos o tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;exemploNúmero&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;50.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E também determinando o tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;exemploNúmero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;50.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Operações com números
&lt;/h2&gt;

&lt;p&gt;Podemos fazer operações com números do Kotlin da mesma maneira que qualquer outra linguagem. Uma soma por exemplo pode ser feita dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;soma&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="c1"&gt;// 40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Na variável &lt;code&gt;soma&lt;/code&gt;, será atribuida o resultado da soma entre os números &lt;code&gt;10&lt;/code&gt; e &lt;code&gt;30&lt;/code&gt;, logo, a variável &lt;code&gt;soma&lt;/code&gt; terá o valor &lt;code&gt;40&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em Kotlin, temos alguns operadores, como:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Símbolo&lt;/th&gt;
&lt;th&gt;Exemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Soma&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;5 + 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subtração&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;5 - 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiplicação&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;5 * 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Divisão&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;5 / 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resto de divisão&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;5 % 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Você pode estar se perguntando o quê é esse operador de &lt;strong&gt;Resto de Divisão&lt;/strong&gt;. Esse operador faz uma divisão comum, mas ao invés de retornar o resultado da divisão, retorna o resto que ficou dessa divisão.&lt;/p&gt;

&lt;p&gt;Esse operador é utilizado principalmente para descobrir se um número é par ou impar usando o número &lt;code&gt;2&lt;/code&gt;. Como por exemplo: &lt;code&gt;5 % 2&lt;/code&gt;, &lt;code&gt;10 % 2&lt;/code&gt;,etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversão de tipos numéricos
&lt;/h2&gt;

&lt;p&gt;Podemos converter qualquer número para outro tipo numérico ou para outros tipos, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;numeroInt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;numeroFloat&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeroInt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFloat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// 10.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No exemplo acima, criamos uma variável chamada &lt;code&gt;numeroInt&lt;/code&gt; valendo 10;&lt;/li&gt;
&lt;li&gt;Após isso &lt;code&gt;numeroFloat&lt;/code&gt; é definida com o valor de &lt;code&gt;numeroInt&lt;/code&gt; (&lt;code&gt;10&lt;/code&gt;), mas transformado em Float. Tendo assim um valor com casas decimais &lt;code&gt;10.0&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também podemos converter para outros tipos que não sejam numéricos, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;numeroInt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;numeroString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeroInt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// "10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No exemplo acima, criamos a &lt;code&gt;numeroInt&lt;/code&gt; novamente, e depois criamos a &lt;code&gt;numeroString&lt;/code&gt; tendo o valor da &lt;code&gt;numeroString&lt;/code&gt;, mas em forma de String, não número.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Nesse artigo, você aprendeu a como usar números, fazer operações, e conversões com esses números no Kotlin!&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda" rel="noopener noreferrer"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Encoding, Hashing e Encryption: Qual a diferença?</title>
      <dc:creator>Ste Suzart 🦊 ~</dc:creator>
      <pubDate>Sat, 22 Jan 2022 22:34:16 +0000</pubDate>
      <link>https://forem.com/kotlinautas/encoding-hashing-e-encryption-qual-a-diferenca-29gg</link>
      <guid>https://forem.com/kotlinautas/encoding-hashing-e-encryption-qual-a-diferenca-29gg</guid>
      <description>&lt;p&gt;Encoding, hashing e encryption são conceitos comuns aplicados e discutidos ao tentar proteger os dados. Muitos devs afirmam usar métodos e padrões de criptografia fortes, mas é necessário que uma equipe de segurança avalie se realmente é apropriado.👌&lt;/p&gt;

&lt;p&gt;Vamos dar uma olhada nas diferenças entre o uso adequado de encoding, hashing e encryption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoding
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Encoding&lt;/em&gt;(codificar) algo é comunicá-lo de uma maneira que o receptor entenda. Existem muitos padrões de codificação, como por exemplo, &lt;strong&gt;Base64&lt;/strong&gt;, &lt;strong&gt;UTF-8&lt;/strong&gt; e &lt;strong&gt;ASCII&lt;/strong&gt;. Cada padrão tem uma finalidade e as aplicações que usam esses padrões de codificação esperam receber dados compatíveis com esse padrão de codificação.&lt;/p&gt;

&lt;p&gt;Uma comparação fácil é a linguagem humana. As palavras, sintaxe e regras da linguagem são diferentes e únicas para cada cultura linguística. Um nativo de português pode não ser capaz de ler ou falar japonês, mas com o tradutor adequado, ele pode decodificar o japonês para o português e até codificar o português para o japonês usando um tradutor.&lt;/p&gt;

&lt;p&gt;As duas linhas a seguir representam os mesmos dados:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texto:&lt;/strong&gt; Esta linha tem dados secretos que você realmente deve codificar.&lt;br&gt;
&lt;strong&gt;Base64:&lt;/strong&gt; RXN0YSBsaW5oYSB0ZW0gZGFkb3Mgc2VjcmV0b3MgcXVlIHZvY8OqIHJlYWxtZW50ZSBkZXZlIGNvZGlmaWNhci4=&lt;/p&gt;

&lt;p&gt;Para os olhos humanos, essas duas linhas são totalmente diferentes. Para uma aplicação, elas são iguais.&lt;/p&gt;

&lt;p&gt;Se você codificar diversas vezes os mesmos dados, o encode gerado será o mesmo valor, caso mude uma vírgula, irá mudar tudo.&lt;/p&gt;

&lt;p&gt;A codificação de dados é normalmente usada para garantir a integridade e usabilidade dos dados e na maioria das vezes é usada quando os dados não podem ser transferidos em seu formato atual entre sistemas ou aplicações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A codificação não é usada para proteger dados, porque é fácil de reverter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Qualquer fornecedor que afirme usar criptografia base64 forte em sua solução é suspeito.&lt;/p&gt;

&lt;p&gt;Exemplo de código em kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.*&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;mensagem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Esta linha tem dados secretos que você realmente deve codificar."&lt;/span&gt;

    &lt;span class="c1"&gt;//codifica para base64&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;codificarString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encodeToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toByteArray&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"string codificada: $codificarString"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;//decodifica&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;decodificarBytes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDecoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codificarString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;decodificarString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decodificarBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"string decodificada: $decodificarString"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hashing
&lt;/h2&gt;

&lt;p&gt;Hashing é um método de validação de integridade. O problema que o hashing se propõe a resolver não é proteger os dados de serem lidos, mas sim validar que os dados em questão não foram alterados.&lt;/p&gt;

&lt;p&gt;Os algoritmos de hash são funções unidirecionais que recebem uma entrada e calculam uma única saída. Os algoritmos de hash são projetados de tal forma que você não pode pegar um valor de hash e trabalhar o algoritmo de volta para obter a entrada original. Caso haja uma invasão na sua base de hash, o invasor teria que gerar muitas entradas em potencial e comparar a saída com a saída do algoritmo de hash para ver se elas estavam corretas.&lt;/p&gt;

&lt;p&gt;Os algoritmos de hash incluem SHA1, SHA256 e SHAKE256, entre outros.&lt;/p&gt;

&lt;p&gt;As três linhas a seguir representam os mesmos dados:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texto&lt;/strong&gt;: Esta linha tem dados secretos que você realmente deve criptografar.&lt;br&gt;
&lt;strong&gt;MD5&lt;/strong&gt;: ca37111d05a53346b2c14d749e4c4191&lt;br&gt;
&lt;strong&gt;SHA1&lt;/strong&gt;: f6472fbf25720494e4d02d0ec2c94aacee34d602&lt;/p&gt;

&lt;p&gt;Hashing nunca deve ser revertido. Ele não deve ser usado para impedir que as comunicações sejam lidas por partes não autorizadas.&lt;/p&gt;

&lt;p&gt;Um uso comum de hash é para proteger o armazenamento de senhas. Quando um usuário cria uma senha, a senha é colocada por meio de um algoritmo de hash. O hash resultante é então armazenado. Quando um usuário tenta se autenticar, a senha é criptografada novamente e comparada com o hash armazenado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Novamente, o hash é uma verificação de integridade. Não é criptografia.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exemplo de código em kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.math.BigInteger&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.security.MessageDigest&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;input&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Esta linha tem dados secretos que você realmente deve criptografar."&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;md5&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"o hash do md5 é $md5"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;sha1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"o hash do sha1 é $sha1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;md&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MessageDigest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MD5"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toByteArray&lt;/span&gt;&lt;span class="p"&gt;())).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha1&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;md&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MessageDigest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SHA-1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toByteArray&lt;/span&gt;&lt;span class="p"&gt;())).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encryption
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;Encryption&lt;/em&gt;(criptografia) torna os dados ilegíveis por qualquer pessoa, exceto aqueles que conhecem a &lt;em&gt;secret key&lt;/em&gt;(chave secreta). O segredo pode ser uma única &lt;em&gt;shared key&lt;/em&gt;(chave compartilhada) ou pode ser dividido em duas chaves - uma mantida privada e outra fornecida à outra parte.&lt;/p&gt;

&lt;p&gt;Digamos que Quinn e Gary desejam se comunicar com segurança. Eles decidem usar uma &lt;em&gt;shared key&lt;/em&gt;(chave compartilhada) de “chookity” para seu segredo. Ao criptografar uma mensagem, Quinn insere a chave de criptografia. Ao descriptografar a mensagem, Gary digita a chave para poder ler a mensagem.&lt;/p&gt;

&lt;p&gt;Quinn e Gary, no entanto, estão preocupados com o fato da mensagem secreta ser lida por um terceiro que possa adivinhar ou obter essa chave. Eles decidem usar um sistema de duas chaves (criptografia de chave assimétrica - &lt;em&gt;asymmetric key encryption&lt;/em&gt;) para criptografar as mensagens. Quinn quer enviar uma mensagem que somente Gary pode ler. Quinn usa uma chave (chave pública - &lt;em&gt;public key&lt;/em&gt;) que Gary deu a ela com antecedência. Gary recebe essa mensagem criptografada e usa sua outra chave (chave privada - &lt;em&gt;private key&lt;/em&gt;) para descriptografar e ler essa mensagem. Como apenas Gary conhece sua chave privada e nunca a compartilhou com ninguém, ninguém pode descriptografar a mensagem, exceto Gary. Gary também usa sua chave privada para enviar uma mensagem para Quinn e Quinn pode usar a chave pública que Gary deu a ela para lê-la. Esse tipo de criptografia é conhecido como &lt;em&gt;signing&lt;/em&gt;(assinatura). Como a chave pública que Gary deu a Quinn descriptografou a mensagem, Quinn pode presumir com segurança que Gary enviou a mensagem, pois apenas Gary tem a outra chave desse par.&lt;/p&gt;

&lt;p&gt;Algoritmos de criptografia fortes comuns incluem: AES, Blowfish e RSA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Encoding, hashing e encryption podem ser usados ​​juntos. Uma mensagem codificada em base64 para uma aplicação pode ser hash para que a integridade dessa mensagem possa ser verificada pelo receptor. A mensagem pode então ser criptografada e enviada para o destinatário que irá descriptografar e comparar o hash da mensagem com o valor de hash recebido do remetente para garantir que a mensagem não foi alterada.&lt;/p&gt;

&lt;p&gt;Compreender a diferença entre esses conceitos pode ajudá-lo a considerar o design e a arquitetura de segurança, especialmente quando se trata de aquisição ou revisão de aplicações. Implementar acidentalmente a codificação como um método de criptografia pode ser muito perigoso para uma organização, pois isso significaria que as transmissões são dados reais que podem ser facilmente decodificados por qualquer pessoa, então tomem cuidado senhores &amp;amp; senhoras ✌️&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>braziliandevs</category>
      <category>security</category>
    </item>
    <item>
      <title>Meu início no mundo Kotlin</title>
      <dc:creator>Victor Castro</dc:creator>
      <pubDate>Wed, 12 Jan 2022 03:10:38 +0000</pubDate>
      <link>https://forem.com/kotlinautas/meu-inicio-no-mundo-kotlin-45hf</link>
      <guid>https://forem.com/kotlinautas/meu-inicio-no-mundo-kotlin-45hf</guid>
      <description>&lt;p&gt;Em janeiro de 2021 comecei em um novo trabalho. Além dos desafios de adaptação que costuma ocorrer ao você iniciar em uma nova empresa, como, por exemplo, regras e cultura da organização, arquitetura e objetivo do projeto, etc.&lt;/p&gt;

&lt;p&gt;Nesse novo trabalho tive outro desafio que foi desenvolver com uma linguagem de programação que eu nunca tinha tido contato anteriormente e essa linguagem foi o Kotlin, de início fiquei um pouco com medo de ter que mexer com algo que nem sequer tinha estudado antes. Só tinha visto alguns vídeos aleatórios no youtube sobre Kotlin, mas bem por cima mesmo, sem algo muito detalhado.&lt;/p&gt;

&lt;p&gt;Mas depois de um tempo eu me senti mais confortável, durante esse artigo, irei explicar um pouco de como comecei a estudar Kotlin e, porque resolvi continuar investindo nele.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kotlin além do Android
&lt;/h2&gt;

&lt;p&gt;Um dos grandes desafios era que eu iria desenvolver com o Kotlin no lado do servidor, é muito comum se ouvir falar de Kotlin para programação Android, mas ela é uma linguagem multiplataforma, ao decorrer do artigo vou explicar melhor sobre isso.&lt;/p&gt;

&lt;p&gt;Fiquei receoso em investir o meu tempo de estudos em uma linguagem que quase não via vaga para backend, via muitas para mobile, mas backend era quase zero. Lembro que chamei a &lt;a href="https://dev.to/morgannadev"&gt;@morgannadev&lt;/a&gt; para conversar, pois, ela era a única pessoa que eu conhecia que trabalhava com Kotlin no backend e perguntei se realmente valia a pena investir meu tempo estudando e se tinha mercado para essa tecnologia no backend.&lt;/p&gt;

&lt;p&gt;Após conversar bastante, cheguei na decisão de que iria continuar estudando Kotlin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como surgiu?
&lt;/h3&gt;

&lt;p&gt;Kotlin foi desenvolvida em 2011 pela Jetbrains, o seu principal objetivo ao ser criada era porque a Jetbrains queria uma linguagem de programação para resolver problemas de produtividade na criação de suas IDEs, que eram desenvolvidas com Java.&lt;/p&gt;

&lt;p&gt;Porém, ela estava tendo problemas com certas características do Java, foi aí que Jetbrains resolveu desenvolver uma linguagem de programação, que pudesse suprir suas necessidades e melhorar o desenvolvimento de seus produtos. A versão 1.0 do Kotlin foi lançada oficialmente em 15 de fevereiro de 2016.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde posso usar Kotlin?
&lt;/h3&gt;

&lt;p&gt;Como foi falado anteriormente, Kotlin é uma linguagem multiplataforma. Ela roda em cima da JVM (Java Virtual Machine), ou seja, você consegue executar em qualquer lugar que rode a JVM.&lt;/p&gt;

&lt;p&gt;Hoje em dia é muito comum ver o Kotlin ligado ao desenvolvimento Mobile, o motivo disso é que em 2017 o Google anunciou que a partir daquele momento, Kotlin era uma linguagem suportada para o desenvolvimento Android e em 7 de maio de 2019 declarou como a linguagem oficial para o desenvolvimento de aplicações Android.&lt;/p&gt;

&lt;p&gt;Mas podemos trabalhar com Kotlin no lado do servidor, desenvolvendo aplicações Web utilizando frameworks como &lt;a href="https://micronaut.io/"&gt;Micronaut&lt;/a&gt;, &lt;a href="https://ktor.io/"&gt;Ktor&lt;/a&gt;, &lt;a href="https://spring.io/"&gt;Spring&lt;/a&gt; etc, esse é meu foco atualmente. Também podemos criar aplicações Desktop utilizando bibliotecas de interfaces como &lt;a href="https://tornadofx.io/"&gt;TornadoFx&lt;/a&gt; ou &lt;a href="https://openjfx.io/"&gt;JavaFx&lt;/a&gt;. Existe ainda a possibilidade de transpilar um código Kotlin para javascript, fazendo com que seja possível desenvolver aplicações web frontend. Você pode achar mais informações sobre o &lt;a href="https://kotlinlang.org/docs/js-overview.html"&gt;nessa parte&lt;/a&gt; da documentação.&lt;/p&gt;

&lt;p&gt;Também é possível desenvolver aplicações para IOS utilizando o &lt;a href="https://kotlinlang.org/lp/mobile/"&gt;KMM&lt;/a&gt;(Kotlin Multiplatform Mobile) e conseguimos criar aplicações nativas para várias plataformas utilizando o Kotlin native, temos um &lt;a href="https://dev.to/kotlinautas/o-que-e-kotlin-native-1ejh"&gt;artigo&lt;/a&gt; da &lt;a href="https://dev.to/lissadev"&gt;@lissadev&lt;/a&gt; sobre isso.&lt;/p&gt;

&lt;p&gt;Kotlin possui várias possibilidades para trabalhar, você pode ver melhor na documentação oficial. Mas resumindo temos os seguintes locais onde podemos criar aplicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento Android&lt;/li&gt;
&lt;li&gt;Desenvolvimento Backend&lt;/li&gt;
&lt;li&gt;Desenvolvimento Desktop&lt;/li&gt;
&lt;li&gt;Transpilação para Javascript&lt;/li&gt;
&lt;li&gt;Desenvolvimento multiplataforma (Ios e Android)&lt;/li&gt;
&lt;li&gt;Desenvolvimento nativo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Características do Kotlin
&lt;/h3&gt;

&lt;p&gt;Logo abaixo você consegue ver um exemplo de um código escrito em Kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;valor1&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;primeiroNumero&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;segundoNumero&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;resultado&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiroNumero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;segundoNumero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O resultado da soma é: $resultado"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// O resultado da soma é: 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é um código bem simples que declara uma função chamada soma esperando dois parâmetros do tipo inteiro e retorna a soma desses valores. Já na função &lt;code&gt;main()&lt;/code&gt; definimos duas variáveis que recebe dois números inteiros, definimos uma variável chamada de &lt;code&gt;resultado&lt;/code&gt; que recebe o retorno da função &lt;code&gt;soma&lt;/code&gt; passando como parâmetro às duas variáveis declaradas anteriormente e por fim mostramos na tela o valor da soma, concatenado com uma string. &lt;/p&gt;

&lt;p&gt;E no final chamamos nossa função main. Você pode executar o código acessando  &lt;a href="https://play.kotlinlang.org/#eyJ2ZXJzaW9uIjoiMS42LjEwIiwicGxhdGZvcm0iOiJqYXZhIiwiYXJncyI6IiIsIm5vbmVNYXJrZXJzIjp0cnVlLCJ0aGVtZSI6ImlkZWEiLCJjb2RlIjoiZnVuIHNvbWEodmFsb3IxOiBJbnQsIHZhbG9yMjogSW50KTogSW50IHtcbiAgICByZXR1cm4gdmFsb3IxICsgdmFsb3IyXG59XG5cbmZ1biBtYWluKCkge1xuICAgIHZhbCBwcmltZWlyb051bWVybyA9IDEwXG4gICAgdmFsIHNlZ3VuZG9OdW1lcm8gPSA1XG4gICAgdmFsIHJlc3VsdGFkbyA9IHNvbWEocHJpbWVpcm9OdW1lcm8sIHNlZ3VuZG9OdW1lcm8pXG4gICAgcHJpbnRsbihcIk8gcmVzdWx0YWRvIGRhIHNvbWEgw6k6ICRyZXN1bHRhZG9cIilcbn0ifQ=="&gt;esse&lt;/a&gt; link.&lt;/p&gt;

&lt;p&gt;Como pode ver a sintaxe do Kotlin é bem simples e amigável. Uma coisa que escutei quando tava começando, é que o Kotlin pega as coisas que são boas de várias linguagens e junta em uma só.&lt;br&gt;
Durante o tempo em que estou escrevendo código em Kotlin, me lembro de várias coisas que utilizo em outras linguagens como, por exemplo javascript e Java.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens do Kotlin
&lt;/h2&gt;

&lt;p&gt;Bom, mas quais são as vantagens em relação as outras linguagens? Existem diversas vantagens, mas eu resolvi destacar aqui nesse artigo as quais eu considero mais legais pra quem está iniciando saber.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compatibilidade com Java&lt;/strong&gt;: Como falado antes, Kotlin roda em cima da JVM, isso é possível, pois, um código escrito em Kotlin no final é compilado para um bytecode Java, ou seja, você consegue utilizar Java e Kotlin no mesmo projeto, pois, no final na hora de executar, tudo vai ser convertido para um arquivo bytecode Java. Mas qual a vantagem disso? A vantagem é que você pode fazer a transição de um projeto escrito em Java para Kotlin com pequenos passos, pois, você pode ter um projeto Java e começar a escrever novas funcionalidades em Kotlin e ir transcrevendo as classes antigas escritas em Java para Kotlin. Um recurso legal que você pode usufruir é o Java2Kotlin através de uma funcionalidade da IDE da Jetbrains. Você pode entender melhor nesse &lt;a href="https://kotlinlang.org/docs/mixing-java-kotlin-intellij.html#converting-an-existing-java-file-to-kotlin-with-j2k"&gt;link&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suporte a várias bibliotecas&lt;/strong&gt;: Pela vantagem falada acima você pode utilizar todas as bibliotecas utilizadas no mundo Java em seu projeto Kotlin, basta instalar a lib no seu projeto e importar no seu arquivo, provavelmente você vai ter que mudar a forma de chamar certas funções, mas a própria IDE da Jebrains te ajuda com isso. Uma dúvida que tive no início era se eu precisava aprender Java antes de aprender Kotlin. E a resposta é NÃO, você ter uma base de pode te ajudar, mas não é um requisito para começar a estudar o Kotlin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linguagem multiparadigma&lt;/strong&gt;: Uma coisa bem legal que o Kotlin te proporciona é você poder utilizar diversos paradigmas de programação em seus projetos. Pois, o Kotlin suporta o paradigma de POO(Programação Orientada a Objetos), paradigma procedural e paradigma Funcional, uma coisa que fiquei admirado quando comecei a estudar Kotlin é que eu poderia declarar uma variável recebendo uma estrutura de decisão (if e else), pois, diferente de outras linguagens no Kotlin uma estrutura de decisão é uma função.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Null safety&lt;/strong&gt;: Algo queridinho da comunidade do Kotlin é o Null safety se você veio de linguagens como javascript, provavelmente durante o desenvolvimento de alguns sistemas você já se deparou com um 'undefined' ou no Java você, já se deparou com o erro 'NullPointerException' isso ocorre, pois, nessas linguagens você pode declarar uma variável inicialmente sem nenhum valor declarado a ela, no Kotlin isso não é possível, você deve atribuir um valor a uma variável ao declara-la. Existe formas de contornar isso utilizando o operador '?' depois do tipo da variável, por exemplo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas observe que eu atribuo o valor null na variável. Isso não dever ser feito com frequência, pois pode trazer problemas futuros na execução do seu projeto. Mas o importante ressaltar essa funcionalidade do Kotlin é que você tem um código mais seguro. Antes eu programava com Javascript e PHP e essas linguagens não têm esse tipo de suporte, você nem mesmo precisa declarar o tipo da variável e isso de inicio me travava um pouco na hora de desenvolver, mas com o tempo você vai pegando o jeito. Você pode estudar melhor sobre esse assunto olhando na documentação do Kotlin nesse &lt;a href="https://kotlinlang.org/docs/null-safety.html"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vagas
&lt;/h2&gt;

&lt;p&gt;No inicio eu falei que tinha medo de não achar uma vaga para Kotlin no backend, além de ter várias para o mobile também possuimos várias vagas para Kotlin no backend. Você pode dar uma olhada &lt;a href="https://github.com/Kotlin-BR/kotlin-no-backend"&gt;nesse&lt;/a&gt; repo do github sobre empresas que utilizam Kotlin no backend aqui no Brasil. Isso sem contar as vagas que temos fora do Brasil, então temos bastante vagas para você poder trabalhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como estudar Kotlin?
&lt;/h2&gt;

&lt;p&gt;Bom depois de ler tudo isso sobre Kotlin espero ter despertado em você um interesse em estudar Kotlin :) Mas, como eu posso fazer isso? Bom eu vou passar aqui dicas que eu recebi quando eu estava iniciando, mas isso não quer dizer que só existe essa forma, essa foi apenas a forma que eu aprendi e pode ajudar você também.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A primeira dica que eu passo é ler a documentação. A documentação do Kotlin é bem detalhada e explica muito bem, você pode acessar a documentação &lt;a href="https://kotlinlang.org/docs/"&gt;aqui&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A segunda coisa que me ajudou bastante no inicio e ajuda até hoje é uma parte especifica da documentação que mostra a sintaxe básica da linguagem, se você é do tipo de pessoa que gosta de aprender uma linguagem nova já colocando a mão na massa você pode iniciar lendo a parte de &lt;a href="https://kotlinlang.org/docs/basic-syntax.html"&gt;base syntax&lt;/a&gt;. Nela você consegue ver como declarar coisas básicas da linguagem, como por exemplo variáveis, funções, arrays, estruturas de decisão e repetição e etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se você gosta de cursos eu separei uma lista de cursos gratuitos que você pode fazer, essa lista tá disponibilizada &lt;a href="https://kotlinautas.dev/cursos/"&gt;aqui&lt;/a&gt; no site da Kotlinautas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se você gosta de ler indico você seguir a gente da Kotlinautas aqui no dev.to nesse &lt;a href="https://dev.to/kotlinautas"&gt;link&lt;/a&gt; você pode achar vários artigos legais sobre Kotlin no geral.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uma da parte mais importante para aprender uma linguagem de programação nova é praticar escrevendo algoritimos, para isso você pode utilizar a parte de &lt;a href="https://play.kotlinlang.org/byExample/overview"&gt;Kotlin By Examples&lt;/a&gt; na documentação do Kotlin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;E por último uma coisa que é legal você saber é sobre a forma "Kotliniana" de se escrever um código. Isso é apenas uma forma que um código escrito em Kotlin deve ser, mas você não deve ficar preso a isso no início, pois isso pode atrapalhar na sua evolução, eu apenas indico você dar uma olhada e saber que existe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bom e por último mas não menos importante você pode seguir no twitter o perfil da &lt;a href="https://twitter.com/kotlinautas"&gt;Kotlinautas&lt;/a&gt; da &lt;a href="https://twitter.com/jetbrains"&gt;Jetbrains&lt;/a&gt; e o da linguagem &lt;a href="https://twitter.com/kotlin"&gt;Kotlin&lt;/a&gt; para saber sobre atualizações da linguagem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bom espero ter ajudado você nesse início com Kotlin e ter tirado algumas dúvidas sobre essa linguagem que mal conheço mas já considero Pakas. E qualquer dúvida que você tiver pode me chamar lá no Twitter &lt;a href="https://twitter.com/kastrowalker"&gt;kastrowalker&lt;/a&gt; que eu vou ter um prazer imenso em ajudar você.&lt;/p&gt;

&lt;p&gt;Um grande abraço e até a próxima.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>kotlin</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Frontend com KVision</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Tue, 04 Jan 2022 02:47:18 +0000</pubDate>
      <link>https://forem.com/kotlinautas/frontend-com-kvision-2p0d</link>
      <guid>https://forem.com/kotlinautas/frontend-com-kvision-2p0d</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/" rel="noopener noreferrer"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é Kotlin/JS?
&lt;/h2&gt;

&lt;p&gt;Com &lt;a href="https://kotlinlang.org/docs/js-overview.html" rel="noopener noreferrer"&gt;Kotlin/JS&lt;/a&gt; podemos escrever um código totalmente em Kotlin, e esse código em Kotlin será transformado em Javascript. Com isso, poderemos criar uma página web, com estrutura (HTML), estilos (CSS) e interação (Javascript) unicamente com Kotlin.&lt;/p&gt;

&lt;p&gt;Uma das vantagens do Kotlin/JS é poder usar bibliotecas multi-plataforma dentro do Kotlin/JS, aumentando as combinações entre bibliotecas que podem ser feitas.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é KVision?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kvision.gitbook.io/kvision-guide/" rel="noopener noreferrer"&gt;KVision&lt;/a&gt; é um framework para a plataforma Kotlin/JS. Com KVision poderemos escrever código do Kotlin/JS de maneira mais simples, criando componentes, usando Bootstrap, estilizando elementos HTML com Kotlin,etc. Uma outra funcionalidade é usar componentes React/Redux dentro do KVision.&lt;/p&gt;

&lt;p&gt;Além disso, KVision pode se integrar facilmente com &lt;a href="https://ktor.io/" rel="noopener noreferrer"&gt;Ktor&lt;/a&gt;, &lt;a href="https://spring.io/projects/spring-boot" rel="noopener noreferrer"&gt;Spring&lt;/a&gt;, &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt; e outros frameworks para Kotlin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais
&lt;/h2&gt;

&lt;p&gt;Será necessário ter o &lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IntelliJ&lt;/a&gt; instalado na máquina, conhecimento básico sobre a linguagem &lt;a href="https://kotlinlang.org/" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt; e conhecimento básico sobre frontend (HTML, CSS e Javascript).&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalando o plugin do KVision
&lt;/h2&gt;

&lt;p&gt;Agora, vamos começar a criar o projeto, primeiro, vamos ao &lt;em&gt;marketplace&lt;/em&gt; de extensões do IntelliJ. Vá ao menu de configurações, com o atalho &lt;code&gt;Ctrl+Alt+S&lt;/code&gt;, e ao menu &lt;strong&gt;Plugins&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqnw81uyao5ojjqc2l2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqnw81uyao5ojjqc2l2d.png" alt="Localização do menu plugins dentro das configurações do intelliJ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, vá na barra de pesquisa e pesquise por &lt;code&gt;kvision&lt;/code&gt;. Com isso, o plugin do KVision irá aparecer e você poderá instalar clicando no botão &lt;strong&gt;Install&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falrtipg9iwi1rap5qqcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falrtipg9iwi1rap5qqcg.png" alt="KVision no marketplace do IntelliJ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, caso você clique no botão &lt;strong&gt;New Project&lt;/strong&gt;, terá um novo menu no canto esquerdo, sendo o menu do KVision que acabamos de instalar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For9d8pgyu5lzf183g3b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For9d8pgyu5lzf183g3b3.png" alt="Menu do KVision na criação de um novo projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um projeto com KVision
&lt;/h2&gt;

&lt;p&gt;Agora vamos criar um projeto com KVision. Primeiro, observe que o menu do KVision tem alguns campos, sendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project Type&lt;/strong&gt;: Define o tipo de projeto que será criado, podendo ser um projeto Ktor, Spring, Quarkus,etc. No caso, será apenas um projeto de frontend, então deixe na opção padrão &lt;strong&gt;Frontend project&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GroupId&lt;/strong&gt;: Define o grupo do pacote que será criado, esse campo é totalmente livre. Você pode colocar algo como &lt;strong&gt;com.kvsion&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ArtifactId&lt;/strong&gt;: Define o artifact do pacote que será criado, esse campo é totalmente livre. Você pode colocar algo como &lt;strong&gt;kvision&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kotlin/JS compiler&lt;/strong&gt;: Define qual será o compilador que vamos usar no projeto. Deixe como está, que é o &lt;strong&gt;IR&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Opitional Modules&lt;/strong&gt;: São diversos módulos que podem ser instalados de maneira opicional, primeiramente, vamos selecionar os dois primeiros, sendo o &lt;strong&gt;Bootstrap based components&lt;/strong&gt;, e o &lt;strong&gt;Standard Bootstrap CSS styling&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após fazer essas configurações, clique no botão &lt;strong&gt;Next&lt;/strong&gt; para continuar.&lt;/p&gt;

&lt;p&gt;Agora preencha o nome, e a localização do projeto, sendo de escolha completamente pessoal. Caso não tenha nenhuma ideia, pode nomear com algo como &lt;strong&gt;kvision&lt;/strong&gt; ou &lt;strong&gt;kvisiondemo&lt;/strong&gt; por exemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkj5oht2fm9gymx32x3r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkj5oht2fm9gymx32x3r5.png" alt="Definindo nome e localização do projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso você crie o projeto e dê algum erro dizendo que a configuração da JDK do Gradle é inválida, dessa maneira (texto e imagem):&lt;/p&gt;

&lt;h3&gt;
  
  
  Texto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid Gradle JDK configuration found. Open Gradle Settings
Use JDK from project structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Imagem
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floj1aj8a3v7twd78zk8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floj1aj8a3v7twd78zk8j.png" alt="Erro relacionado á Gradle que pode ocorrer na incialização do episódio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para resolver isso, clique no botão &lt;code&gt;Open Gradle Settings&lt;/code&gt;, e irá aparecer o menu de configurações do Gradle&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2e88r6hko3tpnu25xyz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2e88r6hko3tpnu25xyz.png" alt="Menu de configurações do Gradle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá á opção &lt;code&gt;Gradle &amp;gt; Use Gradle from:&lt;/code&gt; e mude essa opção de &lt;code&gt;'gradle-wrapper.properties' file&lt;/code&gt; para &lt;code&gt;'wrapper' task in Gradle build script&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso a opção abaixo &lt;code&gt;Gradle JVM&lt;/code&gt; esteja em vermlho, mude para uma versão válida. Clicando será possível de escolher uma versão da JVM específica para esse projeto.&lt;/p&gt;

&lt;p&gt;Clique em OK para aplicaras mudanças. Com isso, as dependências do seu projeto serão carregadas no projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo a estrutura de pastas do KVision
&lt;/h2&gt;

&lt;p&gt;Os arquivos dentro da raiz do projeto são referentes á configuração do projeto e do KVision. Esses não iremos mexer em nada por enquanto.&lt;/p&gt;

&lt;p&gt;Dentro da pasta &lt;code&gt;src&lt;/code&gt; temos todos os arquivos fonte da nossa aplicação, primeiramente temos duas pastas, sendo a &lt;code&gt;main&lt;/code&gt; que guarda o código principal da nossa organização, e a &lt;code&gt;test&lt;/code&gt; que irá guardar os testes da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Dentro da &lt;code&gt;main&lt;/code&gt;, temos apenas duas pastas, &lt;code&gt;kotlin&lt;/code&gt; que irá armazenar apenas código Kotlin. Caso nosso projeto tivesse Java (que não é o caso) teriamos uma pasta Java também. A outra pasta é a &lt;code&gt;web&lt;/code&gt; que guarda arquivos que serão usados por toda a aplicação. Agora temos apenas o arquivo &lt;code&gt;index.html&lt;/code&gt;, que guarda um template HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;KVision Template&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"main.bundle.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A nossa aplicação está dentro de &lt;code&gt;src/main/kotlin/com/kvision/kvision/App.kt&lt;/code&gt;, que por enquanto apresenta apenas um &lt;strong&gt;Hello World&lt;/strong&gt;. Vamos ver mais sobre esse arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.kvision.kvision&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.Application&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.CoreModule&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.BootstrapModule&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.BootstrapCssModule&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.html.div&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.module&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.panel.root&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.startApplication&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello world"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;// TODO&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;startApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;BootstrapModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;BootstrapCssModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;CoreModule&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Linha 3 á 10 importa diversos componentes, classes, elementos HTML,etc que vamos usar na nossa aplicação;&lt;/li&gt;
&lt;li&gt;Linha 12 declara uma classe que irá representar a nossa aplicação;&lt;/li&gt;
&lt;li&gt;Linha 13 - declara a função &lt;code&gt;start&lt;/code&gt;, que irá guardar o código dessa página web em específica;&lt;/li&gt;
&lt;li&gt;Linha 14 - &lt;code&gt;root&lt;/code&gt; é uma função que cria um novo container. Esse container irá armazenar todas as tags HTML da aplicação, apenas precisamos informar um ID que é o ID do elemento que irá guardar todos esses elementos. No caso sendo &lt;code&gt;kvapp&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Linha 15 - cria um elemento &lt;code&gt;div&lt;/code&gt; que apenas está escrevendo um &lt;code&gt;hello world&lt;/code&gt; na tela. Servindo apenas como exemplo;&lt;/li&gt;
&lt;li&gt;Linha 21 - declara a função &lt;code&gt;main&lt;/code&gt; da nossa aplicação, sendo essa a função principal;&lt;/li&gt;
&lt;li&gt;Linha 22 - Inicia a aplicação com a função &lt;code&gt;startApplication&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Linha 24 á 27 - São passados os módulos que baixamos para a aplicação, sendo o &lt;code&gt;module.hot&lt;/code&gt; um módulo que nos permite mudar uma página e automaticamente a mudança ocorrer no navegador, &lt;code&gt;BootstrapModule&lt;/code&gt; e &lt;code&gt;BootstrapCssModule&lt;/code&gt; que são módulos relacionados á Bootstrap, e o &lt;code&gt;CoreModule&lt;/code&gt; que é um módulo padrão do KVision;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para iniciar a aplicação, clique na barra lateral &lt;strong&gt;Gradle&lt;/strong&gt;, depois em &lt;strong&gt;Run Configurations&lt;/strong&gt;, e em &lt;strong&gt;Run run&lt;/strong&gt; duas vezes, para assim fazer que a aplicação seja iniciada na URL &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora nossa aplicação está inciada, e na página &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;localhost:3000&lt;/a&gt; irá aparecer o &lt;strong&gt;Hello World&lt;/strong&gt; do KVision.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf08emhihs6wb8yjtcdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf08emhihs6wb8yjtcdu.png" alt="Hello World do KVision"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos fazer um exercício bem simples, vamos mudar o texto de &lt;code&gt;hello world&lt;/code&gt; para &lt;code&gt;Olá, mundo!&lt;/code&gt;. Isso pode ser feito mudando o conteúdo da função &lt;code&gt;div&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Mudamos o conteúdo de dentro de &lt;code&gt;div&lt;/code&gt; e também removemos o comentário &lt;code&gt;// TODO&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, o novo conteúdo será automaticamente atualizado e mostrado na página.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando elementos HTML
&lt;/h2&gt;

&lt;p&gt;Agora, vamos ver alguns exemplos de elementos HTML que podem ser criados usando KVision.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos modificar uma importação do nosso código. Pode ser visto na linha 7 que importamos apenas o elemento &lt;code&gt;div&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.html.div&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos mudar esse import, para ao invés de importar apenas o elemento &lt;code&gt;div&lt;/code&gt;, importar todos os elementos HTML suportados pelo KVision, e mais algumas funcionalidades relacionadas á CSS e JS. Isso pode ser feito utilizando o caractere coringa &lt;code&gt;*&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.*&lt;/span&gt; &lt;span class="c1"&gt;// Funções, classes,etc. do KVision&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.core.*&lt;/span&gt; &lt;span class="c1"&gt;// Funcionalidades relacionadas á CSS e JS&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.html.*&lt;/span&gt; &lt;span class="c1"&gt;// Todas as tags HTML&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.panel.*&lt;/span&gt; &lt;span class="c1"&gt;// Importar todos os painéis que podem ser criados (veremos mais adiante)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.utils.*&lt;/span&gt; &lt;span class="c1"&gt;// Unidades de medida como px (pixel)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listas
&lt;/h3&gt;

&lt;p&gt;Uma lista em HTML é uma série de dados unidos em uma forma visual de uma lista, um exemplo de lista é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeiro elemento&lt;/li&gt;
&lt;li&gt;Segundo elemento&lt;/li&gt;
&lt;li&gt;Terceiro elemento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso pode ser feito em HTML com dois elementos, sendo &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;, que é uma lista não ordenada, e &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; que é um elemento de uma lista. Logo, em HTML a lista acima seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Primeiro elemento&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Segundo elemento&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Terceiro elemento&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode ser feito no KVision usando a função &lt;code&gt;listTag&lt;/code&gt;, que representa uma lista em HTML.&lt;/p&gt;

&lt;p&gt;na função &lt;code&gt;listTag&lt;/code&gt;, iremos precisar informar o tipo da lista, sendo &lt;code&gt;ul&lt;/code&gt; para listas não ordenadas (só com as bolinhas por exemplo) e &lt;code&gt;ol&lt;/code&gt; para listas ordenadas, e após isso informar a lista. Um exemplo prático disso é esse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;listTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ListType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;UL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeiro elemento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Segundo elemento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Terceiro elemento"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Informamos o tipo da lista usando o método &lt;code&gt;listType.UL&lt;/code&gt;, caso quisessemos que essa lista fosse uma &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;, apenas iriamos mudar para &lt;code&gt;listType.OL&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Após isso, passamos uma lista de strings usando a função &lt;code&gt;listOf&lt;/code&gt;, colocando os elementos da lista dentro;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com isso, a lista será mostrada na página.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnptkjo75gph1tjx7tbdh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnptkjo75gph1tjx7tbdh.png" alt="Lista não ordenada sendo mostrada na página"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso mudemos o argumento &lt;code&gt;ListType.UL&lt;/code&gt; para &lt;code&gt;listType.OL&lt;/code&gt;, com o código ficará dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;listTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ListType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeiro elemento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Segundo elemento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Terceiro elemento"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lista ficará ordenada na página, seguindo assim a mudança feita de lista não ordenada para lista ordenada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sifiw66dd4btbamay8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sifiw66dd4btbamay8x.png" alt="Lista ordenada sendo mostrada na página"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;p&gt;No HTML, para criar links usamos a tag &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, que representa uma "âncora" que cria um link para uma página. No caso da tag &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; vamos precisar informar um parametro &lt;code&gt;href&lt;/code&gt;, que é para onde aquele link irá levar, e também um texto ou outros elementos dentro da tag &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://dev.to/kotlinautas"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Ver artigos da Kotlinautas&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criar links no KVision podemos usar a função &lt;code&gt;link&lt;/code&gt;, passando um placeholder, que é um texto que será clicável, e o link. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ver artigos da Kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://dev.to/kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora teremos um texto clicável em nossa página, que quando é clicado levará á lista de artigos da Kotlinautas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56blwsuitygrxglhmuhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56blwsuitygrxglhmuhd.png" alt="Link clicável levando á lista de artigos da Kotlinautas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando o link é clicado, a página atual é substuida pela lista de artigos da Kotlinautas. Como posso mudar esse comportamento, e fazer que quando o link é clicado, seja criada uma nova página com a página do link?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olhando para a assinatura da função &lt;code&gt;link&lt;/code&gt;, podemos ver todos os argumentos que podem ser passados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ResString&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;separator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;labelFirst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;.()&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;)?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que os únicos argumentos que usamos foram o &lt;code&gt;label&lt;/code&gt;, que é o texto do link, e o &lt;code&gt;url&lt;/code&gt; que é para onde o link está redirecionando. O argumento que precisamos adicionar para mudar o comportamento de redirecionamento desse link é no &lt;code&gt;target&lt;/code&gt;. Isso pode ser feito passando esse target na chamada dessa função &lt;code&gt;link&lt;/code&gt;, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ver artigos da Kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://dev.to/kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Passamos o target diretamente, usando o &lt;code&gt;target =&lt;/code&gt;, e passando o valor &lt;code&gt;_blank&lt;/code&gt; que irá fazer que uma nova página seja aberta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conteúdo dinâmico
&lt;/h3&gt;

&lt;p&gt;Podemos mudar o conteúdo de uma página dependendo de alguma interação que a pessoa usuária da página fizer. Isso pode ser feito usando a função &lt;code&gt;.onEvent&lt;/code&gt;, que irá executar algo se algum evento específico, como um clique, o mouse passar por cima do elemento,etc. acontecer.&lt;/p&gt;

&lt;p&gt;Vamos ver o exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Link para o Twitter da Kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://twitter.com/kotlinautas"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;onEvent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;mouseover&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Link para o Twitter da Feministech"&lt;/span&gt;
                    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://twitter.com/feminis_tech"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Temos um elemento &lt;code&gt;link&lt;/code&gt; que leva ao twitter da Kotlinautas;&lt;/li&gt;
&lt;li&gt;Usamos a função &lt;code&gt;.onEvent&lt;/code&gt;, iniciando um bloco onde podemos colocar os eventos que podem ocorrer com esse link;&lt;/li&gt;
&lt;li&gt;Colocamos um evento dentro desse bloco, sendo o &lt;code&gt;mouseover&lt;/code&gt;, que é um evento que ocorre toda vez que o mouse passa por cima do elemento;&lt;/li&gt;
&lt;li&gt;Dentro desse &lt;code&gt;mouseover&lt;/code&gt;, mudamos o texto e a url do link usando a variável &lt;code&gt;self&lt;/code&gt; que representa o elemento;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, quando você passar o mouse pelo link que levava ao twitter da Kotlinautas, o link será automaticamente modificado, e irá te enviar ao twitter da &lt;a href="https://twitter.com/feminis_tech/" rel="noopener noreferrer"&gt;Feministech&lt;/a&gt; no lugar.&lt;/p&gt;

&lt;p&gt;Há outros eventos que podem ser colocados no lugar, caso queira ver todos que podem ser usados, &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/Events" rel="noopener noreferrer"&gt;veja nessa lista da MDN&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Rich Text&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Podemos inserir um texto com tags HTML como seu conteúdo no KVision. Veja no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"&amp;lt;strong&amp;gt;Texto em negrito&amp;lt;/strong&amp;gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando você abrir a página,  o conteúdos será um texto &lt;code&gt;&amp;lt;strong&amp;gt;Texto em negrito&amp;lt;/strong&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhslmgogg7e2lcgyvlhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhslmgogg7e2lcgyvlhk.png" alt="Texto com tags HTML sendo mostrado de maneira literal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso aconteceu pois o texto na página está sendo mostrado apenas como texto, não como tags HTML. Para fazer que um texto seja interpretado como HTML, podemos passar um argumento chamado &lt;code&gt;rich&lt;/code&gt; como verdadeiro. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"&amp;lt;strong&amp;gt;Texto em negrito&amp;lt;/strong&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;rich&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, o texto mostrado na página será interpretado como HTML:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6vmp4j2ghoaks619520.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6vmp4j2ghoaks619520.png" alt="demonstração do Rich Text do KVision, transformando um texto com HTML como conteúdo em HTML"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando componentes
&lt;/h3&gt;

&lt;p&gt;Um componente é como se fosse uma tag HTML criada por nós mesmos. Onde podemos informar seu conteúdo, criar um estilo personalizado, misturar uma ou mais tags dentro de uma única,etc.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos criar um novo arquivo em &lt;code&gt;src/main/kotlin/com/kvision/kvision&lt;/code&gt; chamado &lt;code&gt;Cartão.kt&lt;/code&gt;. Esse arquivo terá algumas importações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.kvision.kvision&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.core.*&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.html.*&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.utils.*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, vamos criar uma função chamada &lt;code&gt;Cartão&lt;/code&gt; que será o nosso componente. A ídeía é criar um texto em negrito, com um fundo cinza. Formando como se fosse um retângulo. Primeiro, vamos criar a função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Cartão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Essa interface &lt;code&gt;Container&lt;/code&gt; foi usada pois todo componente (e tag HTML no KVision) precisa estar dentro dessa interface para ter alguns métodos e propriedades disponíveis;&lt;/li&gt;
&lt;li&gt;Recebemos uma variável &lt;code&gt;texto&lt;/code&gt;, que será o conteúdo do componente;&lt;/li&gt;
&lt;li&gt;o retorno &lt;code&gt;: Strong&lt;/code&gt; deixa claro que o elemento que iremos retornar será um elemento em negrito (&lt;code&gt;&amp;lt;strong&amp;gt;&amp;lt;/strong&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após isso, vamos criar o elemento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Cartão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elemento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cartão"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos o método &lt;code&gt;Strong()&lt;/code&gt;, que irá criar por sua vez, um elemento HTML &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Passamos apenas dois argumentos, sendo um &lt;code&gt;content&lt;/code&gt; que é o conteúdo do elemento, no caso será a variável &lt;code&gt;texto&lt;/code&gt;. E um &lt;code&gt;className&lt;/code&gt; que representa o nome da classe que poderá eventualmente ser usado em um arquivo CSS ou JS;&lt;/li&gt;
&lt;li&gt;Guardamos tudo isso em uma variável chamada &lt;code&gt;elemento&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, vamos fazer algumas modificações no estilo desse elemento, para criar assim o estilo de um cartão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Cartão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elemento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cartão"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#DDD"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;
    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fontSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Modificamos o estilo do elemento acessando diretamente essas propriedades, usando &lt;code&gt;.background&lt;/code&gt;, &lt;code&gt;.padding&lt;/code&gt;,etc. e definindo o valor dessas variáveis;&lt;/li&gt;
&lt;li&gt;Para definir o background, usamos dois métodos, sendo o &lt;code&gt;Background&lt;/code&gt;, que irá retornar o background, e um &lt;code&gt;Color&lt;/code&gt; que irá retornar uma cor. Dentro do color passamos a cor em forma de hexadecimal, sendo &lt;code&gt;#DDD&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Para definir valores em pixel, inserimos um número, seguido de um &lt;code&gt;.px&lt;/code&gt; indicando a unidade. Caso quissemos usar outra unidade como &lt;code&gt;vh&lt;/code&gt; ou &lt;code&gt;vw&lt;/code&gt;, apenas mudariamos o final, ficando &lt;code&gt;10.vw&lt;/code&gt; por exemplo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos terminar a função adicionando esse elemento ao Cartão e retornando esse elemento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Cartão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elemento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cartão"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#DDD"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;
    &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fontSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;elemento&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora já temos o componente pronto.&lt;/p&gt;

&lt;p&gt;Agora podemos usar o nosso componente &lt;code&gt;Cartão&lt;/code&gt; dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Cartão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Testando a criação de componentes"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Como você pode observar, usamos a função &lt;code&gt;Cartão&lt;/code&gt; como qualquer elemento HTML do KVision. Com esse código, a nossa página ficará assim:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3kl3ei3986ys9iqigig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3kl3ei3986ys9iqigig.png" alt="Demonstração do componente funcionando em nossa página"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Estilizando a nossa página
&lt;/h3&gt;

&lt;p&gt;Agora vamos começar a estilizar a nossa página, adicionando CSS usando o próprio KVision como meio para criar esse CSS.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos mudar a página para algo mais simples, que apenas mostra diversos textos em tamanhos diferentes e com tags diferentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto maior"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto menor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em negrito"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;br&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em itálico"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criamos um título com &lt;code&gt;h1&lt;/code&gt;, um subtítulo com &lt;code&gt;h2&lt;/code&gt;, um texto em negrito com &lt;code&gt;strong&lt;/code&gt;, quebramos a linha usando o &lt;code&gt;br&lt;/code&gt; (&lt;em&gt;Break Line&lt;/em&gt;), e ao final inserimos um texto em itálico com &lt;code&gt;i&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, vamos criar um arquivo chamado &lt;code&gt;estilo.kt&lt;/code&gt; em &lt;code&gt;src/main/kotlin/com/kvision/kvision&lt;/code&gt;. Esse arquivo irá armazenar os estilos que iremos aplicar.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos importar o KVision nesse arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.kvision.kvision&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.core.*&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.utils.*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos inserir primeiro o estilo do &lt;code&gt;h1&lt;/code&gt;. Isso pode ser feito definindo uma variável que irá armazenar esse estilo, usando uma classe &lt;code&gt;Style&lt;/code&gt;, e dentro dessa classe iremos colocar os estilos. Isso pode ser feito da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.kvision.kvision&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.core.*&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.utils.*&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;estiloH1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos a classe &lt;code&gt;Style&lt;/code&gt;, e dentro dela determinamos que a cor do texto desse estilo fosse azul, mudando a variável &lt;code&gt;color&lt;/code&gt;, atribuindo com o retorno de uma função chamada &lt;code&gt;Color&lt;/code&gt;, que gera uma cor baseada em um texto (código hexadecimal, nome,etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, vamos voltar ao arquivo &lt;code&gt;App.kt&lt;/code&gt; e vamos adicionar esse estilo ao nosso h1. Isso pode ser feito da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto maior"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;addCssStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estiloH1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto menor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em negrito"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;br&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em itálico"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Adicionamos ao corpo dessa função &lt;code&gt;h1&lt;/code&gt;, a função &lt;code&gt;addCssStyle&lt;/code&gt;. Que permite a adição de estilos ao elemento apenas informando a variável que está guardando o estilo, no caso sendo a &lt;code&gt;estiloH1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora a nossa página está com o h1 estilizado com a cor azul, dessa maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9beppebgh5z3ws3z2mnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9beppebgh5z3ws3z2mnx.png" alt="H1 estilizado usando KVision"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos agora seguir o mesmo padrão e estilizar cada elemento que criamos. Tente criar estilos para o &lt;code&gt;h2&lt;/code&gt;, &lt;code&gt;strong&lt;/code&gt; e &lt;code&gt;i&lt;/code&gt; sem ajuda primeiramente.&lt;/p&gt;




&lt;p&gt;Caso tenha ficado com algum problema, ou não teve idéias de como estililzar esses elementos, você pode seguir o exemplo abaixo de como ficaria o arquivo &lt;code&gt;estilo.kt&lt;/code&gt; ao final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.kvision.kvision&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.core.*&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kvision.utils.*&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;estiloH1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;estiloH2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#DDD"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;estiloStrong&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"green"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;estiloI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;padding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;estiloH2&lt;/code&gt; usamos a função &lt;code&gt;background&lt;/code&gt; para gerar um background para o elemento. Esse background no caso é um &lt;code&gt;Color&lt;/code&gt;, que representa uma cor. Essa cor sendo &lt;code&gt;#DDD&lt;/code&gt; que é um cinza bem claro.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;estiloStrong&lt;/code&gt; deixamos a cor do texto verde. O método foi o mesmo que usamos para o &lt;code&gt;estiloH1&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;estiloI&lt;/code&gt;, temos apenas um padding de 40 pixels, usando o método de colocar um número, um &lt;code&gt;.&lt;/code&gt; e a unidade de medida;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora apenas precisamos aplicar esses estilos na página. Podemos fazer isso da mesma forma que fizemos com o &lt;code&gt;h1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto maior"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;addCssStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estiloH1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nf"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto menor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;addCssStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estiloH2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nf"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em negrito"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;addCssStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estiloStrong&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nf"&gt;br&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"texto em itálico"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;addCssStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estiloI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora nossa página terá vários elementos com vários estilos diferentes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7044hhp1zij1by2wozec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7044hhp1zij1by2wozec.png" alt="Página inteira estilizada utilizando KVision"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Botões
&lt;/h3&gt;

&lt;p&gt;Para criar um botão no KVision, podemos usar a função &lt;code&gt;button&lt;/code&gt; e informar qual será o texto do botão, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Botão feito com KVision"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esse exemplo acima, o código gerado será:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9l4j5nzirpqbbuxqfki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9l4j5nzirpqbbuxqfki.png" alt="Botão feito com KVision"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos criar um botão com um estilo diferente, como um botão primário, segundário, botão de perigo,etc. Podemos mudar esse estilo passando um argumento &lt;code&gt;style&lt;/code&gt; ao botão. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Salvar alterações"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ButtonStyle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DANGER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Informando o &lt;code&gt;style&lt;/code&gt; sendo &lt;code&gt;ButtonStyle.DANGER&lt;/code&gt; vamos criar um botão que representa uma ação perigosa, que deve ser tomada com cuidado,etc. Ficando dessa maneira na tela:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzhwc4vjejjq4ryp352et.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzhwc4vjejjq4ryp352et.png" alt="Botão de perigo feito com KVision"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos também inserir uma ação que será feita quando esse botão for clicado. Isso pode ser feito adicionando um bloco &lt;code&gt;onClick&lt;/code&gt; para a função &lt;code&gt;button&lt;/code&gt;. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Salvar alterações"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ButtonStyle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DANGER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alterações salvas"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Dentro do &lt;code&gt;onClick&lt;/code&gt;, apenas mostramos no console que a alteração foi salva (apenas para ilustrar a funcionalidade). Isso pode ser feito usando a função &lt;code&gt;println&lt;/code&gt; que nesse contexto, irá mostrar algo no console do navegador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Há diversos estilos de botões que podem ser usados no KVision, sendo a lista completa sendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PRIMARY&lt;/li&gt;
&lt;li&gt;SECONDARY&lt;/li&gt;
&lt;li&gt;SUCCESS&lt;/li&gt;
&lt;li&gt;INFO&lt;/li&gt;
&lt;li&gt;WARNING&lt;/li&gt;
&lt;li&gt;DANGER&lt;/li&gt;
&lt;li&gt;LINK&lt;/li&gt;
&lt;li&gt;LIGHT&lt;/li&gt;
&lt;li&gt;DARK&lt;/li&gt;
&lt;li&gt;OUTLINEPRIMARY&lt;/li&gt;
&lt;li&gt;OUTLINESECONDARY&lt;/li&gt;
&lt;li&gt;OUTLINESUCCESS&lt;/li&gt;
&lt;li&gt;OUTLINEINFO&lt;/li&gt;
&lt;li&gt;OUTLINEWARNING&lt;/li&gt;
&lt;li&gt;OUTLINEDANGER&lt;/li&gt;
&lt;li&gt;OUTLINELIGHT&lt;/li&gt;
&lt;li&gt;OUTLINEDARK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tente mudar o estilo do botão que criamos se baseando na lista acima como exercício.&lt;/p&gt;

&lt;h3&gt;
  
  
  Containers de Layout
&lt;/h3&gt;

&lt;p&gt;Agora vamos usar um recurso chamado Containers de Layout (&lt;em&gt;Layout Containers&lt;/em&gt;), que são tags do KVision que criam div's com um comportamento diferente, como por exemplo uma div onde os elementos dentro dela podem ser modificados em seu tamanho. Ou uma div onde cada elemento representa uma aba,etc.&lt;/p&gt;

&lt;p&gt;Vamos ver por exemplo o &lt;code&gt;splitPanel&lt;/code&gt;. Essa função irá criar um painel que o tamanho das áreas de dentro desse painel podem ser reajustadas pelo usuário. Esse painel pode ser criado da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;splitPanel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeira área"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segunda área"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos o &lt;code&gt;splitPanel&lt;/code&gt; como se fosse uma tag do KVision;&lt;/li&gt;
&lt;li&gt;Dentro dela, inserimos duas div's apenas para demonstrar o funcionamento, contendo apenas um texto;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o código acima, a nossa página ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqhhqc7biok23td7rgkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqhhqc7biok23td7rgkr.png" alt="Demonstração do Split Panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa barra vertical pode mudar o tamanho de cada seção desses elementos, criando mais interação com a pessoa usuária.&lt;/p&gt;

&lt;p&gt;Podemos também criar um &lt;em&gt;Tab Panel&lt;/em&gt; que é um layout em abas, mostrando um elemento filho por vez. Pode ser criado dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kvapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;tabPanel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Primeira aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conteúdo da primeira aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nf"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segunda aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conteúdo da segunda aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nf"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Terceira aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conteúdo da terceira aba"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A função usada para criar o painel é a &lt;code&gt;tabPanel&lt;/code&gt;, onde iremos colocar os elementos do painel dentro;&lt;/li&gt;
&lt;li&gt;Cada aba do painel é criada usando a função &lt;code&gt;tab&lt;/code&gt;, que representa a aba;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com esse código, o resultado será:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi57dipnmfimyd4jy1ct7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi57dipnmfimyd4jy1ct7.png" alt="Demonstração do Tab Panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Há outros painéis que podem ser usados no KVision, mas esses dois são ótimos exemplos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Nesse artigo vimos algumas funcionalidades interessantes do KVision, e como criamos HTML, CSS e Javascript com Kotlin. Tente criar um site simples usando KVision, como um portifólio ou algo do tipo.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda" rel="noopener noreferrer"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Usando Ktor com Docker</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Tue, 28 Dec 2021 04:58:02 +0000</pubDate>
      <link>https://forem.com/kotlinautas/usando-ktor-com-docker-29af</link>
      <guid>https://forem.com/kotlinautas/usando-ktor-com-docker-29af</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" alt="capa Kotlinautas" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais
&lt;/h2&gt;

&lt;p&gt;Será necessário ter o &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; instalado na máquina e alguma aplicação para praticar. Tanto pode ser alguma aplicação sua, quanto alguma que você encontrar. Caso não tenha idéia de qual aplicação usar para praticar, sugiro usar a &lt;a href="https://github.com/Kotlinautas/KTasks"&gt;KTasks&lt;/a&gt;, uma aplicação criada pela &lt;a href="https://twitter.com/lissadev_"&gt;Lissa Ferreira&lt;/a&gt; e pelo &lt;a href="https://twitter.com/Kastrowalker/"&gt;KastroWalker&lt;/a&gt; em um workshop para a Codecon 2021.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é Docker?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; É um software que permite criar imagens de outros softwares, como aplicações Ktor. Facilitando o processo de criação de Containers, agrupando todas as dependências e instruções para rodar um software. Com isso, podemos colocar nossas aplicações Ktor nesses conteiners, facilitando por exemplo o &lt;em&gt;deploy&lt;/em&gt; dessa aplicações na nuvem por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é o Dockerfile?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Dockerfile&lt;/em&gt; é o arquivo do Docker onde está as instruções para criar esse container Docker, por isso vamos criar esse arquivo neste artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shadow
&lt;/h2&gt;

&lt;p&gt;Precisamos antes, adicionar o Shadow á aplicação que estamos trabalhando. Sobre o Shadow, a Kotlinautas tem um arquivo exclusivo para esse tema, chamado &lt;a href="https://dev.to/kotlinautas/usando-shadow-em-um-projeto-kotlin-17ln"&gt;Usando Shadow em um projeto Kotlin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Toda vez que você criar ou atualizar um container (com a aplicação já pronta), é necessário usar o Shadow para compactar toda a aplicação dentro de um único JAR, com a task do Gradle &lt;code&gt;shadowjar&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o Dockerfile
&lt;/h2&gt;

&lt;p&gt;Para criar esse &lt;em&gt;Dockerfile&lt;/em&gt; vamos na pasta da nossa aplicação, e vamos criar um arquivo chamado &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nesse arquivo, vamos usar o Alpine com o sistema operacional do container. É um sistema bem leve e muito utilizado para criar containers. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:3.14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso vamos instalar o openjdk no container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:3.14
RUN apk update &amp;amp;&amp;amp; apk add openjdk11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos criar um diretório chamado &lt;code&gt;microservices&lt;/code&gt; dentro do container, para iniciar o container dentro desse diretório.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:3.14
RUN apk update &amp;amp;&amp;amp; apk add openjdk11
RUN mkdir /aplicacao/
WORKDIR /aplicacao/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos copiar o JAR gerado pelo Shadow nesse novo diretório. O nome desse JAR depende da sua aplicação, logo, mude esse nome no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:3.14
RUN apk update &amp;amp;&amp;amp; apk add openjdk11
RUN mkdir /aplicacao/
WORKDIR /aplicacao/
COPY build/libs/[ARQUIVO JAR DA APLICAÇÃO] .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, use o comando &lt;code&gt;CMD&lt;/code&gt; para rodar o arquivo JAR da aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:3.14
RUN apk update &amp;amp;&amp;amp; apk add openjdk11
RUN mkdir /aplicacao/
WORKDIR /aplicacao/
COPY build/libs/[ARQUIVO JAR DA APLICAÇÃO] .
CMD ["java", "-jar", "[ARQUIVO JAR DA APLICAÇÃO]"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gerando o container
&lt;/h2&gt;

&lt;p&gt;Para gerar o container da aplicação, podemos usar o comando &lt;code&gt;docker build&lt;/code&gt;, esse comando irá executar nosso &lt;em&gt;Dockerfile&lt;/em&gt;, gerando a imagem da aplicação.&lt;/p&gt;

&lt;p&gt;Logo, na pasta da nossa aplicação (que também está o Dockerfile), execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t minha-aplicacao .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, o output desse comando será algo parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sending build context to Docker daemon  86.17MB
Step 1/6 : FROM alpine:3.14
 ---&amp;gt; 14119a10abf4
Step 2/6 : RUN apk update &amp;amp;&amp;amp; apk add openjdk11
 ---&amp;gt; Using cache
 ---&amp;gt; 1de39c8424ab
Step 3/6 : RUN mkdir /aplicacao/
 ---&amp;gt; Using cache
 ---&amp;gt; bfdd62868475
Step 4/6 : WORKDIR /aplicacao/
 ---&amp;gt; Using cache
 ---&amp;gt; e6805f21228f
Step 5/6 : COPY build/libs/com.microservices.user-microservices-0.0.1-all.jar .
 ---&amp;gt; Using cache
 ---&amp;gt; 4ed056dbe9f6
Step 6/6 : CMD ["java", "-jar", "com.microservices.user-microservices-0.0.1-all.jar"]
 ---&amp;gt; Using cache
 ---&amp;gt; 89ec77f86456
Successfully built 89ec77f86456
Successfully tagged minha-aplicacao:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Executando a aplicação no Docker
&lt;/h2&gt;

&lt;p&gt;Para executar o container que você criou no Docker, use o comando &lt;code&gt;docker run&lt;/code&gt;, caso a sua aplicação exteja expondo alguma porta, use a opção &lt;code&gt;-p&lt;/code&gt; para definir a porta, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run minha-aplicacao -p 4500:4500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A porta do exemplo deve ser mudada para a porta que você definiu na sua aplicação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Publicando a sua aplicação no DockerHub (Opicional)
&lt;/h2&gt;

&lt;p&gt;Caso você queria, você pode publicar essa sua imagem em uma plataforma chamada &lt;a href="https://hub.docker.com/"&gt;DockerHub&lt;/a&gt;, com isso a sua imagem ficará pública (ou privada), e poderá ser usada em oquestradores de containers como Kubernetes, Nomad,etc.&lt;/p&gt;

&lt;p&gt;Para fazer isso, primeiramente crie uma conta nessa plataforma, e execute o comando &lt;code&gt;docker login&lt;/code&gt; para logar na plataforma.&lt;/p&gt;

&lt;p&gt;Após isso, faça uma build da sua imagem, mas com o nome da imagem da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[SEU USUÁRIO DOCKERHUB]/[NOME DA IMAGEM]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lissaferreira/user-microservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, use o comando &lt;code&gt;docker push&lt;/code&gt; para publicar sua imagem, da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker push [SEU USUÁRIO DOCKERHUB]/[NOME DA IMAGEM]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker push lissaferreira/user-microservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! Com isso sua imagem estará publicada no DockerHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Neste artigo você aprendeu a criar a build da sua aplicação Ktor, para assim, poder fornecer a sua aplicação em forma de containers.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>docker</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como usar Elvis Operator</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Mon, 20 Dec 2021 04:40:29 +0000</pubDate>
      <link>https://forem.com/kotlinautas/como-usar-elvis-operator-p2</link>
      <guid>https://forem.com/kotlinautas/como-usar-elvis-operator-p2</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/" rel="noopener noreferrer"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" alt="capa Kotlinautas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é &lt;em&gt;Null Safety&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;Kotlin é uma linguagem que utiliza vários recursos de outras linguagens, e também melhoramentos, principalmente em relação ao Java.&lt;/p&gt;

&lt;p&gt;Muitas pessoas que já programaram Java, tiveram problemas bem chatos envolvendo &lt;strong&gt;NullPointerExeception&lt;/strong&gt;, que é um erro que ocorre quando tentamos usar uma propriedade de uma classe que tem seu valor como &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A linguagem Kotlin tenta ao máximo evitar esse tipo de problema. Adicionando garantias que o seu código DEVE ser seguro á erros envolvendo instâncias de classes, variáveis, propriedades,etc. que podem ser nulas.&lt;/p&gt;

&lt;p&gt;Para poder utilizar uma propriedade que pode ser nula, é necessário ou fazer o tratamento caso essa variável seja um erro, ou usando &lt;code&gt;!!&lt;/code&gt; para dizer ao Kotlin que você tem certeza que não terá nenhum erro relacionado. Como no exemplo abaixo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;No exemplo acima, &lt;code&gt;usuario&lt;/code&gt; pode ser uma variável nula, e por conta disso foi usado o símbolo &lt;code&gt;!!&lt;/code&gt;, deixando claro ao Kotlinque temos certeza que essa variável não é &lt;code&gt;null&lt;/code&gt;. Caso seja &lt;code&gt;null&lt;/code&gt;, um erro vai ser lançado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos também como foi citado acima, tratar esse erro, buscando evitar o problema de termos um erro indesejado na nossa aplicação. E esse tratamento pode ser feito usando &lt;em&gt;Elvis Operator&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é &lt;em&gt;Elvis Operator&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Elvis Operator&lt;/em&gt; (?:) é um operador que podemos usar junto da propriedade ou variável que pode ter &lt;em&gt;null&lt;/em&gt; como seu valor. da seguinte maneira:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;

&lt;span class="n"&gt;repositorioPostagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encontrar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Usamos um exemplo comum, um sistema onde precisamos pegar uma postagem (ou qualquer outro item que está guardado dentro do banco de dados), e caso essa postagem com esse ID &lt;code&gt;10&lt;/code&gt; não seja encontrada, iremos usar o tratamento no &lt;em&gt;Elvis Operator&lt;/em&gt; (que por enquanto não existe)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Elvis Operator&lt;/em&gt; tem esse formato de &lt;code&gt;?:&lt;/code&gt; por conta que parece com o cabelo do Elvis Presley.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A expressão á direita do &lt;em&gt;Elvis Operator&lt;/em&gt; representa o quê vamos fazer caso essa propriedade ou variável seja nula. Podemos por exemplo, retornar a função:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;pegarTituloDaPostagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;repositorioPostagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encontrar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;titulo&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"postagem não encontrada"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Temos uma função que irá retornar o título de uma postagem. Caso a postagem não seja encontrada, a postagem será &lt;code&gt;null&lt;/code&gt;, com isso o &lt;em&gt;Elvis Operator&lt;/em&gt; irá fazer que a string &lt;code&gt;postagem não encontrada&lt;/code&gt; seja retornada, pois não há nenhuma postagem relacionada com esse ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse exemplo é simples, mas há situações em que é realmente necessário usar um &lt;em&gt;Elvis Operator&lt;/em&gt; para garantir que o seu código não vai dar nenhum erro inesperado, pois como o próprio nome diz, não tem como planejar quando um erro inesperado irá acontecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Neste artigo você aprendeu como utilizar o &lt;em&gt;Elvis Operator&lt;/em&gt; para tornar seu código mais legível e com melhor tratamento de erros. Evitando erros inesperados, deixando sua aplicação mais resiliente.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda" rel="noopener noreferrer"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>HTTP4K como cliente HTTP</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Sun, 28 Nov 2021 22:47:31 +0000</pubDate>
      <link>https://forem.com/kotlinautas/http4k-como-cliente-http-3cf3</link>
      <guid>https://forem.com/kotlinautas/http4k-como-cliente-http-3cf3</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" alt="capa Kotlinautas" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP4K
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.http4k.org/"&gt;HTTP4K&lt;/a&gt; é uma biblioteca feita em Kotlin para receber e fazer requisições HTTP. A principal vantagem do HTTP4K para criar servidores e clientes HTTP é que com poucas linhas conseguimos ter o básico de uma aplicação pronta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais
&lt;/h2&gt;

&lt;p&gt;Será necessário ter o &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; instalado na máquina e um conhecimento básico sobre a linguagem &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o projeto
&lt;/h2&gt;

&lt;p&gt;Abra seu IntelliJ no menu inicial e clique em &lt;em&gt;New Project&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XGVMKcDl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/awa9p4srmnbwucltkq2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XGVMKcDl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/awa9p4srmnbwucltkq2h.png" alt="botão New Project no menu inicial do IntelliJ" width="433" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois, selecione a opção &lt;strong&gt;Kotlin DSL build script&lt;/strong&gt;, selecione também a opção &lt;strong&gt;Kotlin/JVM&lt;/strong&gt;, e opicionalmente remova a primeira opção &lt;strong&gt;Java&lt;/strong&gt;. Essa opção não vai mudar em nada, pois ela dá suporte do Gradle á linguagem Java, mas apenas iremos usar Kotlin.&lt;/p&gt;

&lt;p&gt;Após isso, clique em &lt;strong&gt;Next&lt;/strong&gt; e escreva o nome do projeto e a localização na sua máquina. Essas duas opção são completamente pessoais, caso não tenha nenhuma ideia, coloque algo como &lt;strong&gt;http4k&lt;/strong&gt; apenas como identificação.&lt;/p&gt;

&lt;p&gt;Agora, com o projeto aberto, vá ao aquivo &lt;code&gt;build.gradle.kts&lt;/code&gt; e vamos adicionar as dependências do HTTP4K, com a seção &lt;code&gt;dependencies&lt;/code&gt; ficando assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.http4k:http4k-bom:4.14.1.0"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.http4k:http4k-core"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, clique no elefante no canto superior direito para carregar as alterações no Gradle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LWOdprTZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3innsslmf0azv3ddoxze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LWOdprTZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3innsslmf0azv3ddoxze.png" alt="Elefante do Gradle no canto superior direito" width="245" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, poderemos começar a programar. Você pode criar um arquivo em &lt;code&gt;src/main/kotlin/&lt;/code&gt; chamado &lt;code&gt;main.kt&lt;/code&gt; para ser o arquivo principal da aplicação.&lt;/p&gt;

&lt;p&gt;Mas com qualquer nome de arquivo, como você irá usar as corotinas, sempre se lembre de importar a biblioteca de corotinas no começo do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.http4k.client.JavaHttpClient&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.http4k.core.HttpHandler&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.http4k.core.Method&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.http4k.core.Request&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando um cliente HTTP
&lt;/h2&gt;

&lt;p&gt;Para enviar uma requisição HTTP, e mostrar o resultado dessa requisição na tela, temos o código de exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;requisição&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://xkcd.com/info.0.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;HttpHandler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;JavaHttpClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;respostaRequisição&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requisição&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;respostaRequisição&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos uma classe &lt;code&gt;Request&lt;/code&gt; para criar um objeto que represente a requisição. Nesse objeto, passamos o método e a URL dessa requisição;&lt;/li&gt;
&lt;li&gt;Criamos uma variável &lt;code&gt;cliente&lt;/code&gt; que recebe um cliente nativo do HTTP4K, que é o &lt;code&gt;JavaHttpClient&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Executamos a requisição com &lt;code&gt;cliente(requisição)&lt;/code&gt;, guardando todos os dados da resposta dessa requisição na variável &lt;code&gt;respostaRequisição&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Mostramos o resultado dessa requisição na última linha com &lt;code&gt;println&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Executando esse código, teremos todos os dados sobre a resposta dessa requisição na tela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;HTTP&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="n"&gt;accept-ranges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;cache-control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;max-age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keep-alive&lt;/span&gt;
&lt;span class="n"&gt;content-length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;382&lt;/span&gt;
&lt;span class="n"&gt;content-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Wed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt; &lt;span class="nc"&gt;Oct&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt; &lt;span class="nc"&gt;GMT&lt;/span&gt;
&lt;span class="n"&gt;etag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"615bc0f5-17e"&lt;/span&gt;
&lt;span class="n"&gt;expires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Wed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt; &lt;span class="nc"&gt;Oct&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt; &lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="nc"&gt;GMT&lt;/span&gt;
&lt;span class="n"&gt;last-modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Tue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt; &lt;span class="nc"&gt;Oct&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="nc"&gt;GMT&lt;/span&gt;
&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt;
&lt;span class="n"&gt;vary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Accept-Encoding&lt;/span&gt;
&lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="n"&gt;varnish&lt;/span&gt;
&lt;span class="n"&gt;x-cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;HIT&lt;/span&gt;
&lt;span class="n"&gt;x-cache-hits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;x-served-by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cache-gig17025-GIG&lt;/span&gt;
&lt;span class="n"&gt;x-timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;S1633487196&lt;/span&gt;&lt;span class="mf"&gt;.752074&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;VS0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;VE392&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"num"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2524&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"2021"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"news"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"safe_title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Comet Visitor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"transcript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"alt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"It's a myth that the Great Wall of China is the only human-made structure visible from space--there are LOTS of structures for us to feel self-conscious about!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"img"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"https://imgs.xkcd.com/comics/comet_visitor.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Comet Visitor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"day"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos acessar algumas informações usando as propriedades contidas dentro da variável &lt;code&gt;respostaRequisição&lt;/code&gt;, caso você queira pegar o status da requsição, pode ser usada a opção &lt;code&gt;respostaRequisição.status&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;requisição&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://xkcd.com/info.0.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;HttpHandler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;JavaHttpClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;respostaRequisição&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requisição&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;respostaRequisição&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado desse código será o status da resposta da requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A mesma coisa pode ser feita para outras propriedades, como o corpo da resposta (&lt;code&gt;respostaRequisição.body&lt;/code&gt;), os cabeçalhos da resposta (&lt;code&gt;respostaRequisição.headers&lt;/code&gt;),etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Esse é o básico sobre corotinas no Kotlin. Há muito mais detalhes e conteúdos que podem ser abordados, mas para um artigo introdutório isso já é suficiente.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>backend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>5 dicas e um bônus para deixar seu código Kotlin melhor</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Sun, 21 Nov 2021 21:41:41 +0000</pubDate>
      <link>https://forem.com/kotlinautas/5-dicas-e-um-bonus-para-deixar-seu-codigo-kotlin-melhor-48el</link>
      <guid>https://forem.com/kotlinautas/5-dicas-e-um-bonus-para-deixar-seu-codigo-kotlin-melhor-48el</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" alt="capa Kotlinautas" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Créditos
&lt;/h2&gt;

&lt;p&gt;Esse artigo foi baseado principalmente &lt;a href="https://speakerdeck.com/antonarhipov/idiomatic-kotlin-2nd-edition"&gt;nesses slides&lt;/a&gt; do &lt;a href="https://twitter.com/antonarhipov/"&gt;Anton Arhipov&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é Kotlin Ideomático?
&lt;/h2&gt;

&lt;p&gt;Kotlin Ideomático é uma maneira de escrever Kotlin tentando seguir os melhores padrões e funcionalidades da linguagem. Buscando tornar o código mais legível e menor.&lt;/p&gt;

&lt;p&gt;Há uma &lt;a href="https://kotlinlang.org/docs/idioms.html"&gt;página oficial&lt;/a&gt; da documentação do Kotlin apenas para listar diversas formas ideomáticas de fazer coisas. Caso saiba um pouco de inglês, é interessante ler esse documento. Neste artigo vamos abordar apenas algumas formas ideomáticas de se usar Kotlin, mas nessa página há uma quantidade bem maior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando funções sem classes
&lt;/h2&gt;

&lt;p&gt;Muitas pessoas que migram do Java para o Kotlin, continuam com o costume de criar uma classe toda vez que precisarem criar uma ou mais funções, mas isso não é necessário no Kotlin, pois podemos criar funções sem precisar de uma classe associada, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="nf"&gt;olaMundo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;olaMundo&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criamos uma função &lt;code&gt;olaMundo&lt;/code&gt;, que mostra o texto &lt;code&gt;Olá Mundo!&lt;/code&gt; na tela;&lt;/li&gt;
&lt;li&gt;Chamamos essa função dentro da &lt;code&gt;main&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extensões
&lt;/h2&gt;

&lt;p&gt;Sabe aquelas funções &lt;code&gt;.toInt&lt;/code&gt;, &lt;code&gt;.equals&lt;/code&gt;,etc. que podemos usar em tipos do Kotlin? Podemos adicionar novas funções completamente feitas por nós á esses tipos, usando as extensões.&lt;/p&gt;

&lt;p&gt;Vamos supor que você quer criar uma função chamada &lt;code&gt;ÉNumero&lt;/code&gt; que irá checar se uma &lt;em&gt;string&lt;/em&gt; é um número ou não. Essa função seria executada da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="s"&gt;"isso não é um número"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ÉNumero&lt;/span&gt;
&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ÉNumero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode ser feito criando a função &lt;code&gt;ÉNumero&lt;/code&gt; dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ÉNumero&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isDigit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Passamos o tipo, no caso &lt;code&gt;String&lt;/code&gt;, seguido de um &lt;code&gt;.&lt;/code&gt; e o nome da função, que no caso é &lt;code&gt;ÉNumero&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;all&lt;/code&gt; irá testar se todos os caracteres do texto conseguem passar de uma certa condição, que no caso é se esse caractere é um dígito usando a função &lt;code&gt;isDigit&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após isso, podemos utilizar essa função em qualquer lugar do nosso código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ÉNumero&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abracadabra"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ÉNumero&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de escopo
&lt;/h2&gt;

&lt;p&gt;Funções de escopo são funções axuliares que executam um código com o contexto de um objeto. Isso significa que essas funções criam um escopo temporário, onde poderemos usar todas as propriedades de um objeto sem precisar informar esse projeto. Caso tenha tido alguma confusão, vamos ver na prática.&lt;/p&gt;

&lt;p&gt;Vamos supor que temos uma classe &lt;code&gt;Estrela&lt;/code&gt;, com as propriedades &lt;code&gt;nome&lt;/code&gt;, &lt;code&gt;diâmetro&lt;/code&gt;, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Estrela&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;diâmetro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;numeroDePlanetas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos criar uma variável que guarde uma instância, e mudar as propriedades dessa variável. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;sol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Estrela&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"sol"&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diâmetro&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1392700&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numeroDePlanetas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código irá funcionar, mas não está sendo ideomático, pois estamos repetindo a variável &lt;code&gt;sol&lt;/code&gt; diversas vezes. Podemos escrever esse código de uma maneira mais bonita como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;sol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Estrela&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"sol"&lt;/span&gt;
        &lt;span class="n"&gt;diâmetro&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1392700&lt;/span&gt;
        &lt;span class="n"&gt;numeroDePlanetas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos a função &lt;code&gt;apply&lt;/code&gt; do Kotlin, que irá receber um objeto (no caso uma instância de &lt;code&gt;Estrela&lt;/code&gt;) e irá fazer alterações com esse objeto em seu contexto. No caso, definindo valores de propriedades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessa maneira, nosso código estará mais consiso, legível, e ideomático.&lt;/p&gt;

&lt;p&gt;Há outras funções de escopo, essas outras funções podem ser vistas &lt;a href="https://kotlinlang.org/docs/scope-functions.html"&gt;Nessa página da documentação do Kotlin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Argumentos Padrão e Argumentos Nomeados
&lt;/h2&gt;

&lt;p&gt;Vamos supor que temos a seguinte função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun saudações(nome: String, momento: String){
    println("Olá $nome! $momento")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa função está recebendo um &lt;code&gt;nome&lt;/code&gt;, como &lt;code&gt;Pedro&lt;/code&gt; ou &lt;code&gt;Maria&lt;/code&gt;, e momento recebe uma saudação do dia, como &lt;code&gt;boa tarde&lt;/code&gt; ou &lt;code&gt;boa noite&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas vamos pensar: Na maior parte das vezes, damos &lt;code&gt;bom dia&lt;/code&gt; para as pessoas, e menos vezes damos &lt;code&gt;boa tarde&lt;/code&gt; ou &lt;code&gt;boa noite&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Logo, podemos mudar a função e fazer que esse &lt;code&gt;momento&lt;/code&gt; tenha um valor padrão usando um &lt;code&gt;=&lt;/code&gt; depois de seu tipo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun saudações(nome: String, momento: String = "Bom Dia!"){
    println("Olá $nome! $momento")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E além, e se essa pessoa não quiser passar seu nome? Podemos deixar &lt;code&gt;Pessoa Anônima&lt;/code&gt; como valor padrão, da mesma forma que dizemos com &lt;code&gt;momento&lt;/code&gt;. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun saudações(nome: String = "Pessoa Anônima", momento: String = "Bom Dia!"){
    println("Olá $nome! $momento")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, podemos chamar essa função &lt;code&gt;saudações&lt;/code&gt; de algumas formas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nf"&gt;saudações&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;saudações&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;saudações&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pedro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Boa Noite!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Olá Pessoa Anônima! Bom Dia!
Olá Maria! Bom Dia!
Olá Pedro! Boa Noite!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;E se eu quiser deixar o argumento &lt;code&gt;nome&lt;/code&gt; padrão, e mudar só a mensagem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso pode ser feito nomeando o argumento &lt;code&gt;momento&lt;/code&gt; na chamada, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nf"&gt;saudações&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;momento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Boa Tarde!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Olá Pessoa Anônima! Boa Tarde!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de única expressão
&lt;/h2&gt;

&lt;p&gt;Vamos supor que temos uma função &lt;code&gt;testarTemperatura&lt;/code&gt; que recebe uma temperatura em &lt;em&gt;String&lt;/em&gt; e diz se é possível tomar uma bebida nessa temperatura ou não:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;testarTemperatura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperatura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperatura&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="s"&gt;"quente"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Quente demais para beber"&lt;/span&gt;
        &lt;span class="s"&gt;"frio"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Temperatura boa para beber"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Preciso deixar um pouco na geladeira"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa função tem apenas uma única expressão, um único comando em seu corpo. logo, podemos simplificar essa função, removendo seu corpo e seu retorno e adicionando um &lt;code&gt;=&lt;/code&gt; seguido pela expressão.&lt;/p&gt;

&lt;p&gt;Dessa maneira, nossa função ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;testarTemperatura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperatura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperatura&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="s"&gt;"quente"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Quente demais para beber"&lt;/span&gt;
        &lt;span class="s"&gt;"frio"&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;  &lt;span class="s"&gt;"Temperatura boa para beber"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Preciso deixar um pouco na geladeira"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa maneira, nossa função ficará bem menor, consisa e legível, essas são as &lt;a href="https://kotlinlang.org/docs/functions.html#single-expression-functions"&gt;funções de única expressão&lt;/a&gt;, a mesma coisa que fizemos com o &lt;code&gt;when&lt;/code&gt; pode ser feita com &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;try&lt;/code&gt;,etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador Elvis
&lt;/h2&gt;

&lt;p&gt;Vamos supor que temos uma classe &lt;code&gt;Cachorro&lt;/code&gt;, essa toda instância de &lt;code&gt;Cachorro&lt;/code&gt; tem um nome, raça (que pode ser &lt;code&gt;null&lt;/code&gt; caso esse cachorro seja vira-lata) e uma propriedade &lt;code&gt;educado&lt;/code&gt;. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cachorro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;raça&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;educado&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Junto com essa classe, temos uma função &lt;code&gt;apresentarCachorro&lt;/code&gt; que irá receber uma instância dessa classe &lt;code&gt;Cachorro&lt;/code&gt;, e caso esse cachorro seja de raça, e a sua raça não seja &lt;code&gt;null&lt;/code&gt;, o seu nome e raça serão mostrados na tela jutn ocom uma mensagem. Normalmente, fariamos dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;apresentarCachorro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Cachorro&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raça&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;raça&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raça&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;educado&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Au Au Au, meu nome é $nome e sou da raça $raça, Au Au Au"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código pode ser melhorado. Podemos remover o primeiro if que testa se a raça do cachorro é null ou não. Podemos colocar esse teste direto na definição da variável &lt;code&gt;raça&lt;/code&gt;, dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;apresentarCachorro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Cachorro&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;raça&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raça&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;educado&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Au Au Au, meu nome é $nome e sou da raça $raça, Au Au Au"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, usamos o operador Elvis (&lt;code&gt;?:&lt;/code&gt;), onde se o valor da esquerda for &lt;code&gt;null&lt;/code&gt;, o código da direita será executado. No caso, é o &lt;code&gt;return&lt;/code&gt; que irá fechar a função sem nenhum conteúdo no retorno.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Nesse artigo, você aprendeu 6 dicas de como deixar o seu código Kotlin mais ideomático, consiso e legível. Busque aplicar os conceitos mostrados nesse artigo (e em outros sobre Kotlin Ideomático que podem existir) em seus projetos, pois assim seu código ficará bem melhor.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>jetbrains</category>
      <category>backend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Criando variáveis no Kotlin - Explorando a documentação</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Mon, 15 Nov 2021 02:21:59 +0000</pubDate>
      <link>https://forem.com/kotlinautas/criando-variaveis-no-kotlin-explorando-a-documentacao-4a4g</link>
      <guid>https://forem.com/kotlinautas/criando-variaveis-no-kotlin-explorando-a-documentacao-4a4g</guid>
      <description>&lt;p&gt;Pensando em formas diferentes de aproximar a comunidade da documentação do Kotlin, darei início a uma série de postagens para traduzir o conteúdo dessa documentação. Fiquem a vontade para compartilhar seus feedbacks e complementar o conteúdo.&lt;/p&gt;

&lt;p&gt;De qualquer forma, ainda que você já esteja trabalhando com kotlin, aconselho a consultar a documentação sempre que puder. Muitas das vezes, existem recursos da linguagem que facilitam nosso dia a dia, mas por costume de outras linguagens de programação com as quais já trabalhamos, temos a tendência de estruturar o código da forma como conhecemos até então.&lt;/p&gt;

&lt;p&gt;Vamos dar os primeiros passos?&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fex5bu69g7ledxr5tclmj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fex5bu69g7ledxr5tclmj.gif" alt="gif bruxa subindo em uma vassoura dizendo " width="498" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se ainda não conhece a documentação, você pode consultar o conteúdo por &lt;a href="https://kotlinlang.org/docs/home.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;. Ela está em inglês e não existe, até o momento, uma tradução oficial para outras línguas, como o português.&lt;/p&gt;

&lt;p&gt;Dentro do tópico &lt;em&gt;&lt;a href="https://kotlinlang.org/docs/basic-syntax.html" rel="noopener noreferrer"&gt;Basic Syntax&lt;/a&gt;&lt;/em&gt;, que seria a Sintaxe Básica, estão os primeiros tópicos da linguagem. Vamos iniciar aqui pelas &lt;a href="https://kotlinlang.org/docs/basic-syntax.html#variables" rel="noopener noreferrer"&gt;variáveis&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  Variáveis
&lt;/h1&gt;

&lt;p&gt;Variáveis são utilizadas para guardar valores durante a execução do nosso código. Esses valores podem ser apenas de leitura, ou seja, não podemos alterá-lo durante a execução do programa. Mas também podem ser mutáveis, ou seja, podem mudar de valor durante o processamento e de acordo com a necessidade.&lt;/p&gt;

&lt;p&gt;No Kotlin, as variáveis de leitura, as chamadas &lt;em&gt;read-only&lt;/em&gt; em inglês, são definidas no código quando utilizamos a palavra-chave &lt;strong&gt;val&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para variáveis que podem ter seu valor alterado durante a execução de um programa, utilizamos a palavra-chave &lt;strong&gt;var&lt;/strong&gt; para sua criação no código.&lt;/p&gt;

&lt;p&gt;Para facilitar, você pode associar a origem das palavras-chaves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;val&lt;/strong&gt;: &lt;em&gt;value&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;var&lt;/strong&gt;: &lt;em&gt;variable&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vejamos os exemplos a seguir.&lt;/p&gt;
&lt;h2&gt;
  
  
  Variáveis somente leitura
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo declarado e receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;No trecho de código abaixo, estamos criando uma variável apenas de leitura chamada "a". Seu tipo é Int, ou seja, ela recebe valores que são números inteiros. E foi declarada com o valor 1.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/e53Je697Aq?from=2&amp;amp;to=3"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo não declarado e receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;Quando atribuímos um valor diretamente a uma variável, o Kotlin entende qual será o seu tipo. No caso abaixo, o tipo é Int, pois recebeu o valor 1, que é um número inteiro.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/3zXo0Rau2?from=2&amp;amp;to=3"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo declarado e não receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;No caso abaixo, a variável foi criada e, só durante a execução do programa, ela receberá um valor. Não necessariamente precisa ter uma atribuição diretamente em sua criação.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/KjTUxNuiC?from=2&amp;amp;to=3"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma variável de leitura não poderá ter seu valor alterado:
&lt;/h3&gt;

&lt;p&gt;No caso abaixo, se você executar o código, verá que retornará um erro dizendo &lt;em&gt;Val cannot be reassigned&lt;/em&gt;, ou seja, a variável declarada como somente leitura não poderá ter um novo valor atribuído.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/BKUI0ABeA?"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis mutáveis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo declarado e receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;No trecho de código abaixo, estamos criando uma variável mutável chamada "a". Seu tipo é Int, ou seja, ela recebe valores que são números inteiros. E foi inicializada com o valor 1. Posteriormente, teve seu valor alterado para 2, pois é var.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/6wTZ10Mab?"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo não declarado e receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;Quando atribuímos um valor diretamente a uma variável, o Kotlin entende qual será o seu tipo. No caso abaixo, o tipo é Int, pois recebeu o valor 1, que é um número inteiro. E, por ser var, teve seu valor alterado para 2 sem problemas.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/9hAwY5Gk-P?"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma variável pode ter seu tipo declarado e não receber uma atribuição durante a sua criação:
&lt;/h3&gt;

&lt;p&gt;No caso abaixo, a variável foi criada e, só durante a execução do programa, ela receberá um valor. Não necessariamente precisa ter uma atribuição diretamente em sua criação.&lt;br&gt;
&lt;iframe src="https://pl.kotl.in/vI0uFRfTz?"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Mundo real
&lt;/h2&gt;

&lt;p&gt;Precisamos avaliar e entender um contexto para tomar uma decisão entre deixar uma variável como mutável ou como somente leitura. Tudo depende da necessidade e dos requisitos que estamos atendendo, além de pontos de controle e de segurança que podem ser importantes em nosso código.&lt;br&gt;
Normalmente, uma variável é criada como &lt;strong&gt;val&lt;/strong&gt;, impedindo alterações diretas de seu valor. E, se houver necessidade, alteramos para &lt;strong&gt;var&lt;/strong&gt; durante o desenvolvimento de um projeto.&lt;br&gt;
Contudo, além disso, também avaliamos a necessidade de uma variável ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uma constante;&lt;/li&gt;
&lt;li&gt;local, que atenda apenas a um escopo;&lt;/li&gt;
&lt;li&gt;global, que esteja disponível a todo o projeto;&lt;/li&gt;
&lt;li&gt;uma propriedade, controlando de acordo com o modificador de acesso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pontos extremamente importantes e que abordaremos no próximo artigo.&lt;/p&gt;

&lt;p&gt;Caso tenha algo a acrescentar, sugestões ou queira tirar alguma dúvida, fique a vontade para enviar nos comentários. Até a próxima!&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Criando testes unitários com Kotest</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Mon, 08 Nov 2021 03:58:54 +0000</pubDate>
      <link>https://forem.com/kotlinautas/criando-testes-unitarios-com-kotest-172d</link>
      <guid>https://forem.com/kotlinautas/criando-testes-unitarios-com-kotest-172d</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/" rel="noopener noreferrer"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjreawpvk6whxigcpmctf.png" alt="capa Kotlinautas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Teste Unitário
&lt;/h2&gt;

&lt;p&gt;Teste unitário é um tipo de teste onde cada componente do software pode ser testado separadamente. Com isso, cada parte do sistema será isolada, dando a garantia que está funcionando como o esperado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kotest
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kotest.io/" rel="noopener noreferrer"&gt;Kotest&lt;/a&gt; é uma biblioteca em Kotlin para a criação de testes unitários. Kotest pode ser usado com diferentes estilos de teste, permitindo uma grandle flexibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais
&lt;/h2&gt;

&lt;p&gt;Será necessário ter o &lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IntelliJ&lt;/a&gt; instalado na máquina e um conhecimento básico sobre a linguagem &lt;a href="https://kotlinlang.org/" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê vamos criar?
&lt;/h2&gt;

&lt;p&gt;Vamos criar uma classe &lt;code&gt;Calculadora&lt;/code&gt;, que terá quatro funções, sendo &lt;code&gt;Soma&lt;/code&gt;, &lt;code&gt;Subtração&lt;/code&gt;, &lt;code&gt;Multiplicação&lt;/code&gt; e &lt;code&gt;Divisão&lt;/code&gt;. Cada uma dessas funções representa uma operação matemática.&lt;/p&gt;

&lt;p&gt;Iremos criar um teste unitário para essa classe, testando cada operação separadamente usando a Kotest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o projeto
&lt;/h2&gt;

&lt;p&gt;Abra seu IntelliJ no menu inicial e clique em &lt;em&gt;New Project&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnv7k22iwi30d5odbycg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnv7k22iwi30d5odbycg.png" alt="botão New Project no menu inicial do IntelliJ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois, selecione a opção &lt;strong&gt;Kotlin DSL build script&lt;/strong&gt;, selecione também a opção &lt;strong&gt;Kotlin/JVM&lt;/strong&gt;, e opicionalmente remova a primeira opção &lt;strong&gt;Java&lt;/strong&gt;. Essa opção não vai mudar em nada, pois ela dá suporte do Gradle á linguagem Java, mas apenas iremos usar Kotlin.&lt;/p&gt;

&lt;p&gt;Após isso, clique em &lt;strong&gt;Next&lt;/strong&gt; e escreva o nome do projeto e a localização na sua máquina. Essas duas opção são completamente pessoais, caso não tenha nenhuma ideia, coloque algo como &lt;strong&gt;kotest&lt;/strong&gt; apenas como identificação.&lt;/p&gt;

&lt;p&gt;Agora, com o projeto aberto, vá ao aquivo &lt;code&gt;build.gradle.kts&lt;/code&gt; e adicione a dependência &lt;code&gt;testImplementation("io.kotlintest:kotlintest-runner-junit5:3.1.7")&lt;/code&gt;, com a seção &lt;code&gt;dependencies&lt;/code&gt; ficando assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kotlin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"stdlib"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;testImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.kotlintest:kotlintest-runner-junit5:3.1.7"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também adicione uma modificação ás Tasks do Gradle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;withType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;useJUnitPlatform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao final, nosso arquivo &lt;code&gt;build.gradle.kts&lt;/code&gt; ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;plugins&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;java&lt;/span&gt;
    &lt;span class="nf"&gt;kotlin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jvm"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s"&gt;"1.5.30"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"org.example"&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0-SNAPSHOT"&lt;/span&gt;

&lt;span class="nf"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;mavenCentral&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kotlin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"stdlib"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;testImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.kotlintest:kotlintest-runner-junit5:3.1.7"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;withType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;useJUnitPlatform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, clique no elefante no canto superior direito para carregar as alterações no Gradle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805k86ksktoakp3rqr17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805k86ksktoakp3rqr17.png" alt="Elefante do Gradle no canto superior direito"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, poderemos começar a programar. Você pode criar um arquivo em &lt;code&gt;src/main/kotlin/&lt;/code&gt; chamado &lt;code&gt;main.kt&lt;/code&gt; para ser o arquivo principal da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando a classe &lt;code&gt;Calculadora&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Vamos criar um arquivo em &lt;code&gt;src/main/kotlin/Calculadora.kt&lt;/code&gt; que irá armazenar uma classe &lt;code&gt;Calculadora&lt;/code&gt; com alguns métodos que representam operações matemáticas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;subtração&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;multiplicação&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;divisão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando testes
&lt;/h2&gt;

&lt;p&gt;Agora vamos criar uma pasta chamado &lt;code&gt;src/main/tests/&lt;/code&gt; e um arquivo &lt;code&gt;calculadora.kt&lt;/code&gt; dentro dessa pasta.&lt;/p&gt;

&lt;p&gt;Essa pasta irá guardar todos os testes unitários do nosso projeto, e será usada pela Kotest para ver quais são os testes disponíveis.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos importar a kotest ao nosso arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kotlintest.shouldBe&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kotlintest.specs.StringSpec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, vamos criar uma variável chamada &lt;code&gt;calculadora&lt;/code&gt; que irá armazenar uma instância da nossa classe &lt;code&gt;Calculadora&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;calculadora&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos criar uma classe chamada &lt;code&gt;TestarCalculadora&lt;/code&gt;, que irá armazenar os testes unitários da classe &lt;code&gt;Calculadora&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestarCalculadora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StringSpec&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Nesse estilo &lt;code&gt;StringSpec&lt;/code&gt; poderemos inserir um teste usando um texto que irá definir esse teste, aumentando a semântica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos adicionar o primeiro teste que será sobre a função &lt;code&gt;soma&lt;/code&gt;, primeiro, vamos colocar o texto do teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestarCalculadora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StringSpec&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;"Testar soma da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Podemos abrir um bloco para esse teste usando o texto que define o teste, seguido por &lt;code&gt;{}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após isso, podemos inserir os testes dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestarCalculadora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StringSpec&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;"Testar soma da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usamos a função &lt;code&gt;soma&lt;/code&gt;, passando os números, e após isso podemos usar a função &lt;code&gt;shouldBe&lt;/code&gt;, que recebe um argumento, e obriga o resultado de uma função ser esse argumento recebido.&lt;/li&gt;
&lt;li&gt;Por exemplo, passamos á função &lt;code&gt;soma&lt;/code&gt; os valores &lt;code&gt;10&lt;/code&gt; e &lt;code&gt;20&lt;/code&gt;. Que irão resultar em &lt;code&gt;30&lt;/code&gt;. Após isso, usamos a função &lt;code&gt;shouldBe&lt;/code&gt; para garantir que esse valor será &lt;code&gt;30&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após isso, podemos repetir o mesmo processo para as outras operações, sempre criando um novo teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestarCalculadora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StringSpec&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;"Testar soma da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="s"&gt;"Testar substração da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtração&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtração&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtração&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="s"&gt;"Testar multiplicação da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiplicação&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiplicação&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiplicação&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="s"&gt;"Testar divisão da calculadora"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divisão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divisão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divisão&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você pode clicar no menu do Gradle ao lado da tela, clique em &lt;code&gt;Run Configurations&lt;/code&gt; e em &lt;code&gt;kotest [test]&lt;/code&gt; para rodar os testes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3y5edqfdleobbtes35eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3y5edqfdleobbtes35eo.png" alt="Tarefa do Kotest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso todos os testes irão passar e a classe &lt;code&gt;Calculadora&lt;/code&gt; estará testada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29kczl9k8or5f7y6lg6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29kczl9k8or5f7y6lg6n.png" alt="Resultados do Kotest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora tente modificar algum teste intencionalmente para modificar o resultado e rode os teste novamente. Com isso, os testes resultarão em um erro, mostrando que a classe &lt;code&gt;Calculadora&lt;/code&gt; está sendo implementada de maneira incorreta segundo essa nova versão dos testes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mvuvcr0o98ovkyxqux5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mvuvcr0o98ovkyxqux5.png" alt="Resultados do Kotest com erro"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Neste artigo você aplicou testes unitários com &lt;a href="https://kotest.io/" rel="noopener noreferrer"&gt;Kotest&lt;/a&gt; á uma calculadora. Busque aprender mais maneira de criar testes e diferentes estilos de testes para tornar esse conhecimento mais flexível.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda" rel="noopener noreferrer"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>kotest</category>
      <category>backend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Transformando JARs em binário com GraalVM</title>
      <dc:creator>Lissa Ferreira</dc:creator>
      <pubDate>Mon, 01 Nov 2021 00:39:52 +0000</pubDate>
      <link>https://forem.com/kotlinautas/tranformando-jars-em-binario-com-graalvm-4m8o</link>
      <guid>https://forem.com/kotlinautas/tranformando-jars-em-binario-com-graalvm-4m8o</guid>
      <description>&lt;h2&gt;
  
  
  Kotlinautas
&lt;/h2&gt;

&lt;p&gt;Esse conteúdo é oferecido e distribuído pela comunidade &lt;a href="https://twitter.com/kotlinautas/"&gt;Kotlinautas&lt;/a&gt;, uma comunidade brasileira que busca oferecer conteúdo gratuito sobre a linguagem Kotlin em um espaço plural.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BE6z6Pw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jreawpvk6whxigcpmctf.png" alt="capa Kotlinautas" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê é um binário?
&lt;/h2&gt;

&lt;p&gt;Binário é um executável do sistema. um binário pode ser executado diretamente pelo sistema, pois é composto totalmente por linguagem de máquina.&lt;/p&gt;

&lt;p&gt;As vantagens de um binário é a velocidade de execução, que é geralmente BEM rápida, além de não precisarmos de uma linguagem instalada para rodar esse programa, pois o próprio sistema irá cuidar de rodar esse executável.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraalVM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.graalvm.org/"&gt;GraalVM&lt;/a&gt; é uma máquina virtual da Oracle para aumentar a velocidade de aplicações. Uma das funções da GraalVM é a &lt;em&gt;Native Images&lt;/em&gt;, que é uma maneira de unir código de qualquer linguagem da JVM (Java, Kotlin, Clojure, etc.) em um único arquivo totalmente em código de máquina. Eliminando a necessidade de utilizar uma JVM para rodar um projeto.&lt;/p&gt;

&lt;p&gt;Esse processo de transformação de código JVM para binários só deve ser feito para utilizar esse binário em produção. Pois esse processo é demorado e gasta muito processamento e memória, logo, em ambiente de desenvolvimento é mais fácil utilizar o processo normal da JVM para rodar seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação da GraalVM
&lt;/h2&gt;

&lt;p&gt;Há alguns documentos oficiais de instalação da GraalVM para algumas plataformas, sendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.graalvm.org/docs/getting-started/windows/"&gt;Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.graalvm.org/docs/getting-started/linux/"&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.graalvm.org/docs/getting-started/macos/"&gt;MacOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação da &lt;em&gt;Native Image&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;Native Image&lt;/em&gt; pode ser instalada usando a &lt;a href="https://www.graalvm.org/reference-manual/graalvm-updater/"&gt;GraalVM Updater&lt;/a&gt;, que é uma ferramenta utilizada para instalar utilitários da GraalVM. Essa instalação pode ser feita com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gu install native-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hello World
&lt;/h2&gt;

&lt;p&gt;Agora vamos criar um &lt;em&gt;Hello World&lt;/em&gt; em Kotlin para gerar o JAR desse &lt;em&gt;Hello World&lt;/em&gt; para transformar em binário com &lt;em&gt;Native Image&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Isso pode ser feito com qualquer editor, não há necessidade de utilizar o IntelliJ, mas caso prefira, crie um projeto no IntelliJ para isso.&lt;/p&gt;

&lt;p&gt;Arquivo &lt;code&gt;main.kt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos tranformar esse arquivo em um JAR. Para fazer isso, podemos usar o comando &lt;code&gt;kotlinc&lt;/code&gt; que é o compilador do Kotlin. Vá até o caminho que esse arquivo está, e vamos fazer essa compilação com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kotlinc main.kt -include-runtime -d main.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos o nosso JAR no arquivo &lt;code&gt;main.jar&lt;/code&gt;. Caso você queira executar esse JAR, isso pode ser feito com o comando &lt;code&gt;java -jar main.kt&lt;/code&gt;, que terá &lt;code&gt;Olá Mundo!&lt;/code&gt; como resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Olá Mundo!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos transformar esse JAR em binário, podemos fazer isso com o comando &lt;code&gt;native-image&lt;/code&gt;. Dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;native-image --static -jar main.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso o processamento irá começar. A GraalVM ao longo do processamento irá mostrar alguns dados sobre o processo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ native-image --static -jar main.jar

Build on Server(pid: 5484, port: 35163)
[main:5484]    classlist:     441.34 ms
[main:5484]        (cap):   1,017.18 ms
[main:5484]        setup:   1,581.26 ms
[main:5484]   (typeflow):   2,216.25 ms
[main:5484]    (objects):     516.04 ms
[main:5484]   (features):      86.21 ms
[main:5484]     analysis:   2,876.19 ms
[main:5484]     universe:     131.56 ms
[main:5484]      (parse):     610.96 ms
[main:5484]     (inline):     518.10 ms
[main:5484]    (compile):   2,818.48 ms
[main:5484]      compile:   4,187.55 ms
[main:5484]        image:     354.83 ms
[main:5484]        write:     164.75 ms
[main:5484]      [total]:   9,769.44 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após o término desse processamento teremos um binário &lt;code&gt;main&lt;/code&gt; com todo o código atual. Esse binário terá cerca de 12MB de tamanho.&lt;/p&gt;

&lt;p&gt;Para executar esse binário, no Windows podemos usar o comando &lt;code&gt;main&lt;/code&gt; no diretório que esse binário está, e em Linux/MacOS podemos usar &lt;code&gt;./main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Velocidade
&lt;/h2&gt;

&lt;p&gt;Podemos comparar o tempo de execução do JAR e do binário, caso você esteja em sistemas Linux/MacOS existe o comando &lt;code&gt;time&lt;/code&gt; para medir o tempo de execução de um comando, comparando os dois métodos teremos o resultado abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ time java -jar main.jar
Olá Mundo!
java -jar main.jar  0,12s user 0,02s system 64% cpu 0,114 total

$ time ./main
Olá Mundo!
./main  0,00s user 0,00s system 74% cpu 0,002 total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que a principal diferença entre os dois é a diferença de tempo que cada um executou. Enquanto &lt;code&gt;java -jar main.jar&lt;/code&gt; demorou 0.12 segundos para rodar, &lt;code&gt;./main&lt;/code&gt; levou 0 segundos para rodar, de maneira quase instantânea. Claro, para programas pequenos a diferença pequena, mas para programas maiores como uma aplicação web essa diferença irá ficar bem maior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Neste artigo você aprendeu como utilizar a &lt;a href="https://www.graalvm.org/"&gt;GraalVM&lt;/a&gt; para gerar binários de projetos JVM especialmente Kotlin, e executar esse binário final.&lt;/p&gt;

&lt;p&gt;Muito obrigada por ler ❤️🏳️‍⚧️ e me segue nas redes, é tudo &lt;a href="https://twitter.com/lissatransborda"&gt;@lissatransborda&lt;/a&gt; 👀&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>graalvm</category>
      <category>backend</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
