Alguém com experiência no uso CustomSingleChildLayout
e CustomMultiChildLayout
aulas pode explicar em detalhes (com exemplos) como usá-los.
Eu sou novo no Flutter e estou tentando entender como usá-los. No entanto, a documentação é horrível e não é clara. Tentei vasculhar a internet em busca de exemplos, mas não há outra documentação.
Ficaria eternamente grato se você pudesse ajudar.
Obrigado!
flutter
dart
flutter-layout
Walter M
fonte
fonte
Respostas:
Antes de tudo, quero dizer que estou feliz em ajudá-lo com isso, pois posso entender suas lutas - há benefícios em descobrir isso sozinho (a documentação é incrível).
O
CustomSingleChildLayout
que será óbvio depois que eu expliqueiCustomMultiChildLayout
a você.CustomMultiChildLayout
O objetivo deste widget é permitir que você organize os filhos que você transmite a ele em uma única função, ou seja, suas posições e tamanhos podem depender um do outro, o que é algo que você não pode obter usando, por exemplo, o
Stack
widget pré-construído .Agora, você precisa seguir mais duas etapas antes de começar a organizar seus filhos:
children
precisa ser umaLayoutId
e você passa o widget que realmente deseja mostrar quando criançaLayoutId
. Elesid
identificarão seus widgets de maneira exclusiva, tornando-os acessíveis ao organizá-los:MultiChildLayoutDelegate
subclasse que lide com a parte do layout. A documentação aqui parece ser muito elaborada.Agora, toda a configuração está concluída e você pode começar a implementar o layout real. Existem três métodos que você pode usar para isso:
hasChild
, que permite verificar se um ID específico (lembra-seLayoutId
?) foi passado para ochildren
, ou seja, se um filho desse ID estiver presente.layoutChild
, que você precisa chamar para todos os IDs , todas as crianças, fornecidas exatamente uma vez e fornecerá o resultadoSize
dessa criança.positionChild
, que permite alterar a posição deOffset(0, 0)
para qualquer deslocamento especificado.Sinto que o conceito deve ficar bem claro agora, e é por isso que ilustrarei como implementar um delegado para o exemplo
CustomMultiChildLayout
:Dois outros exemplos são o da documentação (verifique a etapa 2 da preparação ) e um exemplo do mundo real que escrevi há algum tempo para o
feature_discovery
pacote:MultiChildLayoutDelegate
implementação eCustomMultiChildLayout
nobuild
método .A última etapa é substituir o
shouldRelayout
método , que controla simples seperformLayout
deve ser chamado novamente em um determinado momento comparando com um delegado antigo (opcionalmente, você também pode substituirgetSize
) e adicionando o delegado ao seuCustomMultiChildLayout
:Considerações
Eu usei
1
e2
como os IDs neste exemplo, mas usar umenum
é provavelmente a melhor maneira de lidar com os IDs se você tiver IDs específicos.Você pode passar um
Listenable
parasuper
(por exemplosuper(relayout: animation)
) se desejar animar o processo de layout ou acioná-lo com base em uma audição em geral.CustomSingleChildLayout
A documentação explica muito bem o que eu descrevi acima e aqui você também verá por que eu disse que
CustomSingleChildLayout
será muito óbvio depois de entender comoCustomMultiChildLayout
funciona:Isso também significa que o uso
CustomSingleChildLayout
segue os mesmos princípios que descrevi acima, mas sem IDs, porque há apenas um filho.Você precisa usar um em
SingleChildLayoutDelegate
vez disso, que possui métodos diferentes para implementar o layout (todos eles têm comportamento padrão, portanto, tecnicamente, todos são opcionais para substituir ):getConstraintsForChild
, que é equivalente às restrições pelas quais passeilayoutChild
acima.getPositionForChild
, que é equivalente apositionChild
acima.Tudo o resto é exatamente o mesmo (lembre-se de que você não precisa
LayoutId
e só tem um filho único em vez dechildren
).MultiChildRenderObjectWidget
É nisso que
CustomMultiChildLayout
se baseia.Usar isso requer um conhecimento ainda mais profundo sobre o Flutter e é novamente um pouco mais complicado, mas é a melhor opção se você quiser mais personalização, pois é um nível ainda mais baixo. Isso tem uma grande vantagem sobre
CustomMultiChildLayout
(geralmente, há mais controle):CustomMultiChildLayout
não pode dimensionar -se com base em seus filhos (ver questão sobre uma melhor documentação para o raciocínio ).Não explicarei como usar
MultiChildRenderObjectWidget
aqui por razões óbvias, mas se você estiver interessado, pode conferir minha submissão ao desafio Flutter Clock após 20 de janeiro de 2020, no qual usoMultiChildRenderObjectWidget
extensivamente - você também pode ler um artigo sobre isso , o que deve explicar um pouco de como tudo funciona.Por enquanto, você pode se lembrar que
MultiChildRenderObjectWidget
é isso que tornaCustomMultiChildLayout
possível e usá-lo diretamente fornecerá alguns bons benefícios, como não precisar usarLayoutId
e, em vez disso, ser capaz de acessar osRenderObject
dados pai diretamente.Fato engraçado
Eu escrevi todo o código em texto sem formatação (no campo de texto StackOverflow), portanto, se houver erros, aponte-os para mim e eu os corrigirei.
fonte
LayoutId
ser exclusivo global ou localmente? globalmente, ou seja, os widgets do tipo irmãoCustomMultiChildLayout
exigem ter distintosLayoutId
em seus filhos.LayoutId
, o que significa que estes dados, a ID, só vai ser acedida pelo progenitor directa :)CustomMultiChildLayout
é tão útil em cenários em que você precisa agrupar o redimensionamento automático de vários widgets de texto dentro de umColumn
deRow
, por exemplo.