Logo Passei Direto
Buscar

Compondo leiaute de interface de usuário no Flutter

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Compondo leiaute de interface de 
usuário no Flutter
Apresentação
Atualmente, o Flutter tem cada vez mais se destacado como um dos principais frameworks para 
desenvolvimento de aplicativos para dispositivos móveis. Elaborado pela Google como ferramenta 
para criação de aplicações multiplataforma (Android e iOS), tem sua arquitetura baseada na 
utilização de widgets.
Repetida quase como um mantra, a frase "em Flutter tudo é widget" é a filosofia desse framework. 
No design de interfaces não é diferente, todos os elementos, como botões, textos, listas, campos de 
entrada, entre outros, são widgets, bem como o são os elementos invisíveis utilizados na construção 
dessas interfaces.
Em um primeiro momento, é estranho pensar a centralização de um texto como sendo um widget, 
mas é verdade. Os widgets do leiaute são responsáveis pela organização, pelos alinhamentos, entre 
outras funções. Mesmo não sendo visíveis, são igualmente importantes para a construção de uma 
boa experiência na utilização do aplicativo.
Nesta Unidade de Aprendizagem, você vai conhecer os principais conceitos que cercam os widgets 
de leiaute e quais são os principais utilizados para composição de leiautes. Também vai conhecer o 
que são leiautes responsivos e algumas técnicas usadas para sua implementação.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Descrever o papel dos widgets de leiaute.•
Explicar a composição de leiautes.•
Aplicar técnicas de leiautes responsivos.•
Desafio
No cotidiano das equipes de desenvolvimento, é muito comum segmentar as atividades. Enquanto 
algumas equipes produzem o design da interface e elaboram as estratégias de interação e estilo, 
outras se responsabilizam por sua implementação e manutenção. Ambas as tarefas são igualmente 
importantes para atingir o objetivo, a satisfação do usuário.
Dependendo da organização de cada equipe, os projetos chegam como imagens, que devem ser 
decompostas de forma estrutural, compreendidas e, então, implementadas, utilizando as 
ferramentas, os frameworks e outros recursos para a criação das aplicações.
Considerando o leiaute do post da notícia e os widgets necessários para sua implementação, você 
consegue identificar cada widget utilizado na construção do leiaute e de que modo seria a sua 
representação como uma árvore de widgets?
Infográfico
Trabalhar com elementos visuais é muito interessante, pois sua construção traz um efeito imediato 
para o desenvolvedor. Por outro lado, essa construção pode causar várias horas de trabalho para 
ajustar corretamente cada elemento em seu lugar.
Em Flutter, os widgets de leiaute Row e Column são bastante utilizados. Por isso, saber suas 
configurações de alinhamento pode ser de grande ajuda. Muitas vezes um pequeno ajuste ou a 
escolha da propriedade correta são capazes de poupar tempo de desenvolvimento e linhas de 
código.
No Infográfico, conheça um pouco mais sobre os métodos de alinhamento dos mainAxisAlignment e 
crossAxisAlignment e seu impacto em tela.
Aponte a câmera para o 
código e acesse o link do 
conteúdo ou clique no 
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/1cf49aa9-07fc-4dff-84a7-97a37f7c685b/a3fba3d3-5a36-4364-bcf8-81738602ab8f.jpg
Conteúdo do Livro
Construir um leiaute para um aplicativo pode parecer algo trivial, mas seu impacto para o usuário 
pode ser bastante significativo. O trabalho inicia no projeto da interface, em que se começa a 
dispor os elementos visíveis na tela. Mas tão importantes quanto os itens visíveis, são os elementos 
que não são visíveis, mas permitem que todos os demais sejam organizados corretamente.
Esses itens invisíveis, mas indispensáveis, são os widgets de leiaute. Tão relevantes quanto os 
widgets de interface do usuário, os widgets de leiaute são responsáveis por posicionar, alinhar e 
fornecer um método para definição de interfaces para diferentes dispositivos.
No capítulo Compondo leiaute de interface de usuário no Flutter, base teórica desta Unidade de 
Aprendizagem, conheça os widgets de leiaute, seu papel, estrutura hierárquica e função na 
composição de leiautes, bem como o conceito de responsividade e como pode impactar na 
utilização do aplicativo em diferentes dispositivos.
Boa leitura.
FUNDAMENTOS DE 
DESENVOLVIMENTO 
MOBILE
OBJETIVOS DE APRENDIZAGEM
 > Descrever o papel dos widgets de leiaute.
 > Explicar a composição de leiautes.
 > Aplicar técnicas de leiaute responsivos.
Introdução
Flutter é um framework fundamentado na utilização de widgets para desen-
volvimento das funcionalidades e implementação das regras de negócio do 
aplicativo e para construção da interface do usuário, principal canal de inte-
ratividade entre o usuário e a aplicação. Apesar de os widgets de interface 
visíveis proporcionarem esse canal de interação, são os widgets de leiaute que 
mantêm tudo nos seus devidos lugares. Inicialmente, pode parecer estranho 
pensar em colunas e linhas como widgets. Outros, como centralizar e ajustar 
distanciamentos, são igualmente importantes, pois auxiliam a organizar, res-
tringir ou alinhar os widgets visíveis.
Compondo leiaute 
de interface de 
usuário no Flutter
Marcelo da Silva dos Santos
Neste capítulo, você vai conhecer os conceitos de widgets invisíveis utilizados 
na interface, os widgets de leiaute. Com a apresentação dos seus conceitos 
básicos, organização hierárquica e como se interrelacionam, você vai estudar 
qual é a influência deles no design de interfaces normais ou responsivas, 
aquelas voltadas para utilização em quaisquer dispositivos sem perda da 
experiência do usuário.
Widgets para construção de leiautes
Nos últimos tempos, o Flutter tem ganhado bastante espaço no mercado de 
desenvolvimento de aplicativos para dispositivos móveis. Ele é um framework 
multiplataforma criado pelo Google para desenvolvimento de aplicativos 
Android e iOS. Sua arquitetura é baseada em widgets, componentes com as 
mais diversas finalidades, utilizados também para construção dos aplicativos. 
Podemos dizer que todo aplicativo Flutter é um widget composto por centenas 
de outros widgets.
Quando falamos que em Flutter tudo é widget, não é exagero. Todos os 
elementos que compõem o leiaute da interface são widgets. Não só os compo-
nentes que você imagina, como botões, caixas de texto ou outros componentes 
visíveis, mas também de alinhamentos, espaçamentos, entre outros. Pode ser 
estranho pensar na centralização de um elemento na interface como sendo um 
widget, mas é verdade. Nesse modelo de arquitetura, os leiautes são criados 
com a combinação de widgets para compor widgets mais complexos. Um 
exemplo mais simples é entender o aplicativo criado como um jogo de peças 
de encaixar, em que cada componente representa uma parte do produto. 
Observe um exemplo dessa construção na Figura 1.
Figura 1. Alusão da utilização de widgets como peças de encaixar.
Fonte: Melo (2021, documento on-line).
Compondo leiaute de interface de usuário no Flutter2
Note, nesse exemplo, que todas as peças coloridas (widgets visíveis) 
precisam de uma base. Nesse caso, é a peça branca (widgets não visíveis) 
que serve para fixar e organizar as demais. A interface do aplicativo tem a 
mesma lógica: uma combinação de elementos visíveis, mas também uma 
grande quantidade de elementos não visíveis, como as linhas, colunas e 
outros tipos de contêineres que os delimitam e alinham. O Flutter classifica 
esses widgets nos dois grupos principais a seguir.
1. Widgets de interface: componentes visíveis na tela, interface do usuário 
(UI, do inglês user interface), como textos, botões, campos de entrada 
de dados, entre outros.
2. Widgets de leiaute: componentes responsáveis pela organização e 
posicionamento dos demais widgets.
Nosso objetivo neste capítulo é conhecer melhor os widgets de leiaute, 
mas eventualmente utilizaremos alguns widgets de interface por motivos 
óbvios: necessitamos de algo para organizar.
Voltando à ideia apresentadana Figura 1, para construirmos nossa interface 
de usuário, precisamos encaixar uma peça na outra e vamos ter uma ordem 
de inclusão dos elementos, daqueles que estão mais próximos da base para 
os que estão mais distantes. Agora, imagine essa estrutura de outra forma, 
como se fosse uma árvore de cabeça para baixo. A raiz da árvore será a 
base, e cada peça conectada diretamente a ela se torna um galho, que vai 
se expandindo e ramificando conforme as peças vão sendo conectadas. No 
Flutter, chamamos essa estrutura de árvore de widgets. 
Para compreender melhor esse conceito, vamos a um exemplo muito 
conhecido e apresentado na documentação oficial do Flutter (FLUTTER..., 
[2021]). Observe na Figura 2 uma barra de funcionalidades simples, composta 
por três funções para chamada, mensagem e compartilhamento.
Figura 2. Barra de funções simples, contendo três funcionalidades da interface.
Fonte: Flutter… (2021, documento on-line).
Compondo leiaute de interface de usuário no Flutter 3
Para entender como representar essa barra como uma árvore de widgets, 
vamos decompô-la em seus elementos constituintes. Observe na Figura 3 
como os widgets de leiaute encapsulam os widgets visíveis.
Figura 3. Decomposição da barra de funções em seus widgets constituintes.
Fonte: Adaptada de Flutter… (2021).
Widget pai envolvendo todos os widgets internos
Widget de coluna agrupando os elementos visíveis
Widget de centralização envolvendo individualmente cada item visível
Nesse exemplo, temos um elemento-base que agrupa (container) as três 
funções, sendo este o elemento-raiz (também chamado de elemento-pai). Cada 
função é colocada em uma coluna diferente, composta por dois elementos 
(um ícone e um texto) agrupados em cada uma dessas colunas. Podemos 
representar essa estrutura no formato de uma árvore, como mostra a Figura 4.
Note que a partir do elemento-pai (a raiz da árvore), cada ramo é formado 
por um filho (ou filhos), expandindo até chegar aos elementos que estão mais 
próximos ao topo da pilha (as peças encaixadas por último). É importante 
destacar que o Flutter considera, no momento de definir as propriedades 
que serão transmitidas aos filhos, a quantidade de elementos conectados a 
um determinado widget-pai, classificando nas duas propriedades a seguir.
1. Child: tem um único widget, como um contêiner para adicionar mar-
gens em um texto.
2. Children: tem uma lista de widgets, como uma coluna com vários 
elementos.
Compondo leiaute de interface de usuário no Flutter4
Figura 4. Árvore de widgets formada pela estrutura da barra de funções exemplo.
Fonte: Adaptada de Flutter... (2021).
Container
Container Container Container
Column
Icon Icon
Text Text Text
Icon
Column Column
Row
Na construção hierárquica de uma interface, um widget pode receber 
um Child ou Childrens, que, por sua vez, também podem receber outros 
Child ou Childrens. Além de organizar, essa estrutura também auxilia em 
outras situações como quando é necessário redesenhar a interface porque 
algo mudou (retirar um elemento de uma listagem, por exemplo). Nesse caso, 
o Flutter pode redesenhar somente a parte da interface que sofreu alteração, 
mantendo o restante inalterado.
Agora que você conhece um pouco do relacionamento dos widgets com 
a construção de um leiaute, vamos apresentar alguns dos principais widgets 
de leiaute e como utilizá-los.
Compondo leiaute de interface de usuário no Flutter 5
Principais componentes de leiaute
Como você acompanhou até agora, os widgets de leiaute organizam todos os 
elementos visíveis para o usuário, criando a sua experiência com o aplica-
tivo e influenciando a sua forma de interação. Por isso, é muito importante 
conhecer os widgets de leiaute e como utilizá-los na criação de interfaces. 
O Flutter fornece muitos widgets especialmente projetados, como Container, 
Center, Align, Row, Column, entre outros, todos com o propósito de definir 
a interface para interação do usuário.
Relembrando, eles podem ser agrupados em widgets que admitem apenas 
um filho (child) ou vários filhos (children). Essa informação é importante 
na composição das interfaces, pois a utilizamos em sua construção. Como 
exemplo, vamos criar uma composição simples utilizando como ponto inicial 
um widget visível simples, um texto criado pelo widget Text:
Text('Hello World')
Para centralizarmos esse texto, utilizaremos o widget Center e, para que a 
propriedade seja aplicada, aqui entra a definição do parentesco (ou hierarquia) 
entre os dois elementos. Nesse caso, o elemento Text será filho de Center:
const Center(
 child: Text('Hello World'),
),
Já os widgets que comportam mais de um filho serão representados pela 
propriedade children. Para finalizar, devemos inserir a composição em 
uma interface. Definida essa sintaxe inicial, vamos aos widgets de leiaute.
Center
Como iniciamos apresentando o widget Center (GOOGLE, 2021b), vamos 
continuar apresentando suas propriedades. Ele tem a função de centralizar 
os seus filhos. Como parâmetros associados a esse elemento, podemos citar 
os seguintes.
Compondo leiaute de interface de usuário no Flutter6
 � heightFactor: calcula a altura do widget Center em relação à altura 
do filho multiplicando seu fator pela altura do filho. Por exemplo, se 
o fator for 2.0, a altura de Center será o dobro da altura dos filhos.
 � widthFactor: calcula a largura do widget Center em relação à largura 
do filho multiplicando seu fator pela largura do filho. Por exemplo, se 
o fator for 2.0, a largura de Center será o dobro da largura dos filhos.
Observe o exemplo (FLUTTER..., [2021]):
child: Center(
heightFactor: 2,
child: Text(
 'Hello World',
 textDirection: TextDirection.ltr,
 style: TextStyle(
 fontSize: 32,
 color: Colors.black87,
 ),
),
),
Podemos notar que o espaço ocupado pelo Center terá o dobro do ta-
manho do Text. O valor-padrão para os parâmetros heightFactor e wi-
dthFactor é nulo e, nesse caso, o widget Center assumirá o tamanho de 
seu widget-filho.
Align
Align é o widget responsável pelo alinhamento de seus widgets-filhos (GOO-
GLE, 2021a) e, opcionalmente, também pode ser redimensionado com base nos 
parâmetros heightFactor e widthFactor, mas a propriedade que vamos 
destacar aqui é o alignment. É por meio dele que posicionamos o nosso 
texto em uma das nove possibilidades disponíveis. São elas: (1) topLeft, (2) 
topCenter, (3) topRight, (4) centerLeft, (5) center, (6) centerRight, (7) 
bottomLeft, (8) bottomCenter e (9) bottomRight. Observe na Figura 5 o 
mapeamento de cada posição.
Compondo leiaute de interface de usuário no Flutter 7
Figura 5. Mapeamento das posições de alinhamento.
Fonte: Adaptada de Google (2021a).
Vamos a um exemplo de aplicação:
child: Align(
 alignment: Alignment.center,
 child: Text(
 'Hello World',
 textDirection: TextDirection.ltr,
 style: TextStyle(
 fontSize: 32,
 color: Colors.black87,
 ),
 ),
),
Outras formas de alinhamento podem ser definidas pelos demais widgets, 
mas geralmente são aplicáveis ao seu contexto, como veremos em breve nas 
Rows e Columns.
Padding
O widget Padding (GOOGLE, 2021f) é basicamente usado para adicionar espaço 
extra ao redor de um widget usando a classe abstrata EdgeInsetsGeometry. 
Suas propriedades principais estão listadas a seguir.
 � EdgeInsets.all(120): adiciona espaço vazio de 120 pixels em todas 
as direções do elemento-filho.
 � EdgeInsets.fromLTRB(50, 120, 10, 10): adiciona espaço vazio de 
50 pixels, 120 pixels, 10 pixels e 10 pixels, respectivamente nas direções 
esquerda, superior, direita e inferior.
Compondo leiaute de interface de usuário no Flutter8
child: Container(
 padding: const EdgeInsets.fromLTRB(50, 120, 10, 10),
 color: Colors.white,
 width: 200.0,
 height: 200.0,
 child: Text(
 'Hello World',
 style: TextStyle(color: Colors.black87),
 ),
),
Você já deve ter percebido que os widgets de leiaute incluem um envelope 
ao redor do filho, correto? Logo, existe um espaço vazioentre o widget-pai e 
o widget-filho, que será afetado pelo Padding.
Container
Chegamos ao Container (GOOGLE, 2021d), um widget mais completo, que 
basicamente combina as propriedades já vistas (tamanho, cor, borda, padding, 
margin, entre outras), que comporta um ou mais widgets-filhos. Basicamente, 
ele pode se comportar como aquela base para encaixe de peças, que co-
mentamos na seção anterior. A partir dele, podemos montar os conjuntos de 
elementos visíveis aplicando alinhamentos, posições, redimensionamentos, 
entre outras propriedades.
Container(
 padding: EdgeInsets.all(10.0),
 alignment: Alignment.topCenter,
 width: 200,
 height: 100,
 decoration: BoxDecoration(
 color: Colors.green,
 border: Border.all(),
 ),
 child: Text(
 'Hello World',
 style: TextStyle(fontSize: 30)
 ),
);
Compondo leiaute de interface de usuário no Flutter 9
Note que esse exemplo apresenta um Container para um widget Text, 
mas dessa vez aplicando ao mesmo tempo diversas propriedades, entre elas 
o padding e o alignment. Somente com essa estrutura já podemos montar 
diferentes interfaces, mas ainda faltam duas propriedades bastante conhe-
cidas, os widgets Columns e Rows.
Row e Column
Row (GOOGLE, 2021g) e Column (GOOGLE, 2021c) são os dois widgets muito 
utilizados na organização de conjuntos de widgets. Eles permitem o alinha-
mento dos filhos horizontalmente e verticalmente, respectivamente. Suas 
propriedades mais comuns são as que seguem.
 � mainAxisAlignment: alinha os filhos no eixo principal.
 � crossAxisAlignment: alinha os filhos no eixo transversal.
Note que, para um widget Row, o eixo principal é horizontal, e o eixo 
transversal é vertical. Para o widget Column, o comportamento é o inverso: 
o eixo principal é vertical, e o eixo transversal é horizontal.
Primeiramente, vamos a um exemplo de uso do row:
child: Row(
 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
 children: [
 Image.asset('images/lands _ 01.jpg'),
 Image.asset('images/lands _ 02.jpg'),
 Image.asset('images/lands _ 03.jpg'),
 ],
),
O resultado está apresentado na Figura 6.
Compondo leiaute de interface de usuário no Flutter10
Figura 6. Exemplo de alinhamento em linha.
Fonte: Dias (2020, documento on-line).
Já para o widget Column, o resultado é o alinhamento dos mesmos ele-
mentos, mas verticalmente:
child: Column(
 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
 children: [
 Image.asset('images/lands _ 01.jpg'),
 Image.asset('images/lands _ 02.jpg'),
 Image.asset('images/lands _ 03.jpg'),
 ],
),
Compondo leiaute de interface de usuário no Flutter 11
Observe o resultado apresentado na Figura 7.
Figura 7. Exemplo de alinhamento em coluna.
Fonte: Dias (2020, documento on-line).
Agora que você conhece os principais widgets de leiaute e seu compor-
tamento, vamos analisar como podemos criar uma interface responsiva, ou 
seja, que se acomode adequadamente ao dispositivo que estiver acessando-o.
Responsividade em leiaute Flutter
Um design responsivo nada mais é do que a forma que o leiaute responde e 
se ajusta a diferentes tamanhos de telas, sem distorcer o conteúdo ou tornar 
alguma parte inacessível. Com a variedade de dispositivos e considerando 
que uma aplicação Flutter também pode ser disponibilizada para uma versão 
web, podemos ter a necessidade de que ela seja também aberta em desktop 
ou um tablet, sem distorcer os widgets visíveis ou simplesmente esticar a 
Compondo leiaute de interface de usuário no Flutter12
visualização deles. A Figura 8 apresenta um exemplo de responsividade em 
leiautes para diferentes dispositivos.
Figura 8. Design responsivo.
Fonte: Novo... (2014, documento on-line).
Em design para web, já é implementado a bastante tempo o MediaQuery 
(GOOGLE, 2021e) como metodologia para resolução dessa necessidade. As 
técnicas de MediaQuery são nativas do Flutter, proporcionando uma forma 
de obter informações sobre o tamanho do dispositivo atual, bem como as 
preferências do usuário. Assim, o desenvolvedor pode utilizar essas informa-
ções para projetar seu leiaute de acordo. Um exemplo simples de seu uso é 
verificar se o usuário alterou a orientação do dispositivo (virou o celular da 
posição vertical para a horizontal, por exemplo). Nesse caso, seria reconhe-
cida uma mudança de estado da interface, e o Flutter pode reconstruir ela 
posicionando os elementos de uma forma mais condizente.
Compondo leiaute de interface de usuário no Flutter 13
A seguir estão algumas situações em que é relevante reconhecer infor-
mações do dispositivo.
 � Identificar a orientação de um dispositivo móvel; se ele está na posição 
horizontal ou vertical.
 � Ajustar os paddings conforme os tamanhos de tela.
• Identificar preferências do usuário, como desativar animações ou 
inversão de cores para recursos de acessibilidade.
Também quanto à acessibilidade, reconhece se o usuário tem configuração 
para tamanho de fonte aumentada.
Flutter utiliza o conceito de mudança de estado para gerenciar sua 
interface de usuário, sendo que o estado é qualquer informação que 
esteja na memória durante o tempo de execução do aplicativo, como assets, 
conteúdo de variáveis, fontes, texturas, dentre outros (FLUTTER..., [2021]). Ele 
tem duas categorias de widgets para gerenciar os estados de uma aplicação e 
seus impactos e para gerenciar as alterações de interface ligadas a mudanças de 
estado: StatelessWidget (ou Widget sem estado), estruturas mais simples que se 
mantêm imutáveis durante o seu ciclo de vida, e os StatefulWidget (Widget com 
estados), muito utilizados na implementação de interfaces, pois são capazes 
de reagir e reconstruir partes da árvore de widgets, sempre que o estado do 
widget muda.
Em Flutter, o MediaQuery também é um widget capaz de reconhecer 
características do dispositivo. Sua implementação é realizada com a instru-
ção MediaQuery.of diretamente no método de construção. O método of 
acessa a árvore, obtendo informações sobre o dispositivo onde o aplicativo 
está sendo renderizado.
A partir de então, basta associar outros métodos capazes de capturar 
diretamente a característica que o desenvolvedor necessita. Por exemplo, 
uma chamada ao método MediaQuery.of(context).size terá como retorno 
um objeto Size contendo os valores de largura e altura do dispositivo. Com 
base nessa informação, você pode definir o tamanho para um widget. Por 
exemplo, em uma determinada situação, você precisa que um bloco de texto 
ocupe somente 80% da largura da tela do dispositivo do usuário, mas como 
saber qual é esse tamanho em pixels? Nesse caso usaremos:
Compondo leiaute de interface de usuário no Flutter14
final largura = MediaQuery.of(context).size.width * 0.8;
Note que não importa qual é o tamanho da tela ou a posição que ela está; 
a variável largura sempre conterá o valor para o momento atual. Nesse exem-
plo, recuperamos somente a largura do dispositivo, mas também é possível 
recuperar todo um conjunto de propriedades. Acessando o método Media-
Query.of(contexto), é obtido como retorno um objeto MediaQueryData 
(GOOGLE, 2021e):
MediaQueryData media = MediaQuery.of(context);
Com esse objeto, podemos utilizar outros métodos do widget MediaQuery 
para aplicar em nosso design, como os que seguem.
 � Orientation orientation: identifica a orientação atual (horizontal 
ou vertical).
 � Size size: identifica as dimensões de um elemento em pixels.
 � double devicePixelRatio: identifica a razão entre o número de 
pixels do dispositivo para cada pixel lógico.
 � bool accessibleNavigation: identifica preferências do usuário 
quanto à acessibilidade.
 � bool boldText: identifica preferências do usuário quanto à utilização 
de fonte em negrito.
 � bool invertColors: identifica preferências do usuário quanto à 
inversão de cores.
 � bool disableAnimations: identifica preferências do usuário quanto 
a desabilitar animações.
 � bool alwaysUse24HourFormat: identifica se o horário do dispositivo 
utiliza padrão 24 horas.
 �Brightness platformBrightness: identifica se o usuário tem pre-
ferências de brilho para o display.
Observe no exemplo a seguir alguns exemplos de acesso a essas proprie-
dades via objeto MediaQueryData.
Compondo leiaute de interface de usuário no Flutter 15
Widget build(BuildContext context) {
 MediaQueryData media = MediaQuery.of(context);
 return Scaffold(
 appBar: AppBar(
 title: Text('Media Query - Exemplo'),
 centerTitle: true,
 ),
 body: Padding(
 padding: const EdgeInsets.all(10.0),
 child: Column(
 crossAxisAlignment: CrossAxisAlignment.stretch,
 children: [
 Text('Tamanho: ${media.size}', 
 style: TextStyle(fontSize: 20.0)),
 Text('Orientação: ${media.orientation}',
 style: TextStyle(fontSize: 20.0)),
 Text('Hora(24h): ${media.alwaysUse24HourFormat}',
 style: TextStyle(fontSize: 20.0)),
 Text('Brilho: ${media.platformBrightness}',
 style: TextStyle(fontSize: 20.0)),
 Text('Acessibilidade: ${media.accessibleNavigation}',
 style: TextStyle(fontSize: 20.0)),
 ],
 ),
Um exemplo dos valores obtidos para esses métodos pode ser observado 
na Figura 9.
Compondo leiaute de interface de usuário no Flutter16
Figura 9. Teste com os métodos fornecidos pelo objeto MediaQueryData.
Fonte: Adaptada de Macoratti (2020).
A partir dessas propriedades, podemos acessar os valores para cada 
característica dos dispositivos, fornecendo recursos para que possamos 
implementar as situações em que os elementos devem ser alterados.
Como você percebeu, criar uma interface não é uma atividade complexa, 
desde que conheça as propriedades adequadas de como utilizá-las em seu 
projeto. O ideal é que você crie seu leiaute antes de implementá-lo, seja com 
um esboço em papel, seja com um protótipo desenhado em alguma ferramenta 
gráfica. Assim, você terá um norteador dos widgets (tanto visíveis quanto 
invisíveis) de que vai necessitar. Além disso, prever a responsividade do seu 
aplicativo é uma boa prática nos tempos atuais, pois oferecemos ao usuário 
mais uma forma para que ele tenha uma boa experiência ao utilizar o aplicativo.
Referências 
DIAS, R. Flutter: criando layouts com Center, Column e Row. DevMedia, 2020. Disponível 
em: https://www.devmedia.com.br/flutter-criando-layouts-com-center-column-e-
-row/40743. Acesso em: 30 ago. 2021.
FLUTTER documentation. [Mountain View: Google, 2021]. Disponível em: https://flutter.
dev/docs. Acesso em: 28 ago. 2021.
GOOGLE. Flutter: Align class. Versão 2.2.3. [Mountain View: Google], 2021a. Disponível 
em: https://api.flutter.dev/flutter/widgets/Align-class.html. Acesso em: 30 ago. 2021.
Compondo leiaute de interface de usuário no Flutter 17
GOOGLE. Flutter: Center class. Versão 2.2.3. [Mountain View: Google], 2021b. Disponível 
em: https://api.flutter.dev/flutter/widgets/Center-class.html. Acesso em: 30 ago. 2021.
GOOGLE. Flutter: Column class. Versão 2.2.3. [Mountain View: Google], 2021c. Disponível 
em: https://api.flutter.dev/flutter/widgets/Column-class.html. Acesso em: 30 ago. 2021.
GOOGLE. Flutter: Container class. Versão 2.2.3. [Mountain View: Google], 2021d. Dis-
ponível em: https://api.flutter.dev/flutter/widgets/Container-class.html. Acesso em: 
04 ago. 2021.
GOOGLE. Flutter: MediaQuery class. Versão 2.2.3. [Mountain View: Google], 2021e. 
Disponível em: https://api.flutter.dev/flutter/widgets/MediaQuery-class.html. Acesso 
em: 30 ago. 2021.
GOOGLE. Flutter: Padding class. Versão 2.2.3. [Mountain View: Google], 2021f. Disponível 
em: https://api.flutter.dev/flutter/widgets/Padding-class.html. Acesso em: 30 ago. 2021.
GOOGLE. Flutter: Row class. Versão 2.2.3. [Mountain View: Google], 2021g. Disponível 
em: https://api.flutter.dev/flutter/widgets/Row-class.html. Acesso em: 30 ago. 2021.
MACORATTI, J. C. Flutter: Usando o widget MediaQuery. Macoratti.net, 2020. Disponível 
em: http://www.macoratti.net/20/03/flut_mediaq1.htm. Acesso em: 02 ago. 2021.
MELO, R. de. Flutter para iniciantes. [S.l.: s.n.], 2021. Disponível em: https://www.flut-
terparainiciantes.com.br/. Acesso em: 30 ago. 2021.
NOVO site do Globo: uma nova forma de produzir e publicar notícias. O Globo, 2014. 
Disponível em: https://oglobo.globo.com/politica/novo-site-do-globo-uma-nova-
-forma-de-produzir-publicar-noticias-12678667. Acesso em: 2 set. 2021.
Leituras recomendadas
DART.DEV. Dart documentation. [S.l.: s.n., 2021]. Disponível em: https://dart.dev/docs. 
Acesso em: 30 ago. 2021
GOOGLE. Flutter: MediaQueryData class. Versão 2.2.3. [Mountain View: Google], 2021. 
Disponível em: https://api.flutter.dev/flutter/widgets/MediaQueryData-class.html. 
Acesso em: 30 ago. 2021.
MARINHO, L. H. Iniciando com Flutter Framework. [S.l.]: Casa do Código, 2020.
ZAMMETTI, F. Flutter na prática: melhore seu desenvolvimento mobile com o SDK open 
source mais recente do Google. São Paulo: Novatec, 2020.
Os links para sites da web fornecidos neste capítulo foram todos 
testados, e seu funcionamento foi comprovado no momento da 
publicação do material. No entanto, a rede é extremamente dinâmica; suas 
páginas estão constantemente mudando de local e conteúdo. Assim, os edito-
res declaram não ter qualquer responsabilidade sobre qualidade, precisão ou 
integralidade das informações referidas em tais links.
Compondo leiaute de interface de usuário no Flutter18
Dica do Professor
Atualmente, cada vez mais as empresas têm buscado ampliar seus canais de comunicação com seu 
público-alvo, e os aplicativos têm sido uma ferramenta importante nessa aproximação. Mas, para 
que o objetivo seja alcançado, é necessário que o aplicativo proporcione uma boa experiência ao 
usuário.
Para atingir esse objetivo, diversos temas estão ganhando espaço entre as equipes de 
desenvolvimento, como as interfaces de usuário, a usabilidade e a acessibilidade. Essas áreas de 
estudo verificam a relação da interface com o usuário e como ela deve se adaptar ao contexto dele, 
às diferentes formas e aos dispositivos que o usuário utiliza no seu cotidiano. Em Flutter, um widget 
nativo do framework se destaca na entrega de informações importantes nessa tarefa, o 
MediaQuery.
Na Dica do Professor, acompanhe alguns conceitos de experiência de usuário e como o 
MediaQuery pode suprir algumas dessas necessidades de informações.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
 
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/73d6bc5f660b7f7d921ac6e1645c29cc
Exercícios
1) A criação de uma interface em Flutter é composta por widgets visíveis e invisíveis, estes 
últimos representados pelos widgets de leiaute. A hierarquia entre esses widgets pode ser 
representada por uma árvore que se expande à medida que novos elementos são 
incorporados à interface.
Em relação à árvore de widgets, assinale a alternativa correta:
A) Os widgets do tipo Row devem ser utilizados sempre abaixo de um widget Column na 
hierarquia do leiaute.
B) O widget Container é utilizado para criar a raiz da hierarquia e não deve ser utilizado mais de 
uma vez.
C) Declara-se uma composição de widgets como childrens somente ao utilizar widgets do tipo 
Column ou Row.
D) Como forma de organização, podemos incluir tanto um Row em um Column, quanto um 
Column em um Row.
E) Um Container, por ser genérico, pode ser utilizado em substituição a um Column, com as 
mesmas propriedades.
Diversas metodologias e técnicas para composição de leiautes são disponíveis pelo Flutter 
em forma de widgets. Análise os conceitos sobre os widgets de leiaute a seguir e relacione a 
primeira e a segunda colunas:
I. Center 
II. Container 
III. Padding 
IV. Align
( ) Pode ser usado para estruturar o leiaute geral da tela de um aplicativo ou partes menores. 
( ) Fornece nove opções para posicionamento de um widget visível. 
( ) Tem a capacidade de alterar os espaços entre um widget e os elementos ao seu redor.2) 
( ) Afeta o posicionamento horizontal de um widget visível.
Assinale a alternativa que apresenta a ordem correta:
A) I, III, IV, II.
B) II, IV, III, I.
C) III, IV, I, II.
D) IV, I, III, I.
E) II, III, I, IV.
3) Uma interface para uma aplicação Flutter é composta por um grande conjunto de widgets de 
interface organizados por widgets de leiaute. Entre esses widgets, encontramos os Columns e 
os Rows.
Sobre os widgets Column e Row, avalie as seguintes afirmações 
e a relação proposta entre elas:
I. É muito comum compor leiautes utilizando widgets Column 
em conjunto com widgets Row.
Porque:
II. Ambos são interdependentes um do outro.
Assinale a alternativa correta:
A) As afirmações I e II são proposições verdadeiras, mas a II não justifica a I. 
B) As afirmações I e II são proposições verdadeiras e a II justifica a I. 
C) A afirmação I é uma proposição verdadeira e a II, falsa. 
D) A afirmação I é uma proposição falsa e a II, verdadeira. 
E) As afirmações I e II são proposições falsas. 
Responsividade não é um conceito novo, sendo implementado há bastante tempo no 
desenvolvimento de aplicações para web. Analise as afirmativas a seguir e classifique-as em 
verdadeiras (V) ou falsas (F):
4) 
( ) Um design pode ser considerado responsivo quando apresentar exatamente a mesma 
estrutura de leiaute em qualquer dispositivo, tanto na vertical quanto na horizontal. 
( ) Um leiaute responsivo em Flutter deve se preocupar principalmente com dispositivos 
móveis, visto que o framework é voltado para aplicativos e não para sistemas desktop. 
( ) Um leiaute responsivo deve considerar tanto o tamanho do dispositivo quanto a sua 
posição, reorganizando os widgets na tela conforme essas características.
Assinale a alternativa que preenche as lacunas de forma correta:
A) F, F, V.
B) F, V, F.
C) V, F, V.
D) V, F, F.
E) F, V, V.
5) Na criação de leiautes responsivos em Flutter, diversas técnicas podem ser utilizadas, 
baseadas no conhecimento de informações sobre o dispositivo que o usuário está utilizando 
para acesso.
Em relação ao conceito relacionado ao uso de MediaQuery, assinale a alternativa correta:
A) MediaQuery é um widget nativo do Flutter, capaz de capturar dados úteis na definição de 
leiaute, como cores preferidas, marca e modelo do dispositivo.
B) O MediaQuery tem diversas funções, entre elas reconhecer o tipo de dispositivo, 
substituindo suas funcionalidades em decorrência do tamanho da tela.
C) Por meio da propriedade of do widget MediaQuery pode-se acessar dados relevantes do 
dispositivo do usuário, como tamanho de tela e aplicativos preferidos.
D) Acessar informações do dispositivo pode auxiliar a criar melhores interfaces e experiências 
para o usuário, mas não auxilia no projeto de acessibilidade.
E) A largura do dispositivo pode ser obtida via propriedade width do objeto Size que por sua vez, 
é acessado pela propriedade size do objeto MediaQueryData.
Na prática
Os dispositivos móveis já fazem parte do cotidiano das pessoas, tanto nas horas de lazer quanto 
para auxílio no trabalho ou estudos. Esse aumento na demanda e suas características técnicas 
foram fatores que auxiliaram a impulsionar o Flutter, que cada vez ganha destaque no mercado de 
desenvolvimento de aplicativos para dispositivos móveis.
A rápida adoção a determinado aplicativo deve-se, em parte, a uma boa experiência do usuário em 
sua utilização, experiência essa que é impulsionada também por uma interface bem construída. 
Nesse sentido, aprender a utilizar corretamente os widgets de leiaute se torna imprescindível.
Na Prática, acompanhe o desenvolvimento da interface de um aplicativo Pomodoro, para auxiliar na 
gestão do tempo.
 
Aponte a câmera para o 
código e acesse o link do 
conteúdo ou clique no 
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/620f03e7-04d2-431d-8447-64486dfe4908/8e94ccf2-a037-4d53-b2d2-543f25794dd8.jpg
Saiba mais
Para ampliar o seu conhecimento a respeito desse assunto, veja a seguir as sugestões do professor:
Tutorial Flutter #03 - Layout
Neste vídeo, acompanhe uma introdução a criação de leiautes com o Flutter framework e o uso de 
widgets de interface e o widget de leiaute Center.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Tutorial Flutter #04 - Containers e Padding
Neste vídeo, conheça um pouco mais sobre os widgets Container e Padding, como é a interação 
entre eles e com outros widgets visíveis.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Flutter.Dev
Neste site, conheça a documentação oficial do Flutter, um dos maiores repositórios de informação 
sobre a ferramenta, com exemplos de código e tutoriais sobre os principais widgets, entre outros 
temas.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://www.youtube.com/embed/qTbEIHokhTk
https://www.youtube.com/embed/RQyBJA3RpfM
https://flutter.dev/docs/development/ui/layout
[Flutter] - Responsivo/Adaptativo deixando seu aplicativo igual 
em qualquer dispositivo
Neste vídeo, conheça um pouco sobre o funcionamento da responsividade/adaptatividade em 
aplicativos Flutter, além de configurações utilizando porcentagem, metade da tela e LayoutBuilder.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Layout Explorer
Neste vídeo, você vai conhecer a ferramenta Layout Explorer (Dart DevTools) e como ela pode ser 
útil na visualização dos widgets do Flex e seus filhos. Serão apresentadas também três formas de 
usar o Layout Explorer para depurar problemas de leiaute durante a criação de um aplicativo.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://www.youtube.com/embed/WSRn9G66xwg
https://www.youtube.com/embed/Jakrc3Tn_y4

Mais conteúdos dessa disciplina