InheritedWidget

A maneira mais fácil de propagar informações para a sua Widget Tree.

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(color != null),
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.