InheritedWidget
Não importa quão grande seja a sua estrutura de widgets, se precisar passar informações no sentido TOP-DOWN (de cima para baixo), sem dúvida alguma o InheritedWidget deve ser a sua escolha.
Recomendo que você assista aos 2 vídeos que constam na documentação. S ão curtos e didáticos.
Ao criarmos um widget extendendo um InheritedWidget, temos que sobrescrever os métodos of
(para acessar nosso widget facilmente) e updateShouldNotify
(para indicar quando nosso widget deve ser reconstruído).
class MeuEmail extends InheritedWidget {
const MeuEmail({
Key key,
this.provedor,
Widget child,
}) : assert(child != null),
super(key: key, child: child);
final String provedor;
static MeuEmail of(BuildContext context) {
return context.inheritFromWidgetOfExactType(MeuEmail) as MeuEmail;
}
bool updateShouldNotify(MeuEmail old) => provedor != old.provedor;
}
No exemplo acima, para acessar a propriedade provedor do widget MeuEmail, basta apenas invocar:
final provedorEmail = MeuEmail.of(context).provedor;
Simples, certo? Por isso o esta solução é utilizada (e muito!) pelo Flutter. Com ela, é possível acessar em qualquer lugar na widget tree informações como o tamanho da tela e o tema da aplicação (cores, tamanhos, fontes, etc).
Inherited significa herdado, sendo assim, todos os filhos de um InheritedWidget acessam suas propriedades facilmente (eles herdam tais propriedade do "pai"). Por isso o comum é colocar o InheritedWidget no topo da widget tree.
Se necessário alterar a propriedade provedor
do widget MeuEmail e refletir esta alteração por toda a estrutura de widget, devemos combinar os widgets InheritedWidget e InheritedModel.
Como sugerido pelos vídeos da documentação, nesta situação o ideal é utilizar os packages como o scoped_model ou provider. Eles irão prover este mesmo tipo de comportamento, com muito menos código.