Reutilizando componentes no flutter

Como criar um componente com flutter para utilizar em diversos lugares do meu app?

Certamente existem diversos conteúdos sobre componentes em flutter. Porém, como venho me divertindo com flutter desde o ano passado, achei coerente escrever um pouco de minhas experiencias com criação de widgets.

Ah!

São componentes que estou usando dentro do projeto, então não me preocupei em criar um repositório de componentes para utilizá-los em outros projetos. Até o momento, o único projeto que tem widgets é o único que publiquei em flutter (o troca fraldas, que está em beta ainda).

Troca o que?

É, troca fraldas. Ficou curioso? ta aqui: https://play.google.com/apps/testing/com.rcelebrone.app.trocafraldas

Bom, vamos ao que interessa.

Para simplificar e para não colocar o source do meu projeto como publico, criei outro projeto só com os widgets que criei (já mudaram um pouco, mas a base é essa ai).
Ta aqui: https://github.com/rcelebrone/flutter-widgets

Vou usar um dos componentes que criei lá no inicio e sofri um pouco para chegar no resultado que queria. É o "drop_with_label.dart". E ai tem 3 pontos que gostaria de compartilhar.

Stateless vs Stateful

Bom, É importante escolher o estado do widget. Se você pretende ter um componente que sofrerá mudança em seu estado (state), então é interessante trabalhar com stateful. Agora, se seu componente é simplesmente carregado e não é alterado pelo comportamento do usuário, então vai pra stateless (Text() por exemplo).
Você vai perceber que esse widget não existe setState(), pois não preciso trabalhar o estado deles, ou seja, ele é stateless (da pra perceber isso principalmente por ele herdar de StatelessWidget).

Evento onChanged

No geral, qualquer função que usei nos meus widgets elas apenas executam uma função que é passada pelo widget pai (aquele que está usando meu widget).
linha 30: onChanged: (String newValue) => this.onChanged(newValue) 
Isso porque meu widget não controla nada dentro dele, então eu apenas "exponho a função" através de um parâmetro do tipo Function na classe do meu widget.

E claro, o @required

Enfim, o mais simples de compreender é o @required, mas é o mais importante. Se você não marcar os parâmetros que seu widget precisa pra funcionar, como parâmetro obrigatório, o usuário do seu widget vai conseguir implementar e encontrará problemas pra usar o seu widget. Então, vale sempre se atentar a usar o @required ou ao menos informar um valor default para o seu parâmetro como foi feito nesse exemplo: Exemplo({Key key, this.label = "olá", @required this.onChanged}). Ah, é importante lembrar que valores defaults só são possíveis com constantes, blz?

Enfim, é isso. A ideia é mostrar um pouco do que sofri no inicio do flutter. Umas 3 batidas de cabeça e fica natural trabalhar com widgets depois de um tempo. Vlw :)