Criado pela Google em maio de 2017, o framework Flutter se propõe a facilitar o desenvolvimento de aplicações multi-plataforma, a partir de uma única base de código, e com desempenho próximo ao das aplicações nativas dessas plataformas (Android, iOS, Web e desktop).
Sua arquitetura é distribuida em camadas, cada uma com diferentes níveis de abstração, o que permite que o desenvolvimento seja facilitado aos desenvolvedores, por um framework com alto nível de abstração, e que o desempenho seja mais aproximado ao de aplicações nativas, devido à camada embedder, codificada na linguagem específica de cada plataforma (Java / C++ para android, Objective-C, para iOS e C++ para Windows e Linux).
Na camada de mais baixo nível, o Embedder, temos as funções mais específicas de interação com os sistemas operacionais:
- Gerenciamento de Threads
- Gerenciamento do Loop de Mensagens de Eventos
- Funcionalidades específicas do Sistema Operacional (acessibilidade, entrada de dados, etc.)
Essa camada é escrita na linguagem específica do sistema onde a aplicação vai ser executada, sendo assim, existem diferentes “Embedders” utilizados pelo Flutter, um para cada plataforma.
No centro da arquitetura, está a Flutter Engine, escrita em C++, que oferece suporte para as principais funcionalidades das aplicações. Ela é responsável por rasterizar as cenas a cada novo frame a ser desenhado na tela, além de implementar as funções de mais baixo nível da API do Flutter, como os gráficos, que utilizam o motor Skia, layout de texto e I/O rede e arquivos.
Os desenvolvedores, interagem com o Flutter através da camada Framework, que é inteiramente escrita na linguagem Dart, uma linguagem fortemente tipada e orientada a objetos, muito similar à linguagem C, e por que não, ao Typescript. Essa camada contém os principais blocos de construção das aplicações, como animações, painting, gestures, e todas as widgets que são utilizadas na elaboração da interface gráfica dos apps.
O framework em si é relativamente pequeno, ele disponibiliza apenas as funcionalidades mais básicas de uma aplicação Flutter, porém, existe uma infinidade de pacotes disponíveis para download, que adicionam funcionalidades como:
- Câmera (camera)
- Bancos de Dados SQL (sqflite)
- Comunicação HTTP (http)
- Comunicação via MQTT (mqtt)
WIDGETS e INTERFACE GRÁFICA
Com relação ao desenvolvimento da interface gráfica das aplicações, vimos no diagrama acima a presença da camada de Widgets. É um conceito muito comum para os desenvolvedores de UI. Se você trabalha com React Native, provavelmente as conhece como Components.
Elas são o principal bloco de construção da interface. São as caixas de texto, os botões, os containers e também as imagens. Mas no Flutter, praticamente tudo o que é desenhado na tela é uma widget, a cor de um container, o padding entre dois botões, o estilo de um texto (itálico, negrito, etc) e até mesmo o alinhamento das widgets dentro de um container do tipo Column, por exemplo.
No Flutter, as widgets podem ser dinâmicas ou estáticas. Widgets estáticas são chamadas de Stateless Widget, todas as suas configurações são feitas durante a sua inicialização e ela não pode ser alterada durante a execução do programa. As dinâmicas são chamadas de Stateful Widget. Além da configuração inicial, elas também possuem um State, que define o estado atual da widget e, quando alterado, ele dispara novamente o método build() da widget, o que faz com que ela seja redesenhada na tela. Nesse processo, o framework identifica a diferença do estado atual para o estado anterior para que apenas as alterações sejam atualizadas na tela, evitando redundâncias e melhorando o desempenho do sistema.
Tradicionalmente, as interfaces são construídas de maneira imperativa, ou seja, são definidas em um arquivo separado (html, xml, por exemplo) e o estado das widgets definidas nesses arquivos é alterado através de métodos capazes de capturar as instâncias dessas wwidgets e modificá-las. No Flutter, a interface gráfica é construída de maneira declarativa, ou seja, é construída com a mesma linguagem das regras de negócio, em arquivos que podem conter tanto a declaração da interface quanto as regras de negócio. Para modificar a interface, o estado da widget é alterado, e isso faz com que a widget seja reconstruída com as novas configurações, como vimos a descrição das Stateful Widgets acima.
VANTAGENS X DESVANTAGENS
As principais vantagens oferecidas pelo framework são:
- Produtividade
- Desempenho
- Open Source
A produtividade é alta devido à proposta do Flutter de possibilitar o desenvolvimento de aplicações para diferentes plataformas através de uma única base de código. Com o Flutter, é possível desenvolver aplicações Web, Desktop (Windows, Linux e macOS), iOS e Android. Portanto, ao invés de ter várias equipes, cada uma desenvolvendo a mesma feature da aplicação para cada plataforma separadamente, é possível ter cada equipe desenvolvendo uma feature diferente para todas as plataformas, agilizando o processo de desenvolvimento.
O desempenho é garantido pelo fato de o código da aplicação ser compilado para a linguagem nativa da plataforma onde será executado, como vimos durante a revisão da arquitetura.
O fato de ser Open Source, garante ao Flutter, através da comunidade construída em seu entorno, a adição constante de correções e novas funcionalidades.
Dentre as desvantagens, aparecem:
- Tamanho de pacote gerado no build
- Legibilidade do código
- Linguagem de desenvolvimento nova
Uma aplicação desenvolvida com Flutter pode conter vários arquivos auxiliares para que seu funcionamento corra bem. Por isso, um aplicativo feito com o framework gerará um executável com tamanho maior do que aquele desenvolvido de maneira nativa para a plataforma. No mercado mobile, sabemos que isso é um fator importante. Muitos usuários podem não querer utilizar um determinado aplicativo se ele ocupar muito espaço na memória do dispositivo, o que pode afetar a distribuição da aplicação desenvolvida.
A legibilidade do código pode se tornar mais complicada com a utilização da interface declarativa. É exigida uma disciplina maior do desenvolvedor para que a mistura de interface gráfica com as regras de negócio no código não cause grandes dificuldades de entendimento, principalmente no momento de correções de bugs e manutenção.
O framework utiliza a linguagem Dart para desenvolvimento. Trata-se de uma linguagem que possui muitas similaridades com relação ao C e também ao JavaScript, sendo rapidamente dominada por desenvolvedores que conheçam essas linguagens, porém, isso demanda um determinado tempo de estudo, o que pode ser um empecilho para que empresas e desenvolvedores adotem o Flutter logo de cara.
A LINGUAGEM DART
Desenvolvida pela Google no ano de 2013, a linguagem Dart é fortemente tipada, com características similares ao C e também ao Javascript. É otimizada para desenvolvimento de UI e possui features como collection if, que auxiliam na customização do código para diferentes plataformas.
Outra característica que garante um bom uso em interfaces gráficas é a facilidade de utilização de métodos assíncronos.
Durante o desenvolvimento, as aplicações rodam numa máquina virtual Dart, o que proporciona o Hot Reload, ou seja, o código não precisa ser totalmente recompilado e a aplicação reiniciada do zero para que mudanças no código sejam aplicadas. Isso proporciona um grande ganho em agilidade no desenvolvimento, principalmente de aplicações onde o fluxo passe por diferentes telas.
Em produção, a linguagem garante alta performance através de compilação AOT (Ahead-of-time compilation), onde todo o código é compilado para a linguagem nativa da plataforma onde será executado, garantindo inicialização instantânea e alto desempenho.
CONCLUSÃO
O Flutter é um framework ainda em fase de desenvolvimento, porém é muito promissor. As features já entregues proporcionam aumento de produtividade e entregam aplicações mobile de qualidade com desempenho similar ao de aplicações nativas das plataformas.
Eryck Kazeker – Desenvolvedor na Opus Software