<?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: Leonardo Serrano</title>
    <description>The latest articles on DEV Community by Leonardo Serrano (@leonardos_dev).</description>
    <link>https://dev.to/leonardos_dev</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%2F668749%2F9cfdaded-96a7-4b64-8c9e-0c595c07355a.jpeg</url>
      <title>DEV Community: Leonardo Serrano</title>
      <link>https://dev.to/leonardos_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonardos_dev"/>
    <language>en</language>
    <item>
      <title>Flutter - Criando um AlertDialog com animação Hero</title>
      <dc:creator>Leonardo Serrano</dc:creator>
      <pubDate>Sat, 10 Jun 2023 11:24:37 +0000</pubDate>
      <link>https://dev.to/leonardos_dev/flutter-criando-um-alertdialog-com-animacao-hero-2ge0</link>
      <guid>https://dev.to/leonardos_dev/flutter-criando-um-alertdialog-com-animacao-hero-2ge0</guid>
      <description>&lt;p&gt;Neste tutorial ensinarei a vocês como criar um &lt;strong&gt;AlertDialog&lt;/strong&gt; no Flutter que funciona com a animação &lt;code&gt;Hero&lt;/code&gt;. Acho que todos nós já nos frustramos com a tentativa de usar o &lt;code&gt;Hero&lt;/code&gt; em &lt;strong&gt;dialogs&lt;/strong&gt;, &lt;strong&gt;bottomsheet&lt;/strong&gt; e nunca deram certo né? &lt;br&gt;
Calma, vem comigo que lhe mostro em exemplo bem legal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler no GIF hahaha!&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FAOl1klG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiezosrppzexkgtb4j35.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FAOl1klG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiezosrppzexkgtb4j35.gif" alt="Image description" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ao código!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Na sua página principal coloque o &lt;code&gt;Hero&lt;/code&gt; com &lt;strong&gt;flag&lt;/strong&gt; &lt;code&gt;star_alert_dialog&lt;/code&gt; envolvendo o &lt;code&gt;Widget&lt;/code&gt; que deseja animar, como no exemplo abaixo, onde aplicamos no &lt;code&gt;Icons.star&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W6YYqUZ8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eoxwcyy6yxsogoqgijni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W6YYqUZ8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eoxwcyy6yxsogoqgijni.png" alt="Image description" width="800" height="789"&gt;&lt;/a&gt;&lt;br&gt;
Sobre o &lt;strong&gt;placeholderBuilder&lt;/strong&gt;, pode notar na imagem acima que aplicamos um &lt;code&gt;Widget&lt;/code&gt; como &lt;code&gt;placeholder&lt;/code&gt;; utilizamos esta função quando queremos exibir um &lt;code&gt;Widget&lt;/code&gt; personalizado durante a animação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Criei um arquivo chamado &lt;code&gt;alert_dialog_widget&lt;/code&gt;, onde retornaremos um &lt;code&gt;AlertDialog&lt;/code&gt; e um dos seus &lt;code&gt;Widgets&lt;/code&gt; internos receberá a animação &lt;code&gt;Hero&lt;/code&gt;, utilizamos a mesmo &lt;code&gt;flag&lt;/code&gt; na página principal.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mgRkgWWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u6cfs5bbwyyzh0pq2p1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mgRkgWWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u6cfs5bbwyyzh0pq2p1.png" alt="Image description" width="800" height="1180"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agora vamos à navegação: para que o &lt;code&gt;Hero&lt;/code&gt; funcione não podemos utilizar o &lt;code&gt;showDialog&lt;/code&gt; do Flutter, é preciso que chamemos o alert_dialog_widget usando a navegação do Flutter; e para isso, utilizar-nos-emos do &lt;code&gt;PageRouteBuilder&lt;/code&gt;. Para facilitar, extrairemos a navegação para uma &lt;code&gt;extension&lt;/code&gt; do &lt;code&gt;BuildContext&lt;/code&gt; e criaremos uma função chamada &lt;code&gt;openDialog&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kZF-d8TE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d47f204y5ormza83iwm7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kZF-d8TE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d47f204y5ormza83iwm7.png" alt="Image description" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Volte à sua página principal. No botão que escolheu para chamar a navegação, basta adicionar o código abaixo:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i_iPe5sH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qns0r0umtpgl1kq294hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i_iPe5sH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qns0r0umtpgl1kq294hs.png" alt="Image description" width="686" height="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pronto! Agora podemos abrir &lt;code&gt;páginas/dialogs&lt;/code&gt; no Flutter que suportam a animação &lt;code&gt;Hero&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O meu &lt;a href="https://github.com/DevLSerrano"&gt;Git&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>animation</category>
      <category>dart</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>[PT-BR] Extras do Hero Animation no Flutter</title>
      <dc:creator>Leonardo Serrano</dc:creator>
      <pubDate>Sat, 09 Apr 2022 13:38:54 +0000</pubDate>
      <link>https://dev.to/leonardos_dev/pt-br-extras-do-hero-animation-no-flutter-4f98</link>
      <guid>https://dev.to/leonardos_dev/pt-br-extras-do-hero-animation-no-flutter-4f98</guid>
      <description>&lt;p&gt;Olá amigos, vocês sabiam que podemos aplicar um widget durante a transição do Hero animation no Flutter ?&lt;br&gt;
É isto que vamos ver aqui hoje, olha como fica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pCVd_ASf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm4m1drl7f3znnjqq3mw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pCVd_ASf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm4m1drl7f3znnjqq3mw.gif" alt="Image description" width="148" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O primeiro passo é dar uma olhada na primeira parte do tutorial, para que conheça o Hero Animation e possa fazer o projeto, pois é a partir dele que vamos avançar.&lt;br&gt;
É bem rápido e pratico, leva alguns minutos.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://dev.to/leonardos_dev/pt-br-utilizar-hero-animation-no-flutter-202g"&gt;[PT-BR] Utilizar Hero Animation no Flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, agora que já fez isto vamos avançar.&lt;br&gt;
Nosso primeiro passo é baixar o Gif do nosso querido Dash, aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wnoOX5SB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7lqvppr7txmmx7gapte.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wnoOX5SB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7lqvppr7txmmx7gapte.gif" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de baixar, vamos ao arquivo &lt;strong&gt;"pubspec.yaml"&lt;/strong&gt; e liberar o acesso aos &lt;strong&gt;assets&lt;/strong&gt;. Ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DSyB6OP2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29o13svqwwi4bl2way1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DSyB6OP2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29o13svqwwi4bl2way1y.png" alt="Image description" width="547" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora na &lt;strong&gt;Raiz&lt;/strong&gt; do projeto vamos criar a pasta &lt;strong&gt;assets&lt;/strong&gt; e mover o ficheiro &lt;strong&gt;gif&lt;/strong&gt; lá para dentro. Ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6BZlVmic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1k8l00ukma5a9or7vz72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6BZlVmic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1k8l00ukma5a9or7vz72.png" alt="Image description" width="271" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos importar um packge para auxiliar o uso do Gif.&lt;br&gt;
&lt;a href="https://pub.dev/packages/gif_view"&gt;Gif_view&lt;/a&gt;&lt;br&gt;
Agora basta adicionar ao projeto, assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lNtYgN0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/klezi37uxw810rf2hovh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lNtYgN0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/klezi37uxw810rf2hovh.png" alt="Image description" width="548" height="144"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Você pode precisar reiniciar o projeto para que o ficheiro seja reconhecido.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Ok, a configuração está feita, vamos aos códigos.&lt;/p&gt;

&lt;p&gt;No arquivo &lt;strong&gt;main.dart&lt;/strong&gt; vamos até o nosso segundo &lt;em&gt;ElevatedButton&lt;/em&gt; para ter acesso a nossa &lt;em&gt;Hero Animation&lt;/em&gt;.&lt;br&gt;
Dentro do Widget Hero, nos vamos usar a função chamada &lt;strong&gt;flightShuttleBuilder&lt;/strong&gt; que vai nos permitir colocar um Widget para ser exibido durante a transição da animação.&lt;/p&gt;

&lt;p&gt;Ficara assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lQhHX_5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63krnpjn73v1wijh6x0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lQhHX_5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63krnpjn73v1wijh6x0l.png" alt="Image description" width="382" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No arquivo &lt;strong&gt;page2.dart&lt;/strong&gt; no Widget &lt;strong&gt;FlutterLogo&lt;/strong&gt; defina o size para 50 para visualizar melhor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora está quase pronto. Para que consiga visualizar melhor a animação e se tudo funciona bem, vamos até a função &lt;strong&gt;_nextPageSlow&lt;/strong&gt; e definir o &lt;em&gt;transitionDuration&lt;/em&gt; para &lt;em&gt;5000 milliseconds&lt;/em&gt;, assim vamos visualizar melhor.&lt;/p&gt;

&lt;p&gt;Abaixo o repositório para estudo mais aprofundado do funcionamento do Hero: &lt;br&gt;
&lt;a href="https://github.com/DevLSerrano/flutter_hero_animation"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agradeço sua leitura, espero que tenha gostado. 🤩&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>animation</category>
      <category>dart</category>
    </item>
    <item>
      <title>[PT-BR] Facilitando telas de loading com Asyncstate no Flutter</title>
      <dc:creator>Leonardo Serrano</dc:creator>
      <pubDate>Mon, 07 Feb 2022 17:05:34 +0000</pubDate>
      <link>https://dev.to/leonardos_dev/pt-br-facilitando-telas-de-loading-com-asyncstate-no-flutter-bh2</link>
      <guid>https://dev.to/leonardos_dev/pt-br-facilitando-telas-de-loading-com-asyncstate-no-flutter-bh2</guid>
      <description>&lt;p&gt;Olá amigos, neste artigo vou ensinar a utilizar um package chamado "Asyncstate", cuja finalidade é nos ajudar a chamar telas de loading com extrema facilidade.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://pub.dev/packages/asyncstate"&gt;Asyncstate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que o "Asyncstate" faz?&lt;/strong&gt;&lt;br&gt;
Através de uma "Extension" ou um "Mixin" ... o package inicia sua tela de loading ao mesmo tempo que inicia sua chamada assíncrona, mantendo a tela enquanto a chamada esta em execução e quando finalizada ele fecha a tela de loading para você.&lt;/p&gt;

&lt;p&gt;Chega de variáveis do tipo "isLoading =false" ou "isLoading =true" ... rsrs&lt;/p&gt;

&lt;p&gt;Vamos aos códigos ...&lt;/p&gt;

&lt;p&gt;Importe o package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asyncstate: ^0.0.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora no "main.dart" você deve adicionar o "AsyncState.observer" no navigatorObservers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      themeMode: ThemeMode.dark,
      navigatorObservers: [
        AsyncState.observer // !!!!!
      ], 
      theme: ThemeData.dark(),
      home: HomePage(),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão o package irá utilizar o "CircularProgressIndicator" para android e "CupertinoActionSheet" para iOS. Mas você pode edita-lo e ter o próprio loader, assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void main() {
  AsyncState.setLoaderPersonalized(
    defaultLoaderWidget: const MyLoading(), // !!!
  );
  runApp(const MyApp());
}    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dica: Pode alterar o loader em outra dependência de inicialização, por exemplo uma binding.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora em seu arquivo controller ... você pode utilizar Mixin ou Extensões.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mixin:&lt;/strong&gt;&lt;br&gt;
Envolva sua chamada com a função "callAsyncLoader" fornecida pelo Mixin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class HomeController with AsyncStateMixin {

  Future goBack(Function callback) async {
    return await callAsyncLoader(
      Future.delayed(
        const Duration(seconds: 3),
        () {
          callback();
        },
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Extensão:&lt;/strong&gt;&lt;br&gt;
Adicione a extensão ".asyncLoader()" ao fim de sua chamada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future&amp;lt;bool&amp;gt; login() async {
    try {
      return await Future.delayed(const Duration(seconds: 3), () {
     return true;
      }).asyncLoader();
    } catch (e) {
      // debugPrint(e.toString());
      return false;
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bônus: (Loading personalizado função.)&lt;/strong&gt;&lt;br&gt;
O package permite personalizar um loader para função especifica.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Future&amp;lt;bool&amp;gt; login() async {
    try {
      return await Future.delayed(const Duration(seconds: 3), () {
        return true;
      }).asyncLoader(
          customLoader: const MyCustomLoadingWidget(
        text: 'Sign in! Hold on!!!!',
      ));
    } catch (e) {
      // debugPrint(e.toString());
      return false;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, com uma sintaxe simples você não precisa mais se preocupar com suas telas de loading enquanto faz chamadas assíncronas.&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;a href="https://github.com/DevLSerrano/asyncstate/tree/main/example"&gt;App Exemplo&lt;/a&gt;&lt;br&gt;
Agradeço sua leitura, espero que tenha gostado. 🤩&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>[PT-BR] Utilizar Hero Animation no Flutter</title>
      <dc:creator>Leonardo Serrano</dc:creator>
      <pubDate>Mon, 19 Jul 2021 21:16:57 +0000</pubDate>
      <link>https://dev.to/leonardos_dev/pt-br-utilizar-hero-animation-no-flutter-202g</link>
      <guid>https://dev.to/leonardos_dev/pt-br-utilizar-hero-animation-no-flutter-202g</guid>
      <description>&lt;p&gt;Olá amigos, hoje vou mostrar como é simples utilizar a animação Hero do Flutter. Sabe aquela animção de transição de pagina onde o item se "move" junto e se posiciona em algum lugar da pagina, então, é isso que vamos aprender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Este é um exemplo do que vamos fazer ...
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cTe4-Gev--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lt9em1j79feqmi8stdk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cTe4-Gev--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lt9em1j79feqmi8stdk.gif" alt="heroGIF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então vamos começar ... para fazer a animação vamos precisar de:&lt;br&gt;
1˚ Crie um projeto Flutter.&lt;br&gt;
2° Crie uma "FloatingActionButton", e como "child" defina um "FlutterLogo".&lt;/p&gt;

&lt;p&gt;O Widget "FloatingActionButton" possui um parâmetro chamado "heroTag", nele vamos colocar a String "logo".&lt;/p&gt;

&lt;h6&gt;
  
  
  Para Widgets que não possuem "heroTag", você pode envolve em um Widget "Hero" e definir o parâmetro "tag" como desejar!
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4dBcp-y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/io80izrip4hkq8wg2mob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4dBcp-y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/io80izrip4hkq8wg2mob.png" alt="Captura de Tela 2021-07-19 às 19.36.05"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3˚ Agora crie uma pagina secundaria, chamarei de "Page2".&lt;/p&gt;

&lt;p&gt;Nesta pagina usaremos uma estrutura simples de Scaffold, em seu "body" colocaremos o Widget "FlutterLogo", mas desta vez, vamos envolve-lo em um Widget chamado "Hero".&lt;br&gt;
No widget "Hero", temos o parâmetro "tag", no qual você deve colocar a String "logo", que foi a mesma tag definida na primeira pagina.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HbfpwALH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bfofajp1fwjfty5xfanl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HbfpwALH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bfofajp1fwjfty5xfanl.png" alt="Captura de Tela 2021-07-19 às 19.41.14"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4˚ Agora é só definirmos o Navigator na pagina inicial, fazer um reload e ver a magica acontecer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Kogeqjl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ri0ghk8rvebpxp3306z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Kogeqjl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ri0ghk8rvebpxp3306z.png" alt="Captura de Tela 2021-07-19 às 19.46.13"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;Para ter uma transição mais lenta, pode-se utilizar o seguinte código ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9rsT6OQY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zmrmu2bf2hgcmfs3z2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9rsT6OQY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zmrmu2bf2hgcmfs3z2v.png" alt="Captura de Tela 2021-07-19 às 19.47.57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo o repositório para estudo mais aprofundado do funcionamento do Hero: &lt;a href="https://github.com/DevLSerrano/flutter_hero_animation.git"&gt;Link&lt;/a&gt;&lt;br&gt;
Agradeço sua leitura, espero que tenha gostado. 🤩&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>animation</category>
      <category>dart</category>
    </item>
  </channel>
</rss>
