Olá, Cauê, tudo bem?
Sobre o que você comentou: “Vimos que o Expanded() também pode definir o tamanho ou limites máximos de Column e Row.”
Na verdade, o Expanded() não define diretamente os limites de uma Column ou Row, mas sim de um dos seus filhos. O que ele faz é indicar que aquele filho deve ocupar todo o espaço restante disponível dentro do eixo principal da Column ou do Row. Então, ele não limita diretamente o tamanho da Column ou Row, mas sim dos widgets filhos dentro delas.
Agora, respondendo à sua dúvida sobre o uso de Expanded() com ListView() dentro de uma Column(), como foi o caso antes de usarmos o CustomScrollView() na tela de highlights:
Sim, daria erro se a gente colocasse um ListView() diretamente dentro de uma Column() sem usar algo que limitasse sua altura, como o Expanded().
Esse erro aconteceria porque o ListView() tenta ocupar o máximo de espaço possível, e como a Column() não impõe limite de altura aos seus filhos, o Flutter se perde tentando renderizar algo com tamanho “infinito”, o que causa um erro do tipo: Vertical viewport was given unbounded height.
Nesse caso, envolver o ListView() com um Expanded() é uma solução válida, pois ele diz ao Flutter: “Pode usar o espaço que sobrar aqui”, o que resolve o problema e deixa o layout funcional.
E além do Expanded, vale dizer que há outras formas corretas de limitar o tamanho do ListView dentro de uma Column(). Você pode, por exemplo, usar:
Flexible, quando quiser que ele ocupe o espaço restante, mas de forma mais flexível;SizedBox, se quiser definir uma altura exata ou proporcional (ex: height: MediaQuery.of(context).size.height * 0.6).
Espero ter esclarecido!
Os links acima estão em inglês, mas vale a pena utilizar a tradução automática do navegador, caso se sinta mais confortável. A documentação do Flutter é de fácil leitura e bem intuitiva
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!