Explicação detalhada do layout flexível da série Flutter

PS: É fácil querer fazer uma coisa, mas é muito difícil fazer realmente uma coisa.

A mesma série de artigos é a seguinte:

Flutter é uma estrutura de interface do usuário de plataforma cruzada lançada pelo Google, que pode criar rapidamente aplicativos de alta qualidade no Android e IOS. Seu principal recurso é que o Flutter tem recursos de desenvolvimento rápido, interfaces de usuário expressivas e flexíveis e bom desempenho nativo. Este artigo apresenta principalmente o layout Flex no Flutter, da seguinte maneira:

  1. Flex basics
  2. Configurações comuns do Flex
  3. Linha 和 Coluna
  4. Expandido 和 Flexível
  5. Espaço
  6. Resumindo

Flex basics

O método de layout Flex tem sido amplamente usado no desenvolvimento de front-end e pequenos programas. Se você aprendeu o layout Flex antes, é semelhante no Flutter. O diagrama esquemático da Caixa Flexível é o seguinte:

Para a introdução desta figura, consulte o artigo anterior:

Explicação detalhada do flex container do miniaplicativo WeChat

O Flex Widget pode definir a direção do eixo principal. Se você souber a direção do eixo principal, pode usar diretamente a linha ou coluna. O Flex Widget não pode rolar. Se a rolagem estiver envolvida, você pode tentar usar o ListView. Se o conteúdo do Flex Widget exceder o seu largura e altura, um aviso amarelo e preto será exibido. Listras, a mensagem de erro que aparece na direção horizontal como exemplo é a seguinte:

I/flutter (14749): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (14749): The following assertion was thrown during layout:
I/flutter (14749): A RenderFlex overflowed by 440 pixels on the right.

A exibição do erro é a seguinte:

Configurações comuns do Flex

As propriedades comuns do Flex são as seguintes:

  1. direção
  2. mainAxisAlignment
  3. mainAxisSize
  4. crossAxisAlignment
  5. direção vertical
  6. textBaseline
1 direção

Defina a direção do eixo principal, os valores configuráveis ​​são Axis.horizontal e Axis.vertical e o eixo cruzado é perpendicular à direção do eixo principal.

2. mainAxisAlignment :

Defina a disposição dos widgets filhos ao longo do eixo principal. O padrão é MainAxisAlignment.start. Os métodos de configuração são os seguintes:

  • MainAxisAlignment.start: alinhamento à esquerda, valor padrão;
  • MainAxisAlignment.end: Alinhamento à direita;
  • MainAxisAlignment.center: alinhamento central;
  • MainAxisAlignment.spaceBetween: Justificado em ambas as extremidades;
  • MainAxisAlignment.spaceAround: O espaçamento em ambos os lados de cada widget é igual, e o espaçamento da borda da tela é a metade do espaçamento entre outros Widgets;
  • MainAxisAlignment.spaceEvently: os widgets são distribuídos uniformemente e o intervalo da borda da tela é igual ao intervalo entre outros Widgets.

O efeito de comparação é o seguinte:

mainAxisAlignment

3. mainAxisSize

Defina o tamanho do eixo principal, o padrão é MainAxisSize.max, os valores que podem ser definidos são os seguintes:

  • MainAxisSize.max: O tamanho do eixo principal é o tamanho do contêiner pai;
  • MainAxisSize.min: O tamanho do eixo principal é a soma do tamanho do seu Widget.

O efeito de comparação é o seguinte:

mainAxisSize

Defina mainAxisAlignment como spaceBetween. Se mainAxisSize for definido como max, toda a largura da linha será organizada em spaceBetween. Se mainAxisSize for definido como min, será organizado em spaceBetween na soma das três larguras de contêiner

4. crossAxisAlignment

Defina a disposição dos widgets filhos ao longo do eixo cruzado. O padrão é CrossAxisAlignment.center e as configurações são as seguintes:

  • CrossAxisAlignment.start: alinha com a posição inicial do eixo cruzado;
  • CrossAxisAlignment.end: alinhe com a posição final do eixo cruzado;
  • CrossAxisAlignment.center: alinhamento central;
  • CrossAxisAlignment.stretch: preenche todo o eixo transversal;
  • CrossAxisAlignment.baseline: Alinha de acordo com a linha de base da primeira linha do texto.

O efeito de comparação é o seguinte:

crossAxisAlignment

5. direção vertical

Defina a ordem de organização dos widgets filhos na direção vertical, o padrão é VerticalDirection.down, o método de configuração é o seguinte:

  • VerticalDirection.down: começa na parte superior, termina na parte inferior;
  • VerticalDirection.up: o início está na parte inferior e o final está no topo.

O efeito de comparação é o seguinte:

direção vertical

Preste atenção ao CrossAxisAlignment.end da configuração do eixo cruzado e às mudanças na direção vertical nesta base.

6. textBaseline

Defina o tipo de linha de base para o alinhamento do texto, os valores que podem ser definidos são os seguintes:

  • TextBaseline.alphabetic: alinha com a linha de base da letra;
  • TextBaseline.ideographic: alinhar com a linha de base de caracteres ideográficos;

Ao usar, quando crossAxisAlignment é definido como linha de base, o valor da propriedade textBaseline deve ser definido.

// textBaseline
class FlexSamplePage extends StatelessWidget {
    
    
  @override
  Widget build(BuildContext context) {
    
    
    return Scaffold(
      appBar: AppBar(
        title: Text("Flex Sample"),
        centerTitle: true,
      ),
      body: Row(
        children: <Widget>[
          Expanded(
              child: Row(
                children: <Widget>[
                  Text("躬",style: TextStyle(fontSize: 40,),),
                  Text("x",style: TextStyle(fontSize: 60,),),
                  Text("ing",style: TextStyle(fontSize: 16,),),
                  Text("之",style: TextStyle(fontSize: 16,),),
                ],
          )),
          Expanded(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.baseline,
                textBaseline: TextBaseline.alphabetic,
                children: <Widget>[
                  Text("躬",style: TextStyle(fontSize: 40,),),
                  Text("x",style: TextStyle(fontSize: 60,),),
                  Text("ing",style: TextStyle(fontSize: 16,),),
                  Text("之",style: TextStyle(fontSize: 16, ),),
                ],
          )),
          Expanded(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.baseline,
                textBaseline: TextBaseline.ideographic,
                children: <Widget>[
                  Text("躬",style: TextStyle(fontSize: 40, ),),
                  Text("x",style: TextStyle(fontSize: 60,),),
                  Text("ing",style: TextStyle(fontSize: 16,),),
                  Text("之",style: TextStyle(fontSize: 16,),),
                ],
              ))
        ],
      ),
    );
  }
}

Respectivamente, sem definir a propriedade textBaseline, definindo TextBaseline.alphabetic e TextBaseline.ideographic, os efeitos de comparação são os seguintes:

Embora os dois sejam diferentes no significado da linha de base correspondente, o teste não encontrou diferença. Continue a prestar atenção à observação no período posterior, e os amigos que sabem podem comentar e apontar.

Linha 和 Coluna

Tanto a linha quanto a coluna herdam Flex, a direção do eixo principal da linha é a direção horizontal, e a direção do eixo principal da coluna é a direção vertical, ou seja, a direção do eixo principal é definida com base no Flex, como segue:

// Row
direction: Axis.horizontal,
/// Column
direction: Axis.vertical,

Se você determinar a direção do eixo principal, você pode usar diretamente Row ou Column, e o uso é o mesmo que Flex.

Expandido 和 Flexível

A propriedade de correção de Flexible é padronizada para FlexFit.loose, enquanto Expanded herda de Flexible, e sua propriedade de correção é especificada como FlexFit.tight. As duas são diferentes porque a propriedade de correção não é usada. Se a propriedade de ajuste de Flexible é definida como FlexFit.tight , depois Flexível e Expandido Equivalentemente, os atributos de ajuste que podem ser definidos são os seguintes:

  • apertado: preencher obrigatoriamente o espaço disponível;
  • solto: O espaço disponível não é forçado a preencher, o tamanho do próprio widget.

O efeito de comparação é o seguinte:

Expandido 和 Flexível

Expandido pode fazer com que os componentes em Linha, Coluna e Flex preencham o espaço disponível ao longo do eixo principal. Se vários Widgets usarem componentes Expandidos, você pode usar a propriedade Flex expandido para distribuir o espaço do eixo principal proporcionalmente. A propriedade flex é equivalente ao peso das propriedades do Android LinearLayout, conforme a seguir:

// Expanded
class ExpandedSamplePage extends StatelessWidget {
    
    
  @override
  Widget build(BuildContext context) {
    
    
    return Scaffold(
        appBar: AppBar(
          title: Text("Row Sample"),
          centerTitle: true,
        ),
        body: Row(
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            Expanded(
              flex: 1,
              child: Container(
                  width: 50,
                  height: 50,
                  color: Colors.red,
                  child: Center(
                    child: Text(
                      "A",
                      style: TextStyle(fontSize: 20, color: Colors.white),
                    ),
                  )),
            ),
            Expanded(
              flex: 2,
              child: Container(
                  width: 50, // Row Expanded下width无效
                  height: 50, // Column Expanded下height无效
                  color: Colors.green,
                  child: Center(
                    child: Text(
                      "B",
                      style: TextStyle(fontSize: 20, color: Colors.white),
                    ),
                  )),
            ),
            Container(
                width: 50,
                height: 50,
                color: Colors.yellow,
                child: Center(
                  child: Text(
                    "C",
                    style: TextStyle(fontSize: 20, color: Colors.white),
                  ),
                )),
          ],
        ));
  }
}

O efeito de exibição é o seguinte:

Espaçador

Spacer é usado para ajustar o espaçamento entre Widgets e ocupará todo o espaço restante. Portanto, a configuração de MainAxisAlignment será inválida. A propriedade flex de Spacer é usada para definir o peso de distribuição do espaço restante. O valor padrão é 1, o que significa que todo o espaço restante está ocupado. Mais de um espaçador aloca o espaço restante de acordo com o flex, a referência de código é a seguinte:

class RowSamplePage1 extends StatelessWidget {
    
    
  @override
  Widget build(BuildContext context) {
    
    
    return Scaffold(
        appBar: AppBar(
          title: Text("Row Sample"),
          centerTitle: true,
        ),
        body: ConstrainedBox(
          constraints: BoxConstraints(maxHeight: 150),
          child: Row(
            children: <Widget>[
              Container(
                width: 80,
                height: 80,
                color: Colors.red,
              ),
              Spacer(flex: 1,),
              Container(
                width: 80,
                height: 80,
                color: Colors.green,
              ),
              Spacer(flex: 2,),
              Container(
                width: 80,
                height: 80,
                color: Colors.yellow,
              ),
            ],
          ),
        ));
  }
}

O efeito de exibição é o seguinte:

O texto acima aprende principalmente o conteúdo relacionado ao layout Flex no Flutter, e o foco está na compreensão dos conceitos básicos do Flex. Com base nisso, estudei e verifiquei o layout Flex. Para obter mais conteúdo, consulte a conta pública do WeChat .

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/jzman/article/details/111829520
Recomendado
Clasificación