Sobes.tech
Middle

O que são GlobalKeys no Flutter e como são usadas?

sobes.tech IA

Resposta da IA

GlobalKey é uma chave única que identifica um widget em toda a hierarquia da aplicação.

Usado para:

  1. Acesso ao estado do widget: Permite aceder ao estado de um StatefulWidget de qualquer lugar na árvore de widgets.

    GlobalKey<_MyWidgetState> myWidgetKey = GlobalKey();
    
    // ...
    
    class MyWidget extends StatefulWidget {
      MyWidget({Key? key}) : super(key: key);
    
      @override
      _MyWidgetState createState() => _MyWidgetState();
    }
    
    class _MyWidgetState extends State<MyWidget> {
      String _text = "Initial";
    
      void updateText(String newText) {
        setState(() {
          _text = newText;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Text(_text);
      }
    }
    
    // ... noutro lugar:
    myWidgetKey.currentState?.updateText("Updated");
    
  2. Guardar o estado do widget ao mover a sua posição na árvore: Útil quando precisa mover um widget para outra parte da UI, mantendo o seu estado.

    GlobalKey keyForMovableWidget = GlobalKey();
    
    // ...
    
    Widget movableWidget = Container(
      key: keyForMovableWidget,
      color: Colors.blue,
      width: 100,
      height: 100,
    );
    
    // Ao mover o movableWidget para outro lugar na árvore,
    // o seu estado será preservado graças ao GlobalKey.
    
  3. Chamar métodos do widget: Permite chamar métodos públicos do widget de fora.

    GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
    
    // ...
    
    Scaffold(
      key: scaffoldKey,
      // ...
    );
    
    // ... noutro lugar:
    scaffoldKey.currentState?.openDrawer();
    

É importante lembrar que o uso frequente de GlobalKey pode complicar a árvore de widgets e dificultar a depuração. Na maioria dos casos, é preferível usar outros mecanismos de gestão de estado, como Provider, Riverpod ou Bloc. O GlobalKey deve ser usado apenas quando outras abordagens não forem aplicáveis.