Ответ
Ключи (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) или анимации виджетов между разными ветками дерева.