Ключи во Flutter

dart flutter

Основные варианты применения

ValueKey — для элементов списков, чтобы правильно сопоставлять состояние с элементами. Без ключей, такие списки будут себя неправильно вести при изменяемых списках (вставка, удаление, перемещение). Используется сравнение через ==.

ListView(
  children: items
    .map(
      (item) => ListTile(
        key: ValueKey(item.id),
        title: Text(item),
      ),
    )
    .toList(),
)

ObjectKey — то же применение, что у ValueKey, только сравнение ключей идёт по типу is и по ссылке identical(), даже если переопределён метод ==.

UniqueKey — чтобы виджет всегда пересоздавался (именно пересоздание, соответственно и обнуление состояния, а не просто вызов build повторный).

GlobalKey — для доступа к состоянию из любого места. Например, для валидации форм:

  final _formKey = GlobalKey<FormState>();
  _formKey.currentState.validate()

PageStorageKey — используется для сохранения состояния страницы при навигации (например скролл в ListView).