<?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>DEV Community: Henrique</title>
    <description>The latest articles on DEV Community by Henrique (@henriqued).</description>
    <link>https://dev.to/henriqued</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%2Fuser%2Fprofile_image%2F201623%2Fb079bd55-4db0-4c2e-ab97-3e9587bf789e.png</url>
      <title>DEV Community: Henrique</title>
      <link>https://dev.to/henriqued</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henriqued"/>
    <language>en</language>
    <item>
      <title>Navegação com Flutter</title>
      <dc:creator>Henrique</dc:creator>
      <pubDate>Fri, 05 Feb 2021 13:56:13 +0000</pubDate>
      <link>https://dev.to/henriqued/navegacao-com-flutter-14ki</link>
      <guid>https://dev.to/henriqued/navegacao-com-flutter-14ki</guid>
      <description>&lt;p&gt;Saudações!&lt;/p&gt;

&lt;p&gt;A Navegação é uma parte essencial na maioria dos apps. Aqui vou abordar o que aprendi ao longo do desenvolvimento de alguns apps.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Em aplicativos, a navegação é feita em Stack, isto é, pilha.&lt;br&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%2Fi%2Fuw9autlfv3u1rwryazh1.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%2Fi%2Fuw9autlfv3u1rwryazh1.png" alt="pilha"&gt;&lt;/a&gt;&lt;br&gt;
Por exemplo, temos uma tela chamada Home, a qual nos pode levar à próxima tela, Configurações, formando uma pilha. E esta, pode levar para Configurações de conta. Em cada tela nós podemos adicionar ou retirar uma tela da pilha.&lt;/p&gt;

&lt;h1&gt;
  
  
  Navegação Básica
&lt;/h1&gt;

&lt;p&gt;Sabendo que ela acontece em Stack, vamos ver como adicionar ou remover telas dessa pilha de navegação.&lt;/p&gt;

&lt;p&gt;Para começar a fazer uma navegação você vai precisar de, pelo menos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a tela inicial;&lt;/li&gt;
&lt;li&gt;de uma ação para enviar o usuário à próxima tela;&lt;/li&gt;
&lt;li&gt;a tela para a qual vamos direcionar o usuário.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Feito isso, nosso evento &lt;em&gt;onPress&lt;/em&gt; ou &lt;em&gt;onTap&lt;/em&gt;, precisa fazer uma ação sobre o &lt;a href="https://api.flutter.dev/flutter/widgets/Navigator-class.html" rel="noopener noreferrer"&gt;Navigator&lt;/a&gt;.&lt;/p&gt;

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

&lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;MaterialPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&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;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;NewPageScreen&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;Você precisa usar o Navigator (Navegador) do contexto, por isso &lt;code&gt;Navigator.of(context)&lt;/code&gt;. Ele possui os métodos necessários para controlar a pilha, alguns deles são: &lt;em&gt;&lt;code&gt;push&lt;/code&gt;&lt;/em&gt;, &lt;em&gt;&lt;code&gt;pushNamed&lt;/code&gt;&lt;/em&gt;, &lt;em&gt;&lt;code&gt;pop&lt;/code&gt;&lt;/em&gt;. Nesse caso usamos o push, que precisa receber um &lt;strong&gt;Route&lt;/strong&gt;. Nós poderemos criar depois o nosso próprio Route, mas o &lt;a href="https://api.flutter.dev/flutter/material/material-library.html" rel="noopener noreferrer"&gt;Material&lt;/a&gt; nos dá o &lt;em&gt;&lt;a href="https://api.flutter.dev/flutter/material/MaterialPageRoute-class.html" rel="noopener noreferrer"&gt;MaterialPageRoute&lt;/a&gt;&lt;/em&gt;, que recebe um parâmetro nomeado &lt;em&gt;builder&lt;/em&gt;, onde podemos simplesmente retornar a página destino.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Transferir dados entre telas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pode ser que navegar entre telas não nos seja suficiente, mas podemos precisar enviar dados de uma tela para outra.&lt;/p&gt;

&lt;p&gt;É possível fazer isso através dos construtores. Desse modo, ao invés de retornarmos a tela sem parâmetros &lt;em&gt;&lt;code&gt;NewScreen()&lt;/code&gt;&lt;/em&gt;, nós podemos adicionar uma informação no seu construtor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definição do construtor&lt;/li&gt;
&lt;/ul&gt;

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

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NewScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;NewScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// [...]&lt;/span&gt;


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Ao redirecionar para a tela &lt;em&gt;NewScreen&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;MaterialPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&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;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;NewScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Estou aprendendo Flutter'&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;h3&gt;
  
  
  Retirar da pilha
&lt;/h3&gt;

&lt;p&gt;Para retirar uma tela da pilha, fazendo uma ação de voltar, ao invés de &lt;code&gt;push&lt;/code&gt;, basta usar o método &lt;code&gt;pop&lt;/code&gt;, que vai retirar a tela atual da pilha. Há também outras funções como &lt;code&gt;popAndPushNamed&lt;/code&gt;, &lt;code&gt;popUntil&lt;/code&gt;, &lt;code&gt;pushNamedAndRemoveUntil&lt;/code&gt;, &lt;code&gt;pushReplacement&lt;/code&gt;, entre outros. Você pode explorar mais através da &lt;a href="https://api.flutter.dev/flutter/widgets/Navigator-class.html" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; oficial&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Rotas nomeadas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agora vamos falar das rotas nomeadas. Espera, já conseguimos resolver nossos problemas. Por que alguém precisaria de rotas nomeadas? Bom, depende do seu caso, mas para muitas aplicações rotas nomeadas podem lhe dar a vantagem de não ter código duplicado. Se você quisesse navegar para a mesma tela em diferentes partes do seu app, do modo como fizemos até agora, você teria que ter repetidas vezes &lt;code&gt;NewScreen('Estou aprendendo Flutter')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em nosso arquivo &lt;em&gt;main.dart&lt;/em&gt;, temos o &lt;em&gt;MaterialApp&lt;/em&gt;, com alguns parametros. Agora nós vamos introduzir um parâmetro chamado &lt;strong&gt;routes&lt;/strong&gt;. Veja o exemplo:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;

&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// [...]&lt;/span&gt;
    &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="s"&gt;'/new-screen'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;NewScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
      &lt;span class="s"&gt;'/blog'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BlogScreen&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;O que o &lt;strong&gt;routes&lt;/strong&gt; faz é relacionar os nomes das rotas, com os Widgets que as representam. Já é possível entender isso ao ver o tipo de valor que &lt;strong&gt;routes&lt;/strong&gt; deve receber: &lt;em&gt;&lt;code&gt;Map&amp;lt;String, Widget Function(BuildContext)&amp;gt;&lt;/code&gt;,&lt;/em&gt; que é exatamente isso, uma String que representa um builder de Widget.&lt;/p&gt;

&lt;p&gt;Com as rotas nomeadas, o que é considerado a rota inicial é sempre a rota &lt;code&gt;/&lt;/code&gt;(barra). Quem vem da programação para web já deve esperar por isso. Nós podemos alterar essa rota inicial adicionando mais um parâmetro no &lt;em&gt;MaterialApp&lt;/em&gt;, como se segue:&lt;/p&gt;

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

&lt;span class="nl"&gt;initialRoute:&lt;/span&gt; &lt;span class="s"&gt;'/blog'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Precisamos usar um método diferente para o Navigator sempre que quisermos fazer uma navegação utilizando essas rotas nomeadas.&lt;/p&gt;

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

&lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pushNamed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="s"&gt;'/new-screen'&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;h3&gt;
  
  
  Transferir dados entre rotas nomeadas
&lt;/h3&gt;

&lt;p&gt;A forma mais simples de resolver esse problema é, ao navegar para a tela, enviar argumentos. Eles devem ser do tipo &lt;strong&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/strong&gt;, que representa quaisquer tipos; podemos inclusive criar uma classe para encapsular esses argumentos, para maior organização.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;

&lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pushNamed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="s"&gt;'/new-screen'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nl"&gt;arguments:&lt;/span&gt; &lt;span class="s"&gt;'Flutter is awesome'&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 exemplo, enviamos uma String, um simples texto. Agora para utilizar esse valor podemos, na tela que representa &lt;code&gt;/new-screen&lt;/code&gt;, isto é, &lt;em&gt;NewScreen&lt;/em&gt;, vamos usar o &lt;em&gt;ModalRoute&lt;/em&gt;:&lt;/p&gt;

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

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NewScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;NewScreen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nd"&gt;@override&lt;/span&gt;
    &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ModalRoute&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arguments&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&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;h3&gt;
  
  
  Geração de rota
&lt;/h3&gt;

&lt;p&gt;Adicionar um evento para geração de rota pode ser muito útil. Vamos introduzir mais um valor para o &lt;em&gt;MaterialApp&lt;/em&gt;, o &lt;code&gt;onGenerateRoute&lt;/code&gt;. Ele vai servir como um meio de administrar as rotas de forma mais isolada, permitindo fazer alguma operação antes de fazer o &lt;strong&gt;&lt;code&gt;push&lt;/code&gt;&lt;/strong&gt; na próxima tela, por exemplo.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;

&lt;span class="nl"&gt;onGenerateRoute:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RouteSettings&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&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;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'/categories'&lt;/span&gt;&lt;span class="p"&gt;)&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;CategoriesScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;categoriesRepository&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;O &lt;code&gt;settings.name&lt;/code&gt; representa o nome da rota, como pode ver. No exemplo, estamos passando um repository para dentro da tela CategoriesScreen. &lt;/p&gt;

&lt;p&gt;Importante mencionar que quando usamos onGenerateRoute, ele faz o papel do routes que adicionamos antes ao MaterialApp; então você poderia removê-lo para usar a geração de rotas.&lt;/p&gt;

&lt;p&gt;Antes de mostrar uma implementação real usando onGenerateRoute, gostaria de mencionar o &lt;code&gt;onUnknownRoute&lt;/code&gt;. &lt;/p&gt;

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

&lt;span class="nl"&gt;onUnknownRoute:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RouteSettings&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&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="n"&gt;MaterialPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&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;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;UnknownPageScreen&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;É uma forma fácil de mostrarmos uma rota desconhecida. Ele será disparado caso o &lt;code&gt;onGenerateRoute&lt;/code&gt; falhe em retornar o Route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso
&lt;/h3&gt;

&lt;p&gt;routes.dart&lt;/p&gt;

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

  &lt;span class="c1"&gt;// o defaultBuilder serve para as rotas que nao precisam de argumentos&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WidgetBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;defaultBuilder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WidgetBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;welcome:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;WelcomeScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nl"&gt;login:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;LoginScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;routeFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RouteSettings&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;AppRoutes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signUp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&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;SignUpScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;userRepository:&lt;/span&gt; &lt;span class="n"&gt;userRepository&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="nl"&gt;settings:&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

     &lt;span class="c1"&gt;// [...]&lt;/span&gt;

      &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="n"&gt;defaultBuilder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&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;Seguindo esse método, para ir de uma tela para outra basta fazer o &lt;code&gt;pushNamed&lt;/code&gt;. Ele vai retornar o MaterialPageRoute que constrói o SignUpScreen passando todos os dados necessários para o construtor.&lt;/p&gt;

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

&lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pushNamed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppRoutes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signUp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Se por acaso o &lt;em&gt;switch&lt;/em&gt; não incluir alguma rota, com o exemplo do &lt;code&gt;welcome&lt;/code&gt; e o &lt;code&gt;login&lt;/code&gt;, então usamos um builder padrão, &lt;code&gt;defaultBuilder&lt;/code&gt;, para construir a tela.&lt;/p&gt;

&lt;p&gt;Utilizando esse padrão de rotas nomeadas e geradas podemos, do mesmo modo, enviar dados através dos &lt;code&gt;arguments&lt;/code&gt;. Ou, para muitos casos, bastará termos um repositório que controle o estado de um fluxo, assim a tela para a qual fomos direcionados já terá acesso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transição animada
&lt;/h3&gt;

&lt;p&gt;Fazer uma transição de telas personalizada pode dar uma ótima experiência ao usuário. Aperfeiçoando o arquivo de rotas, podemos facilmente adicionar essas animações.&lt;/p&gt;

&lt;p&gt;Em Flutter as transições de telas são feitas pelo Route, que no nosso caso é o MaterialPageRoute. Nós podemos criar o nosso próprio Route e sobrescrever a transição padrão. Segue um exemplo:&lt;/p&gt;

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

&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt; &lt;span class="nf"&gt;animatedPageRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WidgetBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RouteSettings&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;})&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;PageRouteBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;settings:&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;pageBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondaryAnimation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;transitionDuration:&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;milliseconds:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;transitionsBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondaryAnimation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&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;FadeTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;opacity:&lt;/span&gt; &lt;span class="n"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;child&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;&lt;a href="https://api.flutter.dev/flutter/widgets/PageRouteBuilder-class.html" rel="noopener noreferrer"&gt;PageRouteBuilder&lt;/a&gt; é o que precisamos retornar dessa função. Com seus parâmetros podemos criar a animação que quisermos. &lt;/p&gt;

&lt;p&gt;O &lt;em&gt;transitionsBuilder&lt;/em&gt; faz a construção da animação. Nesse contexto, nós precisamos retornar uma &lt;em&gt;Transition&lt;/em&gt;, entre elas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SlideTransition&lt;/li&gt;
&lt;li&gt;FadeTransition&lt;/li&gt;
&lt;li&gt;ScaleTransition&lt;/li&gt;
&lt;li&gt;RotationTransition&lt;/li&gt;
&lt;li&gt;SizeTransition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para mais informações sobre as animações de transição, acesse a &lt;a href="https://flutter.dev/docs/cookbook/animation/page-route-animation" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; oficial.&lt;/p&gt;

&lt;p&gt;Este é um resumo do que tenho aprendido com os projetos que pude trabalhar até o momento. Espero que lhe seja útil. Obrigado!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>navegacao</category>
      <category>rotas</category>
      <category>pageroutebuilder</category>
    </item>
    <item>
      <title>Unity - Easy tweens 🥔</title>
      <dc:creator>Henrique</dc:creator>
      <pubDate>Fri, 17 Jan 2020 23:03:13 +0000</pubDate>
      <link>https://dev.to/henriqued/unity-easy-tweens-2b0e</link>
      <guid>https://dev.to/henriqued/unity-easy-tweens-2b0e</guid>
      <description>&lt;p&gt;Hello 🤓&lt;/p&gt;

&lt;p&gt;This is something I wanted to bring to the world. I am talking about &lt;strong&gt;PotaTween&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It is a Tween maker for Unity, it's a simple C# Component that helps you create simple tweens and use it either from the Editor or from Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction 🥔
&lt;/h2&gt;

&lt;p&gt;Actually PotaTween was written by someone I don't know. In one of the last companies I worked, I was introduced to this simple tool, that was made by a friend of another developer.&lt;/p&gt;

&lt;p&gt;We decided to improve that to fit our needs and the Unity updates such as the TextMeshPro and other ones. Then, by creating a GitHub repo I think we're giving to the world the opportunity to use it, explore, learn, and collaborate. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh yes, it's a good repo to start collaborating with open-source projects. 😀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How we use it
&lt;/h2&gt;

&lt;p&gt;Now we already have this repo, and you can check it here &lt;a href="https://github.com/GabrielCapeletti/PotaTween"&gt;https://github.com/GabrielCapeletti/PotaTween&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's so simple, I don't even know how to explain that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Setting from Editor
&lt;/h3&gt;

&lt;p&gt;Basically what we'll need to do is &lt;strong&gt;add the PotaTween component&lt;/strong&gt; to the GameObject we want to animate. And then just check the parameters &lt;strong&gt;Play On Enable&lt;/strong&gt;, or &lt;strong&gt;Play On Start&lt;/strong&gt; from the Inspector. &lt;br&gt;
Or start the animation from code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the &lt;code&gt;tween&lt;/code&gt; variable is a PotaTween type, you can simply attach it in the inspector or say &lt;code&gt;GetComponent&amp;lt;PotaTween&amp;gt;()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting from Code
&lt;/h3&gt;

&lt;p&gt;You just have to &lt;code&gt;Create&lt;/code&gt; the PotaTween from code. What it'll do is &lt;em&gt;AddComponent&lt;/em&gt; in the given gameObject.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;PotaTween&lt;/span&gt; &lt;span class="n"&gt;tween&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PotaTween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// Animates from scale 0 to 1&lt;/span&gt;
&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is an important thing about the &lt;code&gt;Create&lt;/code&gt; method. The second parameter, which is the id of the animation; so if you set two animations with the same id, they're going to be overwritten.&lt;/p&gt;




&lt;h2&gt;
  
  
  A little deeper 🍟
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I use callbacks?
&lt;/h3&gt;

&lt;p&gt;This Tween Component allows you to easily set callbacks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onStart&lt;/li&gt;
&lt;li&gt;onComplete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These names above are &lt;code&gt;PotaTweenEvent&lt;/code&gt; which is actually the same of &lt;code&gt;UnityEvent&amp;lt;PotaTween&amp;gt;&lt;/code&gt;, and you can set them like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onStart&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PotaTween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PotaTweenEvent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onStart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddListener&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;PotaTween&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PotatooO"&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;h4&gt;
  
  
  What about the easy way?
&lt;/h4&gt;

&lt;p&gt;The easier way to do something when the animation ends is by adding a callback function as a parameter of the &lt;code&gt;Play&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;tween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Animation has finished."&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;h3&gt;
  
  
  Can I reuse my animations? 🥔🍟
&lt;/h3&gt;

&lt;p&gt;Yes. This is one of the changes we did from the original project.&lt;br&gt;
This is called &lt;strong&gt;PotaTweenPreset&lt;/strong&gt;. It's an asset that you can create by accessing the Unity menu &lt;code&gt;Create &amp;gt; PotaTween &amp;gt; Preset&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Preset works pretty much the same way the PotaTween Component. To use it you will need to reference your Preset asset, so create a variable like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PotaTweenPreset&lt;/span&gt; &lt;span class="n"&gt;blinkTween&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make the Preset work, just initialize it wherever you need&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;PotaTween&lt;/span&gt; &lt;span class="n"&gt;tween&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blinkTween&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way your animation can be reused everywhere because it is an asset, not a component configuration. You just need to reference it from the inspector.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A good thing of PotaTween is simplicity, I hope it can help you&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would like to read your comment about what did you think. &lt;br&gt;
Do you think it's useful?&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks! 😄
&lt;/h1&gt;

</description>
      <category>unity3d</category>
      <category>tween</category>
      <category>animation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Unity - Criar uma barra de vida</title>
      <dc:creator>Henrique</dc:creator>
      <pubDate>Sun, 05 Jan 2020 03:59:48 +0000</pubDate>
      <link>https://dev.to/henriqued/unity-criar-uma-barra-de-vida-ge4</link>
      <guid>https://dev.to/henriqued/unity-criar-uma-barra-de-vida-ge4</guid>
      <description>&lt;h2&gt;
  
  
  Olá!
&lt;/h2&gt;

&lt;p&gt;Estou fazendo este artigo a partir do breve vídeo que acabei de publicar no &lt;a href="https://www.youtube.com/watch?v=vdRDT7VymMk"&gt;meu canal no YouTube&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Primeiro vídeo, primeiro artigo -&amp;gt; por isso talvez algumas coisas não estejam tão boas, me perdoe por isso; aceito suas sugestões.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;O que vamos fazer: Vamos fazer uma barra de vida horizontal simples.&lt;br&gt;
Utilizei a versão 2019.3.0f3 da Unity.&lt;br&gt;
Repositório: &lt;a href="https://github.com/HenriqueDerosa/tutorial-lifebar"&gt;acesse aqui&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Mão na massa
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Precisamos de uma imagem branca, convertida para Sprite, na configuração de importação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Criar um Canvas com a Image de background e de preenchimento da barra de vida&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4X2xF0CQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/a482161wrkf5qi5zchet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4X2xF0CQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/a482161wrkf5qi5zchet.png" alt="Como deve ficar a hierarquia" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ao criar o preenchimento, altere o &lt;code&gt;ImageType&lt;/code&gt; para &lt;em&gt;Filled&lt;/em&gt;, e o &lt;code&gt;Fill Method&lt;/code&gt; para &lt;em&gt;Horizontal&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5bi3s-jJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/9fflbhbaut6lgv7hzval.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5bi3s-jJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/9fflbhbaut6lgv7hzval.png" alt="Configurar preenchimento" width="552" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esse valor &lt;code&gt;FillAmount&lt;/code&gt; controla o quanto de preenchimento nós temos, sendo ele entre &lt;code&gt;0&lt;/code&gt; e &lt;code&gt;1&lt;/code&gt;&lt;br&gt;
Obs.: você só consegue alterar o &lt;code&gt;ImageType&lt;/code&gt; se adicionar um Sprite no componente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pronto!&lt;br&gt;
Agora crie o Script &lt;code&gt;HealthController.cs&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;p&gt;Este é o código que utilizamos no vídeo, e que está disponível no repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.UI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HealthController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;get&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;health&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Mathf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;healthMax&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;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;healthMax&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; &lt;span class="n"&gt;healthBar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&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;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UpArrow&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Health&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;0.5f&lt;/span&gt;&lt;span class="p"&gt;;&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;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DownArrow&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Health&lt;/span&gt; &lt;span class="p"&gt;-=&lt;/span&gt; &lt;span class="m"&gt;0.5f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nf"&gt;UpdateHealthBar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;UpdateHealthBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;healthBar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fillAmount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;healthMax&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;Você pode remover as linhas de &lt;code&gt;Input&lt;/code&gt;. Elas foram criadas apenas para teste, já que não temos eventos de dano ou ganho de vida.&lt;/p&gt;

&lt;p&gt;Espero que tenha ajudado de alguma forma. Qualquer dúvida ou sugestão, eu gostaria de saber. &lt;/p&gt;




&lt;p&gt;No meu canal, pretendo adicionar mais vídeos, não tão iniciantes, mas que espero ajudar muita gente; de forma direta e sem rodeios. 😄&lt;/p&gt;

&lt;p&gt;Obrigado!&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>game</category>
    </item>
  </channel>
</rss>
