Pontos de quebra com LayoutBuilder
Parte da seção Layouts que se adaptam do Journey de Flutter da Coddy. Lição 17 de 30.
Em um tablet, um aplicativo de e-mail mostra o menu ao lado das mensagens. Em um celular, não há espaço, então o menu fica na parte superior. A largura em que o layout muda é chamada de ponto de interrupção.
LayoutBuilder informa quanto espaço um widget tem e permite criar algo diferente para cada tamanho:
LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth < 600) {
return Column(children: [menu, content]); // celular
}
return Row(children: [menu, content]); // tablet
},
)builder é uma função que o Flutter chama com o espaço disponível, em constraints. constraints.maxWidth é a largura máxima permitida para o resultado. Abaixo de 600 pixels, você retorna uma Column; caso contrário, uma Row. Em um celular com 390 pixels, você vê a coluna; em um tablet com 1000 pixels, a linha.
MediaQuery lê a tela inteira. LayoutBuilder lê o espaço de um widget, então continua funcionando quando esse widget é um painel dentro de uma página maior.
Desafio
MédioO menu e o conteúdo ficam sempre lado a lado, o que deixa pouco espaço em um celular. Use um LayoutBuilder com um ponto de quebra em 600 pixels:
- menos de 600: o menu acima do conteúdo, em uma
Column - 600 ou mais: lado a lado, em uma
Row, como agora
Experimente você mesmo
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: const Text('Mail')),
body: Row(
children: [
Expanded(
child: Container(
color: Colors.teal.shade100,
child: const Center(child: Text('Menu')),
),
),
Expanded(
flex: 2,
child: Container(
color: Colors.white,
child: const Center(child: Text('Content')),
),
),
],
),
),
);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Layouts que se adaptam
1Compartilhando uma linha
Expanded preenche a linhaCompartilhando espaço com flexFlexible se ajusta ao filhoSpacer separa os elementos4Tamanhos e pontos de quebra
Largura total: double.infinityUma largura máximaTamanho da tela: MediaQueryPontos de quebra com LayoutBuilderPratique por conta própria: Compilador de Flutter online