Você está na página 1de 113

DESENVOLVIMENTO

MOBILE COM
FLUTTER BÁSICO
Apostila do aluno
1

Rita Barbosa – Desenvolvedor Mobile


Bruno Rodrigues – Desenvolvedor Mobile
Autor da apostila

Larissa Jessica Alves – Analista de Suporte Pedagógico


Revisão da apostila

Fit Instituto de Tecnologia


Sorocaba, novembro de 2021

FIT-F.24.01-02 Rev.C
2

Autores e Instrutores

Rita de Cassia A. Barbosa, tecnóloga em


Processamento de Dados pela Faculdade de
Informática Tibiriçá de São Paulo, trabalha na área
TI a mais de 25 anos, se especializou em Gestão
de Negócios em TI. Atua no FIT como Analista de
Capacitação e docente de Ensino Médio Técnico
na Etec Martinho Di Ciero – Centro Paula Souza.

Mais informações em: https://www.linkedin.com/in/rita-barbosa-074641/

Bruno Rafael Santos Rodrigues: Possui graduação


em Engenharia de Computação pela Faculdade de
Engenharia de Sorocaba (2009) , Pós-graduado
em Redes de computadores pela UNICAMP e
Práticas do Project Management Institute (PMI)
pelo Senac Sorocaba. Atualmente é Analista de
Capacitação Técnica no FIT - Flextronics Instituto
de Tecnologia ministrando treinamentos na área
de IOT, desenvolvimento Mobile e Computação
em nuvem. Tem experiência como professor do Centro Universitário Senac . É
também instrutor da Cisco na plataforma NetAcademy
Mais informações em: http://lattes.cnpq.br/8416008762320926

FIT-F.24.01-02 Rev.C
3

APRESENTAÇÃO

O curso de Desenvolvimento Mobile com Flutter Básico com 16 horas,


visa atender a crescente demanda em desenvolvimento de aplicativos para
celular no Brasil. Segundo pesquisa realizada pela empresa App Annie no 2º.
Semestre de 2021, o Brasil é o país com a maior média de tempo gasto em
aplicativos para celular, seguido pela Indonésia com 5.3 horas e Índia com 4.9
horas. Segundo a empresa os resultados sugerem que a pandemia de Covid-19
impulsionou muito o aumento do tempo dos usuários nos aplicativos,
ocasionando um crescimento de 45%.
Assim a presente apostila é um instrumento teórico que complementa o
curso de Desenvolvimento Mobile com Flutter Básico, executado pelo FIT-
Instituto de Tecnologia. Nela apresentaremos a introdução sobre a história do
Flutter e da Linguagm DART, o conceito de closs-plataform e bem como a
instalação das ferramentas necessárias para desenvolvimento do código, como
também, todas as funções, lações e repetições. Finalizaremos o estudo com
exercícios práticos, desde a escrita do código, com também emulação do
ambiente. Para o Mundo do IOS, apresentaremos apenas os conceitos teóricos
básicos.
Desejamos a você prezado aluno que tenha um excelente curso!!

Boa Leitura!!

FIT-F.24.01-02 Rev.C
4

Indicação de ícones

FIT-F.24.01-02 Rev.C
5

Sumário
1. Android e IoS .................................................................................. 6

1.1 História do Android ...................................................................... 6

1.2 A Evolução dos Smartphones no Brasil ...................................... 9

2. História do iOS.............................................................................. 11

3. Introdução ao Flutter e ao DART ................................................. 13

3.1 Aprendendo sobre o Flutter ....................................................... 13

3.2 Instalação do Flutter SDK.......................................................... 14

3.3 Instalação do Android Studio - Windows ................................... 18

3.4 Instalação das Extensões do Flutter e Dart ............................... 23

3.5 SDK Manager ............................................................................ 25

3.6 Emulador ................................................................................... 26

3.7 Instalação Licenças Android...................................................... 33

3.8 Instalação do Android Studio - MacOS...................................... 36

3.9 Instalação e Configuração do VS Code – Windows/MacOS ..... 37

3.10 Configuração do Flutter Windows/MacOS ............................. 39

3.11 Criação do 1º. Projeto – Hello World – Exercício Prático ....... 41

3.12 O que são Widgets no Flutter?............................................... 50

3.13 Layout .................................................................................... 53

3.14 Linha (Row) ............................................................................ 54

3.15 Coluna (Column) .................................................................... 55

3.16 Texto (Text) ............................................................................ 55

3.17 Botão (Button) ........................................................................ 55

3.18 Imagem (Image) ..................................................................... 56

3.19 Histórico Dart ......................................................................... 57

3.20 Variáveis ................................................................................ 58

3.21 Operadores ............................................................................ 60

FIT-F.24.01-02 Rev.C
6

3.22 Operadores Relacionais ......................................................... 60

3.23 Condicionais........................................................................... 61

3.24 Repetições ............................................................................. 62

3.25 Funções ................................................................................. 63

4 Exercícios Práticos .......................................................................... 66

4.1 Exercício 1 – Primeiro aplicativo ............................................... 67

4.2 Exercício 2 – Utilizando estruturas com linhas e colunas .......... 69

4.3 Exercício 3 – Aplicativo com imagens ....................................... 74

4.4 Exercício 4 – Aplicativo com várias paginas.............................. 81

5 Publicação de Aplicativo nas Lojas: Google Play e Apple Store .... 102

5.1 Criando uma conta de desenvolvedor no Google Play ........... 102

5.2 Criando uma conta de desenvolvedor na App Store ............... 103

6 Desafio ........................................................................................... 105

Conclusão ............................................................................................ 107

Referências.......................................................................................... 108

CONTROLE DE REVISÃO DO DOCUMENTO / DOCUMENT REVISION


CONTROL ...................................................................................................... 109

FIT-F.24.01-02 Rev.C
6

1. Android e IoS

1.1 História do Android

Segundo o site Wikipédia, o Android é um sistema operacional com base


no núcleo Linux, e tem o Google como principal colaborador, na qual é também
participante do Open Handset Alliance.

O Android foi projetado para atender principalmente dispositivos móveis


(smartphones e tablets), interface específica para TV (Android TV), carros
(Android Auto), relógios inteligentes (Wear OS), consoles de videogames,
câmeras digitais, computadores e outros dispositivos eletrônicos.

. O sistema operacional utiliza-se da tela sensível ao toque para que o


usuário possa manipular objetos virtuais, assim como um teclado virtual.

Sistema Operacional – conjunto de programas para gerenciar:


dispositivos de hardware, processos, entrada/saída de dados,
sistema de arquivos e interface para o usuário.

Em 2003, na cidade de Palo Alto na Califórnia, os desenvolvedoresr Andy


Rubin, Rich Miner, Nick Sears e Chris White, fundaram a Android Inc. Rubin
definiu o Android Inc. como: "Dispositivos móveis mais inteligentes e que estejam
mais cientes das preferências e da localização do seu dono". Os projetos nesta
época, eram desenvolvidos de forma secreta.

A ideia original dos criadores era lançar um inovador sistema para


câmeras digitais, porém, ao verem que o mercado não era tão amplo quanto
gostariam, resolveram focar no mercado mobile. Na época, Rubin e sua equipe
ofereceram um novo meio de sistema operacional móvel, ou seja, o Open
Source, baseado no Kernel Linux.

FIT-F.24.01-02 Rev.C
7

O sistema constava com uma interface simples, funcional e também


integrada a vários instrumentos. A ideia era oferecer um sistema gratuito para
todas as pessoas que quisessem ter acesso a ele e também ser simples aos
desenvolvedores.

Em 2005, o Google adquiriu a Android Inc, nascendo a partir daí a Google


Mobile Division, divisão de pesquisa em tecnologia móvel.

No ano de 2007, fabricantes como Samsung, Sony, HTC, Sprint Nextel,e


T-Mobile, Qualcomm e a Texas Instrumentes e o Google, reuniram-se em um
consórcio de tecnologia e fundaram a Open Handset Alliance, visando a união
de marcas para a criação de uma plataforma de código aberto para smartphones.

Desta união, surgiu o primeiro Android comercial do mercado,


funcionando no HTC Dream, lançado oficialmente em 22 de outubro de 2008.

Figura 1 - HTC Dream. Fonte: Oficina da Net.

O código-fonte do sistema Android é aberto e desenvolvido pelo Google


que publica a maior parte do código (incluindo o código de rede e telefonia),
sob a licença não-copyleft Apache versão 2.0.

FIT-F.24.01-02 Rev.C
8

Esse tipo de licenciamento não garante direitos ao uso da marca


Android, portanto operadoras e fabricantes devem obter a licença sob
contratos individuais.

O fato do Android ser um sistema aberto e extremamente customizável,


permite seu uso em demais outros equipamentos eletrônicos como
notebooks, smartbooks, smart TV, câmeras, óculos, smartwatches, fones de
ouvido, tocades de CD/DVD de carros, espelhos, MP3, telefones fixos e vídeo
games.

Em relação aos versionamentos, a primeira versão alpha, foi lançada


em novembro de 2007, e em seguida a segunda versão comercial e estável,
o Android 1.0, lançado em setembro de 2008.

Os versionamentos estão em constante desenvolvimento pela Google


e a organização Open Handset Alliance. Estas atualizações geralmente
corrigem erros e adicionam novas funcionalidades. Abaixo, citamos

Desde abril de 2009, as versões Android foram desenvolvidos sob um


codinome (exceto Android 1.0 e 1.1) e lançadas em ordem alfabética: 1.0, 1.1,
Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream
Sandwich, Jelly Bean, KitKat, Lollipop, Marshmallow, Nougat, Oreo, Pie, Q, R,
S.

FIT-F.24.01-02 Rev.C
9

Do Android 1.5 (Cupcake), lançado em 27 de abril de 2009, até o


Android 9 (Pie), lançado em 06 de agosto de 2018, foram lançados apenas
versões com nomes de doces, perdurando até o primeiro semestre de 2019.
A partir de setembro de 2019, as versões estão sendo referenciadas com
números. Na figura abaixo podemos verificar esses versionamentos:

Figura 2 - Versionamento SO Android. Fonte: Wikipédia.

1.2 A Evolução dos Smartphones no Brasil

A primeira idéia de se criar um sistema de comunicação eficente


através de aparelhos telefônicos sem fio, ocorreu em 1947. O aparelho
celular só teve seu primeiro protótipo em 1973, um modelo Motorola DynaTAC
8000X, sendo que sua comercialização no mundo ocorreu em 1983.

Nos anos 90, a tecnologia de celulares conhecida por nós começou a


se desenvolver chegando aos atuais smartphones. Nessa época, surgiram
as primeiras mensagens de textos e alta tecnologia de redes de conexão
como: IDEN, CDMA, GSM.

O primeiro celular a ser comercilaizado no Brasil foi um Motorola PT-


550, aparelho que chegou junto com a rede de telefonia móvel no Rio de
Janeiro em 1990. Abaixo, ilustramos a evolução dos smartphones no Brasil:
FIT-F.24.01-02 Rev.C
10

Figura 3 - Evolução dos Smartphone Braisl. Fonte: Show me Tech.

Em relação aos smartphones, é importante lemrbrarmos dos


aplicativos. No ano de 2021, a indústria mobile mundial previu movimentar
US$ 6,3 trilhões. Neste meio, o Brasil, segundo dados da Pew Research, está
na liderança entre os mercados em desenvolvimento. Os dados indicam que
60% dos adultos têm um smartphone no bolso, um total que coloca o Brasil à
frente de outros nomes de peso como Filipinas (55%), México (52%) e Índia
(24%).
Outro parametro interessante, segundo App Annie, é que os brasileiros
passam cerca de três horas por dia utilizando aplicativos. Na média, de 70 a
80 softwares são instalados nos smartphones, sendo que de 30 a 40, apenas,
são efetivamente usados.

FIT-F.24.01-02 Rev.C
11

2. História do iOS

O iOS foi lançado em 2007 em conjunto com o iPhone na Macworld


Conference & Expo. Em 6 de março de 2008, a Apple lançou o primeiro beta,
juntamente com um novo nome para o sistema operacional: o "iPhone OS",
devido a rápida venda de dispositivos móveis, nasceu o interesse por parte da
Apple em desenvolver seu SDK.

Em 21 de fevereiro de 2007, a Cisco e a Apple anunciaram o uso do termo


iOS sob acordo, ou seja, para evitar qualquer ação judicial em potencial, a Apple
licenciou o "iOS" uma marca registrada da Cisco.

Em relação às atualizações do iOS, a Apple oferece as principais


atualizações para o iOS gratuitamente e, aproximadamente, uma vez por ano
pelo iTunes e (a partir do iOS 5) como download direto, pelo próprio aparelho. A
última versão, iOS 14 está disponível para o iPhone 6s, iPhone 6S Plus, iPhone
SE, iPhone 7, iPhone 7 Plus, iPhone 8, iPhone 8 Plus, iPhone X, iPad Air, iPad
Air 2, iPad (2017), iPad mini 2, iPad mini 3, iPad mini 4, iPad Pro (12,9
polegadas), iPad Pro (9,7 polegadas), iPad Pro (10,5 polegadas) e iPod touch
(6ª geração). Abaixo, uma tabela com as versões lançadas:

FIT-F.24.01-02 Rev.C
12

Ano de Última versão


iOS no lançamento
lançamento suportada
2007 iPhone OS 1.0 iPhone OS 3.1.3
2008 iPhone OS 2.0 iOS 4.2.1
2009 iPhone OS 3.0 iOS 6.1.6
2010 iOS 4 iOS 7.1.2
2011 iOS 5 iOS 9.3.6
2012 iOS 6 iOS 10.3.4
2013 iOS 7 iOS 10.3.3
2013 iOS 7 iOS 12.5.5
2014 iOS 8 iOS 12.5.5
2015 iOS 9 Mais recente
2016 iOS 9.3 Mais recente
2016 iOS 10 Mais recente
2017 iOS 11 Mais recente
2018 iOS 12 Mais recente
2019 iOS 13 Mais recente
2020 iOS 14.1 Mais recente
Figura 4 - Tabela versões iOS. Fonte: Wikipédia.

FIT-F.24.01-02 Rev.C
13

3. Introdução ao Flutter e ao DART

3.1 Aprendendo sobre o Flutter

O Flutter é uma estrutura (framework) feita para resolver problemas


específico. Sua construção foi realizada pela Google para facilitar o
desenvolvimento mobile multiplataforma (Android/iOS). De maneira geral, na
programação, um framework é um conjunto de códigos genéricos capaz de unir
trechos de um projeto de desenvolvimento. Para essa estrutura utilizamos
o Dart como principal linguagem de desenvolvimento que abordaremos mais
adiante.
A primeira versão do Flutter teve o codinome "Sky", era executada no
sistema operacional Android. Em 2015, foi apresentado na cúpula de
desenvolvedores Dart com a intenção declarada de ser capaz de renderizar
consistentemente 120 quadros por segundo. Em 4 de dezembro de 2018, o
Flutter 1.0 foi lançado no evento Flutter Live, substituindo a primeira versão
"estável" do Framework. O Flutter Release Preview 2, foi anunciado durante na
keynote do Google Developer Days em Xangai.
Em 06 de maio de 2020 foi lançado o Dart SDK na versão 2.8 e o Flutter
na versão 1.17.0, onde foi adicionado suporte a API Metal (proporciona melhor
desempenho no IOS), melhorando muito o desempenho em dispositivos IOS em
50%, novos widgets do Material e novas ferramentas de rastreamento de rede.
Atualmente, estamos na versão 3.0.4 (jul/2022) e, na sessão de instalação
do Flutter SDK poderemos observar essa evolução.
O Flutter permite o desenvolvimento do código em “Cross-Platform”.
Baseia-se no uso de um framework que possibilita ao programador desenvolver
um código que seja executado em várias plataformas, em nosso caso específico,
ANDROID e IOS.

FIT-F.24.01-02 Rev.C
14

No que se refere a arquitetura do Flutter, na criação de um aplicativo, seu


código é compilado para a linguagem base do dispositivo, ou seja, as aplicações
são realmente nativas e por isso conseguem acessar recursos do dispositivo
sem a “ajuda” de terceiros e com maior desempenho.

Figura 5 - Ilustração do acesso direto aos recursos nativos no Flutter. Fonte: treinaweb.’

3.2 Instalação do Flutter SDK

O Flutter SDK pode ser utilizado no Windows, MacOS e Linux.

Para iniciarmos a instalação, acesse o link : https://flutter.dev/ e clique no


canto superior direito do site em “Get Started”:

Figura 6 - Acesso Flutter SDK para download. Fonte: Flutter.

FIT-F.24.01-02 Rev.C
15

I. Escoha o Sistema Operacional Windows:

Figura 7 - Sistema operacional. Fonte: Flutter.

II. Importante atentar-se para os requisitos de sistema:

Figura 8 - Requisitos de sistema. Fonte: Flutter.

FIT-F.24.01-02 Rev.C
16

Figura 9 - Download Flutter SDK. Fonte: site oficial Flutter.

III. Verifique na sua pasta de Download se o arquivo foi salvo no formato Zip,
transfira- o para outro pasta, recomendamos criar uma pasta na raiz com
o nome src e inicie a instalação do Flutter neste diretório. O caminho final
da instalação deverá ser c:\src\flutter.

É importante salientar que, conforme recomendação do site,


procure não instalar o Flutter no diretório C:\Program Files\.
Outro ponto importante, para a instalação dos softwares
necessários para acompanhamento deste curso, o aluno
deverá ter acesso de administrados nas máquinas os softwares
serão instalados.

IV. Para o funcionamento do Flutter, será necessário a instalação do:


PowerShell (no caso de versões abaixo do Windows 10) e o Git. Para as
versões abaixo do Windows 10, deixaremos o link para instalação do
Power Shell:
https://docs.microsoft.com/pt-br/powershell/scripting/install/installing-
powershell-on-windows?view=powershell-7.2#msi, neste link haverá a
explicação passo a passo para instalação e devidas configurações.

FIT-F.24.01-02 Rev.C
17

V. Para este curso será necessário executar alguns comando na console do


Flutter. Para tanto, alguns sistemas operacionais precisam que o path
seja definido nas variáveis do ambiente do Windows, sendo:

a. Abra o painel de controle do Windows, clique na opção Contas de


Usuário > Contas de Usuário > “Alterar variáveis de ambiente”,
conforme imagem abaixo:

Figura 10 - Variáveis de Ambiente. Fonte: autoria própria.

b. Na seção de variáveis de ambiente de usuário, procure a variável


chamada “Path”, dê 02 cliques.
c. Adicione à variável “Path” o caminho para a pasta C:\flutter\bin,
clicando no botão Novo. Não se esqueça de separar a nova
entrada das entradas pré-existentes com um ponto e vírgula (;).
d. Reinicie o Windows.

FIT-F.24.01-02 Rev.C
18

Figura 11 - Variáveis de Ambiente. Fonte: autoria própria.

VI. O procedimento de instalação do Flutter para o MacOS é praticamente


similar ao ambiente Windows, Após este procedimento, crie uma pasta
no usuário do MacOS chamada “development” e extraia o conteúdo na
pasta.

3.3 Instalação do Android Studio - Windows

Segundo Developers o Android Studio é um IDE (ambiente de


desenvolvimento integrado) para desenvolver na plataforma Android. Foi
anunciado em 16 de Maio de 2013 na conferência Google I/O. Android Studio é
disponibilizado gratuitamente sob a Licença Apache 2.0”.
Para a instalação do Android Studio entre no site:
https://developer.android.com/studio?hl=pt-br, o site irá identificar a sua versão
do Windows, basta apenas clicar no botão verde entitulado”Download Android
Studio” e siga os passos de instalação, a versão que iremos instalar é a
2021.1.1.21 Patch 1 no Windows, conforme abaixo:

FIT-F.24.01-02 Rev.C
19

I. Esta é a tela de apresentação do Android Studio, clique em “Next”:

Figura 12 - Instalação do Android Studio. Fonte: autoria própria.

Figura 13 - Instalação do Android Studio. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
20

II. Na sequência, o Android Studio apresentará o caminho de instalação


do produto, que deverá em C:\Program Files\Android\Android Studio.
Atenção - Não modifique o caminho de instalação, pois, isso poderá
comprometer o funcionamento do IDE.

Figura 14 - Caminho de instalação do Android Studio. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
21

III. Selecione “Install”:

Figura 15 - Instalação do Android Studio. Fonte: autoria própria.

IV. Clique em “Next”:

Figura 16 - Status da instalação do Android Studio. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
22

Figura 17 - Finalização da Instalação. Fonte: Developer.

V. Ao finalizar a instalação, o Android Studio será inicializado e aparecerá


uma tela de apresentação dos novos recursos, bem como alertas de
atualização de Plugins, clique em “Upadate” para realizar o download
e instalação.

Figura 18 - Página inicial Android Studio. Fonte: Developer.

FIT-F.24.01-02 Rev.C
23

VI. Ao finalizar cada upadate, clique em “Finish”. Na última atualização de


plugins, reinicie se Android Studio para que as atualizações sejam
concretizadas.

Figura 19 - Página inicial Android Studio. Fonte: Developer.

3.4 Instalação das Extensões do Flutter e Dart

I. No menu do lado esquerdo, clique em File, Settings, Plugins, e


verifique se os plugins do Flutter e Dart estão instalados, clique na
aba “installed” para verificar. Vá até a caixa de pesquisa e digite
Flutter e veja se está com o status “instaled”. Faço o mesmo com
o Dart.

FIT-F.24.01-02 Rev.C
24

Figura 20 - Tela de instalação de Plugins. Fonte: autoria própria.

II. Caso não estejam instalados, pesquise por “Dart”, clique em


“Install” e aguarde a instalação até o final:

Figura 21 - Plugin Dart. Fonte: Developer.

III. Na sequência pesquise por “Flutter”, clique em “Install” e aguarde


a instalação até o final:

FIT-F.24.01-02 Rev.C
25

Figura 22 - Plugin Flutter. Fonte: Developer.

IV. Após a instalação, o Android Studio poderá aparecerá um botão ao


lado do plugin instalado, ‘restart IDE”, clique para reinicializar seu
Android Studio.

3.5 SDK Manager

No menu principal do Android Studio, clique em Tools, e selecione SDK


Manager. Há também a opção via ícone no Menu Princpal, conforme figura
abaixo do lado direto:

Figura 23 - SDK Manager. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
26

V. Na opção “SDK Tools”

 Selecione a opção “Android SDK Command line Tools” e click em ok:

Figura 24 - SDK Tools. Fonte: autoria própria.

3.6 Emulador

Para criar o emulador no Android Studio, crie primeiramente um novo


projeto. No menu principal, clique em File, New, New Flutter Project, a seguinte
tela aparecerá conforme abaixo, veja o caminho apontando para a crialão do
projeto, deverá ser o mesmo onde o Flutter SDK foi instalado.

FIT-F.24.01-02 Rev.C
27

Figura 25 - Criação de Projeto no Flutter. Fonte: autoria própria.

Na sequência, dê um nome ao seu projeto e selecione o caminho onde


está instalado o Flutter, conforme o exemplo abaixo:

FIT-F.24.01-02 Rev.C
28

Figura 26 - Criação de Projeto no Flutter. Fonte: autoria própria.

Em seguida abra o seu projeto, clique em “The Window”, conforme abaixo:

Figura 27 - Iniciando Projeto no Flutter. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
29

I. Clique na aba, Tools, Device Manager do menu principal do Android


Studio:

Figura 28 - Device Manager. Fonte: autoria própria.

II. Na sequência, clique em Create Virtual Device, conforme abaixo:

Figura 29 - Criando Device. Fonte: autoria própria.

III. Agora, será possível escolher o tipo de dispositivo. A lista de


categorias à esquerda apresenta todos os tipos de dispositivos
disponíveis para emular. Selecione Phone e na lista de dispositivos,
marque o Nexus 6 e clique em “Next”.

FIT-F.24.01-02 Rev.C
30

Figura 30 - Selecionando Dispositivo Nexus. Fonte: autoria própria.

IV. O próximo passo, será a escolha da versão do Android no dispositivo


virtual, que será executado. Selecione, por exemplo o Nougat API 25
e certifique-se o valor x86 na coluna API. Faça o download e na
sequência clique em “Next”.

Figura 31 - Instalação Nougat 6. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
31

V. A última tela permite confirmar suas escolhas e oferece opções para


configurar algumas outras propriedades, como nome do dispositivo,
orientação de inicialização. Por enquanto, use os padrões e clique em
Finish:

Figura 32 - Configuração final do AVD Manager. Fonte: autoria própria.

VI. O Emulador aparecerá na tela do AVD Manager, conforme abaixo:

Figura 33 - Emulador configurado - AVD Manager. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
32

VII. No canto direito de cada emulador há uma coluna “Actions”, clique no


ícone para executar o emulador, na sequência aparecerá a seguinte
tela:

Figura 34 - Emulador AVD Manager em execução. Fonte: autoria própria.

VIII. Para aumentar a visualização do emulador, clique em +, conforme


abaixo

Figura 35 - Emulador AVD Manager em execução. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
33

3.7 Instalação Licenças Android


As licenças do Android se fazem necessárias no processo para sanar
alguns erros como:

 License status is unknown


 Android license starus unknown
 Android sdkmanager tool not found
 The system cannot find the path specified

A seguir, os passos e configurações necessárias:

I. Clique no menu principal em Tools, SDK Manager:

Figura 36 - SDK Manager. Fonte: autoria própria.

II. Em SDK Manager, acesse a guia SDK tools e desmarque a opção hide
obsolete package:

FIT-F.24.01-02 Rev.C
34

Figura 37 - SDK Tools - hide obsolete package. Fonte: autoria própria.

III. Escolha o pacote Android SDK tools obsolete e clicar em Apply:

Figura 38 - SDK Tools - hide obsolete package. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
35

IV. Confirmar o Download do pacote, clicar em Android SDK Tools com


Ok:

Figura 39 - SDK Tools – Download. Fonte: autoria própria.

Para finalizar a instalação do pacote, basta clicar em Finish:

Figura 40 - Fim da instalação. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
36

V. Na janela anterior a instalação, click em Ok para fechar o SDK Tools:

Figura 41 - Fim da instalação. Fonte: autoria própria.

3.8 Instalação do Android Studio - MacOS

A instalação do Android Studio no MacOS segue os mesmos passos


citados no tópico 2.3 Instalação do Androis Studio Windows, porém, antes da
sua instalação, se faz necessário a instalação do Java Development Kit na sua
última versão ( link para download:
https://www.oracle.com/java/technologies/downloads/#jdk18-mac).

Após a instalação do JDK, baixe o Android Studio a partir do site:


https://developer.android.com/studio?hl=pt-br#downloads e escolha a opção do
seu Imac, conforme abaixo:

FIT-F.24.01-02 Rev.C
37

Figura 42 - Android Studio para Imac. Fonte: autoria própria.

3.9 Instalação e Configuração do VS Code – Windows/MacOS

Agora que já temos as licenças instaladas, vamos Instalar e Configurar


Visual Studio Code.

Esse passo é Opcional, visto que se você quiser utilizar o Android Studio
sem problemas. Porém, o Android Studio exige mais recursos de hardware do
computador e se você possui um computador com pouca capacidade de
processamento e memória, o uso do VS Code é uma alternativa interessante.
Os passos a seguir valem também para as plataformas Linux e Mac.

I. Faça o download a partir do endereço:


https://code.visualstudio.com/download

II. Para nosso aprendizado, escolha o Sistema Operacional Windows ou


MacOS, conforme abaixo:

FIT-F.24.01-02 Rev.C
38

Figura 43 - Site para download VS Code. Fonte: Visual Studio.

III. Após a instalação, vamos instalar as extensões do Flutter e Dart,


Clique em configurações, e digite as extensões, uma de cada vez:

Figura 44 - Instalação de Extensões VS Code. Fonte: autoria própria.

IV. É importante salientar que para o MacOS os procedimentos de


instalação das extensões do Flutter e Dart são os mesmos executados
no Windows.

FIT-F.24.01-02 Rev.C
39

3.10 Configuração do Flutter Windows/MacOS

No início realizamos a instalação do Flutter, e agora, com as licenças do


Android SDK instaladas, podemos realizar as devidas configurações no Flutter.

Os procedimentos abaixo também são válidos para MacOS, onde o aluno


deverá executar os comandos no terminal do MacOS.

I. No seu computador, vá até o diretório onde foi instalado o Flutter, e


execute o arquivo flutter_console.bat.

Figura 45 - Arquivo flutter_console.bat. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
40

Figura 46 - Arquivo flutter_console.bat executado. Fonte: autoria própria.

II. O próximo passo será averiguar se existem erros nas instalações do


Android e demais programas, para isso, digite o comando: flutter
doctor

III. Caso a execução do comando apresente algum erro, esse será


relacionado a licença do Android, como na figura abaixo:

Figura 47 - Erro comando Flutter Doctor. Fonte: autoria própria.

IV. Para resolver esse problema, execute o comando: flutter doctor --


android-licenses.

V. Após execução do comando acima (flutter doctor --android-


licenses),será apresentado telas em espera para dar continuidade a

FIT-F.24.01-02 Rev.C
41

instalação. Pressione Y a cada tela de espera, esta será a confirmação


do aceite de configuração das instalações da licença.

VI. Finalizado o comando, execute novamente o flutter doctor e você terá


o seguinte status:

Figura 48 - Erro Flutter Doctor solucionado. Fonte: autoria própria.

A instalação dos IDE´s propostos neste apostila requerem


um computador com capacidade para instalação e execução,
conforme indicado no site de cada fabricante . Caso o aluno não possua
equipamento para a instalação destes IDE´s, recomendamos o Flutter Lab,
site com IDE online gratuito, disponível no link: https://flutlab.io/. No site, há
tutorial para criação dos projetos, mas o instrutor em aula poderá também
auxiliar o aluno na sua utilização.

3.11 Criação do 1º. Projeto – Hello World – Exercício Prático

Antes de criarmos nosso projeto Hello World, vamos mostrar


opcionalmente o carregamento do emulador do Flutter por linha de comando,
dentro da console do Flutter, conforme abaixo:

I. Digite o comando flutter emulator:

FIT-F.24.01-02 Rev.C
42

Figura 49 - Flutter mulatos. Fonte: autoria própria.

II. O próximo passo será digitar o comando flutter emulator --launch


<emulator id>. Na prática, ficará flutter emulator --launch
Nexus_6_API_22:

Figura 50 - Flutter emulators launch. Fonte: autoria própria.

III. Emulador configurado, vamos agora criar no 1º. Projeto Hello World.
Ainda na console do Flutter, digite flutter create hello_world, e veja
a criação do projeto, conforme abaixo:

FIT-F.24.01-02 Rev.C
43

Figura 51 - Criação do Projeto Hello World. Fonte: autoria própria.

Figura 52 - Criação do Projeto Hello World – continuação. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
44

Figura 53 - Criação do Projeto Hello World – finalização. Fonte: autoria própria.

IV. Projeto criado!! Agora iremos alterar e executar o código criado:

V. Abra o Android Studio e o projeto criado Hello World, conforme


abaixo:

FIT-F.24.01-02 Rev.C
45

Figura 54 - Android Studio, abrindo projeto Hello World. Fonte: autoria própria.

VI. Para abrir o projeto criado, no menu principal, click em File, Open
Project e localizem o arquivo hello_world e click em ok. O Android
Studio abrirá o arquivo main,dart onde iremos escrever nosso código.

VII. Nosso próximo passo será ativar o emulador dentro do Android Studio
da seguinte maneira: no canto direito da janela principal, clique no
ícone no formato de um celular, conforme abaixo:

FIT-F.24.01-02 Rev.C
46

Figura 55 - Android Studio, abrindo emulador Android. Fonte: autoria própria.

Note que aparecerá a tela do emulador em execução.

VIII. Agora iremos voltar para a tela do nosso main.dart para finalmente
executarmos nosso programa Hello World, apague todo o código
existente e digite o seguinte código no Android Studio:

import 'package:flutter/widgets.dart';
void main() {
runApp(
Center(
child: Text(
'Hello, world!',
textDirection: TextDirection.ltr,
),
),
);
}

IX. Depois do código digitado, vamos executá-lo, no menu principal, clique


em Run e escolha Run Dart, O código será executado e depois de
alguns poucos minutos o emulador apresentará a seguinte tela:

FIT-F.24.01-02 Rev.C
47

Figura 56 - Hello World em execução. Fonte: autoria própria.

X. Executar Hello World no VC Code - criado nosso projeto Hello World,


vamos testá-lo no VS Code, para isto, siga os seguintes passos: na
console do Flutter, vá para o diretório onde foi criado o projeto Hello
World. No nosso caso, cd\hello_world. Digite o comando flutter
clean (limpa diretório). Na sequência, digite flutter pub get(atribui
todas as dependências e libraries do flutter). E finalmente, vamos
chamar o VS Code. digite o comando code ., a tela inicial do VS Code
aparecerá da seguinte forma:

Figura 57 - Executando VS Code via console do Flutter. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
48

XI. Clique para aceitar e confiar nos autores no VS Code, em seguida,


Para editar o aplicativo, clique em: lib > main.dart. Veja que o Código
que utilizamos no Android Studio é o mesmo:

Figura 58 - Arquivo main.dart. Fonte: autoria própria.

XII. Para iniciar o código, aperte as teclas CRTL + F5. No topo superior do
Visual Studio Code abrirá uma pequena aba. Se você já possui
emuladores configurados, eles devem aparecer nessa aba. Se não,
basta selecionar a opção “Create New”:

Figura 59 - Execução Arquivo main.dart. Fonte: autoria própria.

XIII. O processo deve demorar alguns minutos, e você pode acompanhá-lo


através da pequena aba aberta no canto inferior direito:

FIT-F.24.01-02 Rev.C
49

Figura 60 - Execução emulador. Fonte: autoria própria.

XIV. Ao final do processo, o emulador abrirá automaticamente. Caos seu


aplicativo não seja executado, execute novamente o comando CRTL
+ F5. Entretanto, como o emulador já estará aberto, não será
necessário escolher nenhuma opção. O Flutter ficará responsável por
iniciar a aplicação no emulador e emitir todos os eventos e erros
através da aba “DEBUG CONSOLE” no rodapé do Visual Studio Code:

Figura 61 - Debug Console do Flutter. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
50

Nesse momento, no emulador seu aplicativo já será executado:

Figura 62 - Aplicativo criado automaticamente. Fonte: autoria própria.

3.12 O que são Widgets no Flutter?

Widgets são atalhos que facilitam o acesso a aplicativos e ferramentas no


celular. Todo aplicativo Flutter é um Widget formado de outras centenas de
Widgets. A ideia central é que você construa sua interface com Widgets. Os
Widgets do Flutter, foram inspirados no React.
Para melhor ilustrar o conceito de Widget, você poderá assimilar ao
“LEGO”, onde cada pequeno Widget representa uma peça e ao final, várias
peças compõem um brinquedo.

FIT-F.24.01-02 Rev.C
51

Figura 63 - Widgets. Fonte: Flutter para iniciantes.

Há apenas 02 tipos de Widgets: Stateless e Stateful.

 Stateless - Widget sem o controle de estado. Este tipo de widget não


possibilita alterações dinâmicas, entenda-o como algo completamente
estático. São utilizados para a criação de estruturas não mutáveis nos
aplicativos (telas, menus, imagens etc.), ou seja, tudo que não envolva
entradas de dados dos usuários, acessos a APIs e coisas que mudem ao
longo do processo.

 Stateful – Esse Widgets são praticamente o oposto dos Stateless.


Possuem estado e por conta disso, se tornam mutáveis. São elementos-
chave para o desenvolvimento móvel da forma interativa.

Ilustraremos abaixo esses 02 tipos para melhor entendimento:

FIT-F.24.01-02 Rev.C
52

Figura 64 - Tipos Widgets - Stateless e Stateful. Fonte: Medium.

No lado esquerdo, há uma tela baseada em um widget stateful, ou seja, a


tela será atualizada quando um cartão for excluído. Essa ação afetará seu
estado, fazendo com que exista uma nova renderização. No lado direito, uma
tela apenas exibe uma imagem e que permite uma mudança de rota, para que o
usuário retorne à tela anterior, sem alteração de estado alguma.
Podemos classificar os widgets em dois grupos principais: Layout e UI
(user interface).

Widgets de Layout: são aqueles que se preocupam apenas em


posicionar outros widgets, listamos abaixo alguns dos principais:
 Column
 Row
 ScaffoldStack

FIT-F.24.01-02 Rev.C
53

Widgets de Interface: são aqueles que efetivamente estão visíveis ao


usuário, como:
 Text
 Raised
 ButtonSwitch

Destacamos também dois conjuntos de widgets amplamente utilizados,


são eles: Material package, que segue as definições de layout do Material Design
e o Cupertino package, seguindo as definições de design do iOS. Estes pacotes
nos fornecem Widgets ready-to-use, bastando importá-los e utilizá-los no projeto.

Você pode ver mais detalhes sobre a documentação oficial de Widgets


em: https://flutter.dev/docs/development/ui/widgets-intro

3.13 Layout

O núcleo do mecanismo de layout do Flutter são os widgets. Como


já mencionamos, no Flutter, quase tudo é um widget até mesmo modelos
de layout são widgets.complexos.
Os widgets são organizados em uma árvore de widgets numa
hierarquia : pai e filho. Toda a árvore de widgets é o que forma o layout
visualiza na tel do celular. Abaixo temos um diagrama da árvore de
widgets para esta interface do usuário:

FIT-F.24.01-02 Rev.C
54

Figura 65 - Diagrama da Árvore Widgets. Fonte: Macoratti.

3.14 Linha (Row)

Widget que alinha componentes horizontalmente:

Figura 66 - Widget Linha (Row). Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
55

3.15 Coluna (Column)

Widget que alinha componentes verticalmente:

Figura 67 - Widget Coluna (Column). Fonte: autoria própria..

3.16 Texto (Text)

Exibe um texto de estilo único:

Figura 68 - Widget Text (Text). Fonte: Simoes.

3.17 Botão (Button)

Exibe um botão para a aplicação.


/FlatButton(
color: Colors.blue,
textColor: Colors.white,
disabledColor: Colors.grey,
disabledTextColor: Colors.black,
padding: EdgeInsets.all(8.0),
splashColor: Colors.blueAccent,
onPressed: () {
/*...*/
},
child: Text(
"FlatButton",
style: TextStyle(fontSize: 20.0),
),
)FlatButton(
color: Colors.blue,
textColor: Colors.white,
disabledColor: Colors.grey,

FIT-F.24.01-02 Rev.C
56

disabledTextColor: Colors.black,
padding: EdgeInsets.all(8.0),
splashColor: Colors.blueAccent,
onPressed: () {
/*...*/
},
child: Text(
"FlatButton",
style: TextStyle(fontSize: 20.0),
),
)

Figura 69 - Widget Botão (Button). Fonte: autoria própria.

3.18 Imagem (Image)

Exibe imagens, sendo que os formatos suportados são JPEG, PNG,


GIF, GIF animado, WebP, WebP Animado, BMP e WBMP, e, podemos
exibir imagens locais e imagens remotas, obtidas a partir de uma url.

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Exibindo imagem local')),
body: Column(
children: <Widget>[
Image.asset(
'imagens/logomac.png',
),
Text('Macoratti.net')
],
),
),
);
}
}
Figura 70 - Widget Botão (Button). Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
57

3.19 Histórico Dart

Dart (originalmente denominada Dash) é uma linguagem de programação


voltada à web, desenvolvida pela Google. O objetivo da linguagem Dart
inicialmente foi substituir o JavaScript como linguagem principal embutida nos
navegadores.
Em novembro de 2013 foi lançada a primeira versão estável Dart 1.0. e,
em agosto de 2018 foi lançado o Dart 2.0, um reboot da linguagem, otimizado
para o desenvolvimento client-side (executada no cliente) para Web e
dispositivos móveis.
Abaixo algumas características da linguagem:

 A sintaxe é C-like, para quem tem experiência com C#, PHP ou


Javascript, não terá dificuldades em aprender a linguagem;

 Segue o paradigma orientado a objetos;

 Todos os objetos herdam da classe Object;

 Fortemente tipada, significa que uma vez que a variável foi declarada com
um tipo ela será até o seu fim do mesmo tipo e também normalmente
possuem declaração explicita de tipo onde o tipo da variável deve ser
especificado logo na sua declaração;

 Palavras reservadas são representadas por um underline (_) no início do


nome de um atributo, método ou classe para torná-lo privado.

 Dart pode ser compilada em ahead-of-time (AOT - processo de


compilação que ocorre antes da execução do aplicativo e não durante) e
just-in-time (JIT - é a compilação de um programa em tempo de
execução).

FIT-F.24.01-02 Rev.C
58

3.20 Variáveis

Variável é um local para armazenar temporariamente alguma


informação. Os principais tipos de variáveis são:

void main() {
// Variável que armazena números inteiros
int idade = 33;
print("Idade: $idade");

// Variável que armazena números decimais


double raio = 10.25;
print("Raio: $raio");

// Variável que armazena caracteres e textos


String nome = "Kleber";
print("Ola $nome, seja bem vindo!");

// Variável que armazena verdadeiro ou false


bool ligado = true;
print("Ligado: $ligado");

// Variável que guarda uma lista genérica


List numerosGenericos = [10, "Kleber", true, 20];
print(numerosGenericos);

// Variável que guarda uma lista de números inteiros


List<int> numerosInteiros = [10, 20, 30, 40];
print(numerosInteiros);

// Variável que guarda um dicionário com chave e valor em formato


texto
Map<String, String> nome_sobrenome = {"Kleber": "Andrade",
"Claudia": "Trevisan"};

// Variável sem tipo definido, seu tipo é igual ao tipo do


primeiro valor que recebe
var sobrenome = nome_sobrenome[nome];
print("O sobrenome do $nome é $sobrenome");

// Constantes (valores imutáveis)


const double pi = 3.1416;
print("O valor de PI é $pi");

// Variável dinâmica (neste momento é do tipo inteiro pois


recebeu o valor 10)

FIT-F.24.01-02 Rev.C
59

dynamic x = 10;
print(x);

// O tipo da variável pode ser alterada em tempo de execução


(agora é um texto)
x = "Curso";
print(x);
}
Figura 71 - Variáveis DART. Fonte: autoria própria.

O resultado será:

Figura 72 - Variáveis DART – resultado. Fonte: Medium.

Como podemos verificar acima, há três tipos para armazenar valores


numéricos, sendo:
Int - armazenao de qualquer número inteiro, seja ele negativo ou positivo;
Double - armazena números de pontos flutuantes;
String - são vetores de caracteres que podemos representar com aspas
duplas ou aspas simples;
Bool – booleano, armazena valores true (verdadeiro) e false (falso);
Dynamic - atribuir valores de todos os outros tipos, permitindo a
modificação desses valores em tempo de execução;
List – utilizado no Dart para criação de vetores do tipo lista, permitindo
criá-las vazias ou atribuindo valores na criação;
Map - estrutura similar à uma List porém, trabalha com o conceito de
chave e valor, ou seja, não se trata de uma lista simples.

FIT-F.24.01-02 Rev.C
60

Const – tem por objetivo, tornar um objeto uma constante, ou seja,


quando se define um objeto como constante, esse não poderá ter seu valor de
estado alterado após sua inicialização.

3.21 Operadores
Os tipos int, double e num (pode ser inteiro ou ponto flutuante)
fornecem diversos métodos e propriedades que podem ser utilizados para
a transformação e checagem de dados.
Abaixo apresentamos os operadores de comparação e simples,
utilizados no Dart:
Operador Descrição
>= Maior ou igual
> Maior
<= Menor ou igual
< Menor
|s Mesmo tipo
|s! Não é mesmo tipo
== Igual
!= Diferente
&& E” lógico (AND)
|| E” lógico (AND)
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Percentual (resto da divisão)
Tabela 1 - Tipos de operadores de comparação. Fonte: autoria própria.

3.22 Operadores Relacionais


Operadores relacionais são usados para comparações no Dart. O
resultado de cada expressão é sempre um bool (boolenao), ou seja terá o
valor que é true ou false.

FIT-F.24.01-02 Rev.C
61

3.23 Condicionais
As Condicionais são utilizadas para tomada de decisão no código, sendo:
void main(){
double media = 4.9;

// IF (condiçao verdadeira) / ELSE


if (media < 6.0){
print("Reprovado!");
} else {
print("Aprovado!");
}

/* Podemos também utiliar IF TERNÁRIO


* CONDIÇÃO ? RETORNO VERDADEIRO : RETORNO FALSO
*/
print(media < 6.0 ? "Reprovado!" : "Aprovado");

/* Toda variável declarada e que não recebe valor,


automáticamente é nula
* VARIAVEL ?? RETORNO CASO SEJA NULO
*/
String linguagem;
print(linguagem ?? "Não Informado");

linguagem = "Dart";
print(linguagem ?? "Não Informado");

/* SWITCH / CASE / DEFAULT


* Utilizado geralmente quando temos constantes
* Cada cláusula de case não vazio termina com uma instrução
break, como regra.
*/
switch(linguagem){
case "Dart":
print("É Dart!");
break;
case "Java":
print("É Java!");
break;
case "C#":
print("É C#!");
break;
default:
print("Não sabe no que programa");
}
}
Figura 73 - Condicionais DART. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
62

O resultado de execução deste código será:

Figura 74 - Condicionais DART – resultado. Fonte: Medium.

3.24 Repetições

As Repetições são utilizadas para processos de repetição no


código, usando os comandos FOR, WHILE, DO/WHILE ou FOREACH
sendo:

void main(){
// Repetição de 0 a 5 (conhecemos o número inicial e final)
// FOR (INICIO; CONDIÇÃO; INCREMENTO)
for(int i = 0; i < 5; i++){
print(i);
}

// Repetição de 0 a 5
// INICIO; WHILE (CONDICAO){ INCREMENTO; }
// Teste condicional no início
int j = 0; // Início
while(j < 5){ // Condição
print(j);
j++; // Incremento
}

// Repetição de 0 a 5
// INICIO; DO { INCREMENTO; } WHILE(CONDICAO);
// Teste condicional no final
int k = 0; // Início
do {
print(k);
k++; // Incremento
} while(k < 5); // Condição

// Conjunto de números (Lista)


List numeros = [0, 1, 2, 3, 4];
FIT-F.24.01-02 Rev.C
63

// FOREACH
// FOR (VARIAVEL DENTRO DO CONJUNTO)
for (int numero in numeros){
print(numero);
}
}
Figura 75 - Repetições DART. Fonte: autoria própria.

Os resultados de execução desse código serão os valores 0, 1, 2,


3, 4 para cada tipo de repetição executada.

3.25 Funções

Funções são objetos e possuem um tipo- Função. Isso significa que


as funções podem ser atribuídas a variáveis ou passadas como
argumentos para outras funções.

// Função sem parâmetros


void escreverBemVindo(){
print("Seja bem-vindo!");
}

// Quando a função só tem um comando interno, você pode usar desta


forma
void escreverDesculpas() => print("Desculpa, encontramos um
erro.");

// Função com passagem de parâmetros (podem ter quantos parâmetros


quiser)
void calcularSoma(double a, double b){
double resultado = a + b;
print(resultado);
}

// Função que retorna uma variável do tipo double


double calcularSubtracao(double a, double b){
double resultado = a - b;
return resultado;
}

// Exemplo reduzido de uma função que retorna valor


double calcularAreaCirculo(double raio) => 3.14 * raio * raio;

FIT-F.24.01-02 Rev.C
64

// Função com parâmetros opcionais (utiliza-se os parâmetros dentro


de chaves {})
void exibirNomeCursoIdade(String nome, {int idade, String curso}) {
if(idade != null && curso != null) {
print("$nome tem $idade anos e faz o curso de $curso.");
} else if(idade == null && curso != null) {
print("$nome faz o curso de $curso.");
} else if(idade != null && curso == null) {
print("$nome tem $idade anos.");
} else {
print("Ola $nome");
}
}

// Passar funções como parâmetros


void calcular(double a, double b, Function funcao){
funcao(a, b);
}

// Função principal
void main() {
// Executando a função escreverBemVindo()
escreverBemVindo();

// Executando a função escreverDesculpas()


escreverDesculpas();

// Executando a função calcularSoma(a, b)


calcularSoma(10, 20);

// Executando a função calcularSubtracao(a, b)


print(calcularSubtracao(10, 20));

// Executando a função calcularAreaCirculo(raio)


print(calcularAreaCirculo(10));

// Execuntado a função exibirNomeCursoIdade(nome)


exibirNomeCursoIdade("Kleber");

// Execuntado a função exibirNomeCursoIdade(nome, idade)


exibirNomeCursoIdade("Kleber", idade: 33);

// Execuntado a função exibirNomeCursoIdade(nome, curso)


exibirNomeCursoIdade("Kleber", curso: "Ciência da Computação");

// Execuntado a função exibirNomeCursoIdade(nome, idade, curso)


exibirNomeCursoIdade("Kleber", idade: 33, curso: "Ciência da
Computação");

FIT-F.24.01-02 Rev.C
65

// Executando a função calcular(a, b, função), como função foi


passada a calcularSoma(a,b)
calcular(30, 20, calcularSoma);

// Executando a função calcular(a, b, função), como função foi


criado uma função anônima(a,b)
calcular(30, 20, (a, b){
var resultado = a * b;
print(resultado);
});
}
Figura 76 - Funções DART. Fonte: autoria própria.

O resultado de execução deste código será:

Figura 77 - Funções DART – resultado. Fonte: Medium.

FIT-F.24.01-02 Rev.C
66

4 Exercícios Práticos

Para começar a entender o framework Flutter precisaremos


planejar como construir nossa Widget Tree com os widget disponíveis.
O primeiro widget que devemos usar na construção do nosso
aplicativo é o widget Materialapp. Ele é uma classe predefinida no
flutter. É provavelmente o componente principal da aplicação.
E podemos acessar todos os outros componentes e widgets
fornecidos pelo Flutter SDK a partir do Materialapp.

Vamos praticar, execute o código abaixo no Android Studio, atentando os


passos necessários para criar um projeto, ativar o emulador.

FIT-F.24.01-02 Rev.C
67

4.1 Exercício 1 – Primeiro aplicativo

Figura 78 - Widget Tree. Fonte: autoria própria.

void main() {

runApp(

MaterialApp(

home: Center(

child: Container(

child: Text("Meu app"),

),

),

),

);

}
Figura 79 – Código Widget Tree. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
68

Figura 80 - Resultado do aplicativo. Fonte: autoria própria.

Temos o widget MaterialApp, que é o primeiro widget do


aplicativo. Usamos a propriedade “home:” para ligar ao widget Center.
O widget Center irá centralizar os próximos widget na tela. Usamos
a propriedade “Child:” para ligar ao widget Container.
O widget Container é como se fosse uma caixa que podemos
colocar outros widget dentro dele. Usamos a propriedade “Child:” para
ligar ao widget Text.
O widget Text mostra a informação na tela do App.

FIT-F.24.01-02 Rev.C
69

4.2 Exercício 2 – Utilizando estruturas com linhas e colunas

A partir do widget tree vamos aprender a trabalhar com linhas e colunas.


Vamos usar o widget Column que permite colocar os widget um ao lado
do outro, e o widget Row que permite colocar um widget a baixo do outro.

Figura 81 - Widget tree. Fonte: autoria própria.

O resultado da codificação da widget tree será:

Figura 82 - Resultado do aplicativo. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
70

A codificação ficará assim:

import 'package:flutter/material.dart';

void main() {

runApp(

MaterialApp(

title: "Layout",

home: Scaffold(

//cria a faixa na parte de cima

appBar: AppBar(

title: Text("Coluna e linha"),

),

body: Center(

child: Container(

//permite colocar um widget embaixo do outro

child: Column(

children: [

Container(

height: 50,

width: 50,

color: Colors.orange,

child: Center(

child: Text("orange"),
FIT-F.24.01-02 Rev.C
71

),

),

//coloca um espaçamento entre os widget

Padding(

padding: EdgeInsets.all(5),

),

//permite colocar um widget ao lado do outro

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

Container(

height: 50,

width: 50,

color: Colors.amber,

//centraliza e coloca um texto no widget

child: Center(

child: Text("Amber"),

),

),

Padding(padding: EdgeInsets.all(5)),

Container(

height: 50,

FIT-F.24.01-02 Rev.C
72

width: 50,

color: Colors.green,

),

],

),

Padding(padding: EdgeInsets.all(5)),

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

Container(

height: 50,

width: 50,

color: Colors.grey,

),

Padding(padding: EdgeInsets.all(5)),

Container(

height: 50,

width: 50,

color: Colors.deepOrange,

),

Padding(padding: EdgeInsets.all(5)),

Container(

FIT-F.24.01-02 Rev.C
73

height: 50,

width: 50,

color: Colors.indigo,

],

),

],

),

),

),

),

),

);

Figura 83 Código Linhas e Colunas. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
74

4.3 Exercício 3 – Aplicativo com imagens


Seguindo o widget tree abaixo, será possível inserir imagens no aplicativo.

Figura 84 – App Imagens. Fonte: autoria própria.

Vamos usar as propriedade do widget Container para adicionar um plano


de fundo no aplicativo.

A classe home , tem um widget container , vamos usar a propriedade


decoration para configurar um plano de fundo.
Na classe conteúdo vamos usar o widget Image.asset para adicionar
uma imagem disponível no projeto. E vamos usar o widget Image.network para
adicionar uma imagem por uma URL.

Para disponibilizar a imagem no projeto , crie uma estrutura de pasta na


raiz do projeto com os nomes: asset/imagem e coloque as imagens dentro
desse diretório.

FIT-F.24.01-02 Rev.C
75

Figura 85 – Estrutura pasta Asset. Fonte: autoria própria.

Configure o arquivo pubspec.yaml para disponibilizar as imagens no


projeto.
Na propriedade assets tire o # para descomentar a linha.
Então indique a estrutura de diretório para o projeto, respeitando a
indentação conforme a imagem abaixo:

Figura 86 – Configurando Pasta Asset – pubspec.yaml. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
76

O resultado deverá ser esse:

Figura 87 – App Imagens. Fonte: autoria própria.

A codificação será essa:

import 'package:flutter/material.dart';

void main() {

runApp(

home(),

);

FIT-F.24.01-02 Rev.C
77

class home extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

home: Scaffold(

//backgroundColor: Colors.grey,

appBar: AppBar(

title: Text("Galeria de foto"),

backgroundColor: Colors.indigo,

),

drawer: Drawer(

child: menu(),

),

//plano de fundo

body: Container(

height: double.infinity,

width: double.infinity,

decoration: BoxDecoration(

image: DecorationImage(

image: AssetImage("asset/imagem/fundo.webp"),

fit: BoxFit.cover,

),

FIT-F.24.01-02 Rev.C
78

),

child: conteudo(),

),

),

);

class menu extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Column(

children: [

FlutterLogo(),

Text("Desenvolvido por:"),

Text("Bruno Rodrigues"),

Icon(

Icons.copyright,

),

],

);

FIT-F.24.01-02 Rev.C
79

class conteudo extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Center(

child: Column(

children: [

Text("Minhas viagens"),

Padding(padding: EdgeInsets.all(20)),

Container(

height: 200,

width: 200,

//Imagem 1 por arquivo,

child: Image.asset("asset/imagem/barco.jpg"),

),

Padding(padding: EdgeInsets.all(15)),

Container(

height: 200,

width: 200,

//Imagem 2 por rede,

child: Image.network(

FIT-F.24.01-02 Rev.C
80

"https://www.showmetech.com.br/wp-

content/uploads//2019/12/painel-sublimado-3d-tecido-fundo-do-

mar-0002-3x2m-D_NQ_NP_920421-MLB28584404262_112018-F.jpg"),

),

Padding(padding: EdgeInsets.all(10)),

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

Text("Curta e compartilhe"),

Icon(

Icons.thumb_up,

),

],

),

],

),

);

Figura 88 – Código do app que gera imagens. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
81

4.4 Exercício 4 – Aplicativo com várias paginas


Seguindo a widget tree de cada página, conseguimos montar um
aplicativo completo, com tela de login, e mais duas páginas com widgets stateful.

Figura 89 – App Várias páginas. Fonte: autoria própria.

Figura 90 - App Várias páginas Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
82

Figura 91 – App login. Fonte: autoria própria.

O resultado da codificação da widget tree será:

Figura 92 – Widget tree app imagens. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
83

Figura 93 – Roteamento de páginas. Fonte: autoria própria.

No widget MaterialApp, vamos usar a propriedade routes para criar rota


para cada página disponível.
O comando para acessar as páginas através das rotas é:
Navigator.popAndPushNamed(context, "nome_rota");

A codificação será essa:

import 'package:flutter/material.dart';

void main() {

runApp(

home(),

);

FIT-F.24.01-02 Rev.C
84

class home extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

//home: pagina1(),

//home: pagina2(),

//home: login(),

routes: {

"/": (context) => login(),

"pagina1": (context) => pagina1(),

"pagina2": (context) => pagina2(),

},

);

class pagina1 extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

FIT-F.24.01-02 Rev.C
85

title: Text("Pagina 1"),

),

drawer: Drawer(

child: menu(),

),

body: Container(

child: conteudoPagina1(),

),

);

class menu extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Column(

children: [

FlutterLogo(),

Text("Desenvolvido por:"),

Text("Bruno Rodrigues"),

TextButton(

onPressed: () {

FIT-F.24.01-02 Rev.C
86

Navigator.popAndPushNamed(context, "pagina1");

},

child: Text("Pagina 1"),

),

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "pagina2");

},

child: Text("Pagina 2"),

),

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "/");

},

child: Text("Logoff"),

),

Icon(

Icons.copyright,

),

],

);

FIT-F.24.01-02 Rev.C
87

class conteudoPagina1 extends StatefulWidget {

@override

State<conteudoPagina1> createState() =>

_conteudoPagina1State();

class _conteudoPagina1State extends State<conteudoPagina1> {

Color cor1 = Colors.green;

Color cor2 = Colors.yellow;

bool status = false;

@override

Widget build(BuildContext context) {

return Center(

child: Column(

children: [

Container(

height: 200,

width: 200,

color: cor1,

),

FIT-F.24.01-02 Rev.C
88

Padding(padding: EdgeInsets.all(5)),

Container(

height: 200,

width: 200,

color: cor2,

),

Padding(padding: EdgeInsets.all(20)),

Switch(

value: status,

onChanged: (value) {

status = value;

print("$status");

setState(() {});

if (status) {

cor1 = Colors.purple;

cor2 = Colors.brown;

} else {

cor1 = Colors.green;

cor2 = Colors.yellow;

},

),

FIT-F.24.01-02 Rev.C
89

Padding(padding: EdgeInsets.all(20)),

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "pagina2");

},

child: Text("Pagina 2"),

style: TextButton.styleFrom(

primary: Colors.white,

backgroundColor: Colors.blueAccent, //cor do

fundo

onSurface: Colors.grey,

padding: const EdgeInsets.all(25), //margem no

botão ou

//fixedSize: const Size(100, 100), //tamanho

fixo da margem

shape: RoundedRectangleBorder(

//side: BorderSide(color: Colors.green,

width: 5), // borda do botão

FIT-F.24.01-02 Rev.C
90

borderRadius: BorderRadius.circular(24),

),

),

),

Padding(padding: EdgeInsets.all(5)),

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "/");

},

child: Text("Logoff"),

style: TextButton.styleFrom(

primary: Colors.white,

backgroundColor: Colors.blueAccent, //cor do

fundo

onSurface: Colors.grey,

padding: const EdgeInsets.all(25), //margem no

botão ou

//fixedSize: const Size(100, 100), //tamanho

fixo da margem

shape: RoundedRectangleBorder(

FIT-F.24.01-02 Rev.C
91

//side: BorderSide(color: Colors.green,

width: 5), // borda do botão

borderRadius: BorderRadius.circular(24),

),

),

),

],

),

],

),

);

class pagina2 extends StatelessWidget {

const pagina2({Key? key}) : super(key: key);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text("Pagina 2"),

FIT-F.24.01-02 Rev.C
92

backgroundColor: Colors.brown,

),

drawer: Drawer(

child: menu(),

),

body: Container(

child: conteudoPagina2(),

),

);

class conteudoPagina2 extends StatefulWidget {

@override

State<conteudoPagina2> createState() =>

_conteudoPagina2State();

class _conteudoPagina2State extends State<conteudoPagina2> {

double tamanho = 0;

int num = 0;

@override

FIT-F.24.01-02 Rev.C
93

Widget build(BuildContext context) {

return Center(

child: Column(

children: [

Slider(

value: tamanho,

onChanged: (value) {

tamanho = value;

num = tamanho.toInt();

print("$tamanho");

setState(() {});

},

min: 0,

max: 100,

),

Text(

"$num",

style: TextStyle(

fontSize: tamanho,

),

),

Padding(padding: EdgeInsets.all(20)),

FIT-F.24.01-02 Rev.C
94

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "pagina1");

},

child: Text("Pagina 1"),

style: TextButton.styleFrom(

primary: Colors.white,

backgroundColor: Colors.blueAccent, //cor do

fundo

onSurface: Colors.grey,

padding: const EdgeInsets.all(25), //margem no

botão ou

//fixedSize: const Size(100, 100), //tamanho

fixo da margem

shape: RoundedRectangleBorder(

//side: BorderSide(color: Colors.green,

width: 5), // borda do botão

borderRadius: BorderRadius.circular(24),

FIT-F.24.01-02 Rev.C
95

),

),

),

Padding(padding: EdgeInsets.all(5)),

TextButton(

onPressed: () {

Navigator.popAndPushNamed(context, "/");

},

child: Text("Logoff"),

style: TextButton.styleFrom(

primary: Colors.white,

backgroundColor: Colors.blueAccent, //cor do

fundo

onSurface: Colors.grey,

padding: const EdgeInsets.all(25), //margem no

botão ou

//fixedSize: const Size(100, 100), //tamanho

fixo da margem

shape: RoundedRectangleBorder(

//side: BorderSide(color: Colors.green,

width: 5), // borda do botão

FIT-F.24.01-02 Rev.C
96

borderRadius: BorderRadius.circular(24),

),

),

),

],

),

],

),

);

class login extends StatelessWidget {

String email = "";

String senha = "";

@override

Widget build(BuildContext context) {

return Scaffold(

body: Container(

height: double.infinity,

width: double.infinity,

decoration: BoxDecoration(

FIT-F.24.01-02 Rev.C
97

image: DecorationImage(

image: NetworkImage(

"http://caminhandoembeleza.com/wp-

content/uploads/2020/12/03191435682598.gif"),

fit: BoxFit.cover,

),

),

child: Center(

child: Column(

mainAxisAlignment: MainAxisAlignment.center,

children: [

TextField(

onChanged: (value) {

email = value;

print("$email");

},

keyboardType: TextInputType.emailAddress,

decoration: InputDecoration(

filled: true,

fillColor: Colors.white,

labelText: 'email',

border: OutlineInputBorder(),

FIT-F.24.01-02 Rev.C
98

),

),

Padding(padding: EdgeInsets.all(5)),

TextField(

onChanged: (value) {

senha = value;

},

obscureText: true,

decoration: InputDecoration(

filled: true,

fillColor: Colors.white,

labelText: 'senha',

border: OutlineInputBorder(),

),

),

Padding(padding: EdgeInsets.all(10)),

TextButton(

onPressed: () {

if (email == "fit@fit.br" && senha == "123") {

print("Entrada autorizada");

FIT-F.24.01-02 Rev.C
99

Navigator.popAndPushNamed(context,

"pagina1");

} else {

print("Usuário ou senha incorreta");

showDialog(

context: context,

builder: (BuildContext context) {

return AlertDialog(

title: Text("Presta atenção!"),

content: Text("Usuário e senha

incorreto"),

actions: [

TextButton(

onPressed: () {},

child: Text("Sim"),

),

TextButton(

onPressed: () {

Navigator.of(context).pop();

},

child: Text("Não"),

),

FIT-F.24.01-02 Rev.C
100

],

);

});

},

child: Text("Login"),

style: TextButton.styleFrom(

primary: Colors.white,

backgroundColor: Colors.blueAccent, //cor do

fundo

onSurface: Colors.grey,

padding: const EdgeInsets.all(25), //margem no

botão ou

//fixedSize: const Size(100, 100), //tamanho

fixo da margem

shape: RoundedRectangleBorder(

//side: BorderSide(color: Colors.green,

width: 5), // borda do botão

borderRadius: BorderRadius.circular(24),

),

),

FIT-F.24.01-02 Rev.C
101

),

],

),

),

),

);

}
Figura 94 – Código Aplicativo com várias páginas. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
102

5 Publicação de Aplicativo nas Lojas: Google Play e Apple Store

Para publicar um aplicativo nas lojas oficiais, se faz necessário a criação


de uma conta de desenvolvedor. Cada uma das Apps Stores (Google e Apple)
tem sua própria precificação e ciclos de pagamento.
O Google Play Store (Android) tem o custo de $25 (Vinte e cinco dólares),
pagos uma única vez (PLAY CONSOLE, 2021). Já a Apple App Store (iOS) tem
o custo de $99 (Noventa e nove dólares) anuais, (APPLE DEVELOPER
PROGRAM, 2021). Nota-se a diferença entre os preços das 02 lojas. A Apple
segue a mesma filosofia que seus produtos, o preço mais alto faz com que a
qualidade dos publicadores de apps seja maior (NEONEXUS, 2021).

5.1 Criando uma conta de desenvolvedor no Google Play

Para a criação de uma conta de desenvolvedor no Google Play é


necessário acessar o site do Google Play Console e inserir as informações que
são solicitadas, conforme figura abaixo:

FIT-F.24.01-02 Rev.C
103

Figura 95 - Google Play Console. Fonte: Descomplica.

Será permitido escolher entre publicar o aplicativo desenvolvido com a


sua conta pessoal do gmail ou uma mais profissional. Em seguida, preencha as
informações, clique em “Criar conta e fazer o pagamento”. Após, concluir as
etapas e realizar o pagamento. A publicação dos aplicativos será liberada na loja
do Google Play Store.

5.2 Criando uma conta de desenvolvedor na App Store

Para a criação de uma conta de desenvolvedor na App Store é necessário


acessar o site ID Apple e em seguida, clicar em “Crie seu ID Apple” e preencher
todos os dados, conforme abaixo:

FIT-F.24.01-02 Rev.C
104

Figura 96 - App Store. Fonte: Descomplica.

O Apple ID deve ser um e-mail válido, pois será confirmado


posteriormente. Depois do Apple ID aprovado, será necessário acessar a página
do Apple Developer e clicar no menu Account. Utilize o e-mail e senha do Apple
ID, aceite o contrato de privacidade da Apple para acessar o ambiente Getting
Started e pronto, você já é um desenvolvedor!
Se você deseja publicar na Apple App Store é preciso ser membro do
Apple Developer Program, e, para isto, é necessário acessar o site do Apple
Developer Program e clicar no botão Enroll para criação da conta como
desenvolvedor pessoa física ou como organização (pessoa jurídica). Para a
criação de uma conta de organização, será necessário a criação de um D-U-N-
S Number da empresa que representa um CNPJ internacional para identificação
da organização junto a Apple. Após completar todos os passos acima, o usuário
será redirecionado para o pagamento da taxa.

FIT-F.24.01-02 Rev.C
105

6 Desafio

Com os conceitos apresentados neste curso, faça um Aplicativo que em


Flutter que demonstre os conceitos aprendidos em aula, como navegação entre
páginas, widget statefull e stateless, menu, uso de funções ,uso de imagens
entre outros. O tema poderá ser a sua escolha. Você poderá desenvolver o
layout livremente, e caso queira inovar algo, fique à vontade, esse critério
também será avaliado.

Ao final da execução do desafio, insira evidências sobre a atividade


(estrutura) em arquivos: PDF, JPG e/ou PNG, podendo inserir na plataforma
quantos arquivos quiser ou pode-se zipar os arquivos- ZIP e RAR, inserindo
todos os arquivos de uma vez só. As evidências são:

 Código-fonte;
 Imagens da execução do aplicativo com todas as etapas e telas, até o
resultado final do programa.

Figura 97 - Desafio. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
106

Figura 98 - Desafio. Fonte: autoria própria.

FIT-F.24.01-02 Rev.C
107

Conclusão

A abordagem desta apostila permite ao leitor uma interação ativa com as


principais práticas de Desenvolvimento Mobile com Flutter Básico. Durante o
curso aprendemos sobre: o histórico da plataforma Flutter, DART; aprendemos
os principais componentes do Flutter - Widgets, IDE oficial para desenvolvimento
em Flutter; aprendemos a desenvolver interfaces básicas seguindo os padrões
oficiais da plataforma; e por último dicas de como publicar os aplicativos em lojas
da Google e Apple.
Obrigado por fazer parte do curso e ter realizado a leitura desta apostila.
Espero que o interesse por aplicações móveis apresentado neste curso desperte
o interesse nos demais cursos existentes em nossa plataforma.

FIT-F.24.01-02 Rev.C
108

Referências

Documentação do Flutter - disponível em https://flutter.dev/ - acessado em


novembro/2021.
Download do Flutter – disponível em: https://docs.flutter.dev/get-
started/install/windows acessado em novembro/2021.

Programação DART em: https://medium.com/flutter-comunidade-


br/introdu%C3%A7%C3%A3o-a-linguagem-de-programa%C3%A7%C3%A3o-
dart-b098e4e2a41e acessado em novembro/2021.
Instalação do Android Studio em:
https://developer.android.com/studio?hl=pt-br acessado em novembro/2021.
Configuração do Emulador AVD Manager em:
https://www.androidpro.com.br/blog/desenvolvimento-android/emulador-de-android/ acessado
em novembro/2021.
Instalação do Visual Code em https://code.visualstudio.com/download
acessado em novembro/2021.
Variáveis e condicionais, linguagem DART em https://medium.com/flutter-
comunidade-br/introdu%C3%A7%C3%A3o-a-linguagem-de-
programa%C3%A7%C3%A3o-dart-b098e4e2a41e acessado em
novembro/2021.
Widgets - Stateless e Stateful em https://medium.com/flutter-comunidade-
br/explorando-widgets-e-layouts-6fd34ecb82f acessado em novembro/2021.
Diagrama da àrvore widgets em
http://www.macoratti.net/19/07/flut_layout1.htm acessado em novembro/2021.
Exemplo de widgets: linhas, colunas e texto em
https://www.simoes.dev/flutter/widgets-do-flutter-basico acessado em
novembro/2021.

Apps nativos para Android e IOS com Flutter, crie Apps como: Youtube,
WhatsApp, Uber, OLX e muito mais! em: https://fit-
tecnologia.udemy.com/course/desenvolvimento-android-e-ios-com-
flutter/learn/lecture/13537448#overview – acessado em outubro/2021

FIT-F.24.01-02 Rev.C
109

The Complete 2021 Flutter Development Bootcamp with Dart em:


https://fit-tecnologia.udemy.com/course/flutter-bootcamp-with-
dart/learn/lecture/14481906?start=15#overview - acessado em outubro/2021
Explorando Widgets e Layouts em Flutter em https://medium.com/flutter-
comunidade-br/explorando-widgets-e-layouts-6fd34ecb82f acessado em
novembro/2021 - acessado em novembro/2021.
Flutter para iniciantes em
https://www.flutterparainiciantes.com.br/basico/widgets - acessado em
novembro/2021.
Desenvolvimento em Plataformas Híbridas em
https://dex.descomplica.com.br/projetos-de-aplicativos-moveis-
multiplataforma/desenvolvimento-em-plataformas-hibridas-flutter-
pos/desenvolvimento-em-plataformas-hibridas-apresentar-como-e-feita-a-
publicacao-de-um-aplicativo-na-app-store-e-google-play/explicacao/1 -
acessado em novembro/2021.
Flutter para iniciantes em https://flutterparainiciantes.com.br/widgets/
acessado em julho/2022

CONTROLE DE REVISÃO DO DOCUMENTO / DOCUMENT REVISION CONTROL


Revisão Descrição Razão Autor Data
Review Description Reason Author Date
A - Revisão inicial Larissa Alves 30/11/2021
Revisão do
modelo de
Alteração d elogotopia do rodapé do Bruno Rafael
B formulário FIT – 01/07/2022
documento Rodrigues
F.24.1.01 – 04
Rev.B

 Processo de melhorias no conteúdo Rita Barbosa/Bruno


C  Novo conteúdo adicionado no Desafio Atualização Rodrigues/Hellen 22/09/2022
 Atualização de Figuras e Exercícios Silva

FIT-F.24.01-02 Rev.C
110

FIT-F.24.01-02 Rev.C
111

FIT-F.24.01-02 Rev.C

Você também pode gostar