Dissecando o Flutter — Ciclo de Vida de uma Aplicação Flutter

Igor L Sambo💙🇲🇿
GDG Maputo
Published in
4 min readDec 13, 2021

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.

  1. Ciclo de Vida de uma Aplicação Flutter (este artigo)
  2. 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!

--

--