Skip to main content

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.

info

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).

caution

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.