Sobes.tech
Middle

O que é InheritedWidget e como usá-lo no Flutter?

sobes.tech IA

Resposta da IA

InheritedWidget é um tipo especial de widget no Flutter que permite distribuir informações de forma eficiente para baixo na árvore de widgets. É utilizado para fornecer dados e serviços às subárvores de widgets sem necessidade de passá-los explicitamente através dos construtores de cada widget intermédio.

Características principais do InheritedWidget:

  • Distribuição eficiente de dados: Quando o InheritedWidget muda, o Flutter reconstrói automaticamente apenas os widgets na subárvore que dependem dele.
  • Acesso fácil aos dados: Os widgets filhos podem acessar os dados do InheritedWidget usando o método estático of().
  • Gestão de dependências: O método updateShouldNotify permite controlar quando os widgets dependentes devem ser reconstruídos.

Como usar o InheritedWidget:

  1. Criar uma classe que herde de InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Dados que serão distribuídos
    
      // Método para obter a instância do InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'Nenhum MyInheritedWidget encontrado no contexto');
        return result!;
      }
    
      // Define se os widgets dependentes devem ser notificados sobre mudanças
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Notifica se os dados mudaram
      }
    }
    
  2. Inserir o InheritedWidget na árvore de widgets:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Envolver a subárvore de widgets
          data: 'Olá do InheritedWidget',
          child: MaterialApp(
            title: 'Demo InheritedWidget',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('Demo InheritedWidget'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget que usará os dados
              ),
            ),
          ),
        );
      }
    }
    
  3. Acessar os dados de um widget filho:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Acessa os dados usando o método of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

O InheritedWidget é a base para muitas soluções de gerenciamento de estado no Flutter, como Provider, Bloc. Ele fornece uma maneira eficiente e declarativa de trocar dados na árvore de widgets.