← Назад к вопросам

Что такое глобальные ключи?

1.0 Junior🔥 11 комментариев
#Flutter виджеты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

GlobalKey - глобальные ключи для доступа к State

GlobalKey позволяет получить доступ к State виджета и его контексту из любого места приложения. Это уникальный идентификатор для виджета, работающий в масштабе всего приложения.

Основные назначения

1. Валидация форм

final _formKey = GlobalKey<FormState>();

Form(
  key: _formKey,
  child: Column(
    children: [
      TextFormField(
        validator: (val) => val?.isEmpty ?? true ? "Required" : null,
      ),
      ElevatedButton(
        onPressed: () {
          if (_formKey.currentState!.validate()) {
            print("Form valid");
          }
        },
        child: Text("Submit"),
      ),
    ],
  ),
)

2. Доступ к методам State

final _childKey = GlobalKey<_ChildState>();

// Вызов метода в State дочернего виджета
_childKey.currentState?.myMethod();

// Получение контекста
var ctx = _childKey.currentContext;

3. Управление ScaffoldState

final _scaffoldKey = GlobalKey<ScaffoldState>();

Scaffold(
  key: _scaffoldKey,
  body: ElevatedButton(
    onPressed: () {
      _scaffoldKey.currentState?.openDrawer();
      _scaffoldKey.currentState?.showSnackBar(
        SnackBar(content: Text("Hi"))
      );
    },
    child: Text("Open"),
  ),
)

Типы GlobalKey

  • GlobalKey<State<T>> - базовый ключ для StatefulWidget
  • GlobalKey<FormState> - для Form виджетов
  • GlobalKey<ScaffoldState> - для Scaffold
  • GlobalKey<NavigatorState> - для Navigator

Когда использовать

  • Валидация форм (основное применение)
  • Управление Scaffold (drawer, snackbar)
  • Сохранение State при перестроении дерева
  • Прямой доступ к методам дочернего виджета

Когда НЕ использовать

  • Частые обновления состояния
  • Сложное управление состоянием (используй Provider, BLoC)
  • Синхронизация данных между компонентами

Best Practice

  • Используй GlobalKey только для форм и специфических виджетов
  • Предпочитай State Management (Provider, Riverpod) для глобального состояния
  • Всегда указывай тип: GlobalKey<FormState>, не просто GlobalKey
  • Закрывай ресурсы в dispose()

GlobalKey - мощный инструмент для специфических задач, но его переиспользование указывает на проблемы архитектуры приложения.

Что такое глобальные ключи? | PrepBro