Sobes.tech
Middle

Какви са GlobalKeys във Flutter и как се използват?

sobes.tech AI

Отговор от AI

GlobalKey е уникален ключ, който идентифицира widget в цялата йерархия на приложението.

Използва се за:

  1. Достъп до състоянието на widget: Позволява да се получи достъп до състоянието на StatefulWidget от всяко място в дървото на widget-овете.

    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);
      }
    }
    
    // ... някъде другаде:
    myWidgetKey.currentState?.updateText("Updated");
    
  2. Запазване на състоянието на widget при преместване в дървото: Полезно, когато искате да преместите widget на друго място в UI, като запазите неговото състояние.

    GlobalKey keyForMovableWidget = GlobalKey();
    
    // ...
    
    Widget movableWidget = Container(
      key: keyForMovableWidget,
      color: Colors.blue,
      width: 100,
      height: 100,
    );
    
    // При преместване на movableWidget на друго място в дървото,
    // неговото състояние ще се запази благодарение на GlobalKey.
    
  3. Обаждане на методи на widget: Позволява извикването на публични методи на widget отвън.

    GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
    
    // ...
    
    Scaffold(
      key: scaffoldKey,
      // ...
    );
    
    // ... някъде другаде:
    scaffoldKey.currentState?.openDrawer();
    

Важно е да се помни, че честата употреба на GlobalKey може да усложни дървото на widget-овете и да затрудни отстраняването на грешки. В повечето случаи е по-добре да се използват други механизми за управление на състоянието, като Provider, Riverpod или Bloc. GlobalKey трябва да се използва само когато другите подходи не са приложими.