Dissecando o Flutter — Ciclo de Vida de uma Aplicação Flutter
Ciclo de Vida de uma Aplicação Flutter
O Flutter é minha ferramenta de trabalho no dia-á-dia e com isso é importante que eu perceba cada comportamento do mesmo e dos projectos que vou desenvolvendo com o Framework.
Quando iniciei minha jornada com Mobile Development, ainda na faculdade uma das primeiras coisas e mais fundamentais a entender (desenvolvimento Android) era o LifeCycle de uma aplicação, e quando fui a entrevista de emprego foi me colocada igualmente uma questão relacionada, com contexto, obviamente no Flutter.
Então, como podemos ver, embora não seja uma temática muito “palpável”, é de veras importante que um desenvolvedor perceba de modo a facilitar na construção de aplicações com maior performance e menos dispendiosas em termos de recursos para os dispositivos.
Este é o primeiro artigo da série que apelido como “Dissecando o Flutter”, onde irei abordar pequenos tópicos relativos a arquitectura do Flutter com o objectivo de explicar vários conceitos que podem passar-nos despercebidos ou simplesmente não os tentamos entender.
- Ciclo de Vida de uma Aplicação Flutter (este artigo)
- Ciclo de Vida de um Widget
Antes mais, o que é o ciclo de vida de uma Aplicação?
Primeiro, é importante clarificar e lembrar que quando desenvolvemos uma aplicação, esta irá correr em um dispositivo e os mesmos possuem recursos necessário para correr as mesmas, no caso consideramos a CPU e memória, irei usar apenas memória como referência no artigo. Sabemos igualmente que estes recursos são limitados, com isso, é importante que sejam geridos da maneira mais inteligente possível, não consumindo de forma desnecessária, e eventualmente tornar os dispositivos lentos e a longo tempo obsoletos. Para isso, as aplicações possuem um ciclo de vida, ou seja, elas são criadas quando se pretende realizar uma actividade, vivem e são destruídas no final de suas actividades.
Importante ainda é notar que este ciclo de vida é gerenciado pelo dispositivo e não pela aplicação em si, ou seja, a aplicação tem acesso a informação e podemos como desenvolvedores realizar operações específicas de acordo com o estado em que a aplicação se encontra no momento, não podendo alterar.
Long short, o ciclo de uma aplicação é simplesmente a representação do seu estado em runtime. Não estamos considerando o processo de instalação e desinstalação.
Ciclo de uma Aplicação Flutter
Dependendo da plataforma que a aplicação corre, a implementação deste conceito pode variar, podendo ser apenas a nomeclatura ou mesmo a lógica em si, sendo que temos alguns variam para iOS e Android (veremos a seguir).
Flutter como sendo cross-platform implementa uma combinação dos dois.
- detached indica que aplicação ainda está visível, porém, ocorreu uma acção que fez com que esta esteja a correr sem uma view, geralmente no momento em que fazemos o Navigator.pop().
- inactive indica que a aplicação está inactiva e não recebe nenhum input do utilizador, exemplo seria estarmos em uma chamada enquanto usamos a aplicação.
- paused indica que a aplicação não está visível ao utilizador, e não recebe igualmente inputs, estando a correr em background.
- resumed indica que aplicação está visível e a receber inputs do utilizador.
- suspending indica que aplicação suspensa por momento, sendo executada após o paused, equivalente ao onStop() no Android executado quando a aplicação perde foco inteiramente.
É possível fazer track destes estados fazendo uma implementação do WidgetsBindingObserver
que tem o método didChangeAppLifecycleState
Como é possível notar, criamos um StatefulWidget que implementa o WidgetsBindingWidgets de modo que possamos escutar as mudanças de estado.
class _LifeCycleManagerState extends State<LifeCycleManager>
with WidgetsBindingObserver
E recebemos widget ao qual vamos usar para controlar o estado da nossa aplicação, que é escutada com recurso ao observer que adicionamos.
LifeCycleManager({Key? key, required this.child}) : super(key: key);.....@override
Widget build(BuildContext context) {
return widget.child;
}
Por fim de modo que toda app seja objecto de estudo fazemos um wrap do nosso MaterialApp com o LifecycleManager, assim podemos escutar em qualquer ponto da app.
@override
Widget build(BuildContext context) {
return LifeCycleManager(
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
Para testar, basta apenas correr a aplicação e podemos simular alguns dos casos de uso, clicando no botão home e voltar a entrar na app.
Espero que tenha aprendido com este artigo e que se tenha divertido enquanto lia.
Agradecia que deixasse ficar o seu comentário, assim como sugestões para próximos tópicos a abordar, assim como sua curiosidade, podendo fazê-lo pela caixa de comentários, email igorlsambo1999@gmail.com ou twitter @lsambo02.
Obrigado por acompanhar até ao fim e espero por você no próximo artigo!