В чем разница между локальными (LocalKey) и глобальными (GlobalKey) ключами в Flutter?

«В чем разница между локальными (LocalKey) и глобальными (GlobalKey) ключами в Flutter?» — вопрос из категории Flutter виджеты, который задают на 44% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключи (Key) в Flutter используются для идентификации виджетов при перестроении дерева. Разница между LocalKey и GlobalKey — в их области видимости и возможностях.

Аспект LocalKey GlobalKey
Область видимости В пределах родительского виджета (Element). Глобально во всем приложении.
Основная цель Идентификация виджетов-братьев при реконфигурации списка или анимированных переходах. Получение доступа к состоянию (State) или контексту (BuildContext) виджета из любой точки приложения.
Производительность Легковесные. Дорогие, так как требуют глобальной регистрации и могут мешать сборке мусора.
Типы ValueKey, ObjectKey, UniqueKey. GlobalKey (обычный) и GlobalKey<FormState>, GlobalKey<ScaffoldState> и т.д.

Пример LocalKey (ValueKey в ListView):

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    final item = items[index];
    return ListTile(
      // ValueKey помогает Flutter корректно анимировать
      // перемещение/удаление элементов при изменении списка.
      key: ValueKey(item.id),
      title: Text(item.title),
    );
  },
)

Пример GlobalKey (для доступа к состоянию Form):

class MyForm extends StatelessWidget {
  // Создаем глобальный ключ для формы
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey, // Передаем ключ форме
      child: Column(
        children: [
          TextFormField(validator: (value) { /* ... */ }),
          ElevatedButton(
            onPressed: () {
              // Используем ключ для валидации и сохранения формы
              // извне самого виджета Form.
              if (_formKey.currentState!.validate()) {
                _formKey.currentState!.save();
                // Отправка данных...
              }
            },
            child: Text('Отправить'),
          ),
        ],
      ),
    );
  }
}

Правило: Всегда используйте LocalKey, если достаточно его возможностей. Применяйте GlobalKey только в случаях, когда необходим глобальный доступ к состоянию виджета, например, для управления Form, Scaffold (через ScaffoldMessenger) или анимации виджетов между разными ветками дерева.