Что такое PageStorageKey в Flutter?

«Что такое PageStorageKey в Flutter?» — вопрос из категории Flutter виджеты, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PageStorageKey — это специальный тип ValueKey, который используется в паре с виджетом PageStorage для идентификации и сохранения состояния конкретного виджета (чаще всего позиции скролла).

Назначение: Связывает состояние виджета (данные) с уникальным идентификатором в PageStorageBucket. Это позволяет Flutter понять, какое состояние принадлежит какому виджету, особенно когда виджет уничтожается и создается заново.

Синтаксис и использование:

// Для простых случаев можно использовать строку
const PageStorageKey<String>('my_unique_list_key')

// Или любой другой comparable-объект в качестве значения
PageStorageKey<int>(42)
PageStorageKey<MyClass>(myInstance) // где MyClass реализует == и hashCode

Типичный сценарий применения со Scrollable виджетами:

CustomScrollView(
  key: const PageStorageKey('home_feed_scroll'),
  slivers: [
    SliverList(...),
  ],
)
// При возврате на этот экран позиция скролла восстановится автоматически.

Ключевые моменты:

  • Уникальность: Ключ должен быть уникальным в рамках одного PageStorageBucket (обычно в рамках одного маршрута/Route) для разных сохраняемых виджетов. Иначе состояния могут перепутаться.
  • Типизация: Использование дженерика (PageStorageKey<T>) помогает избежать случайных коллизий ключей разных типов.
  • Не для всех виджетов: В основном используется со ListView, GridView, CustomScrollView и другими прокручиваемыми виджетами, но может применяться и для сохранения другого простого состояния.

Без PageStorageKey скроллящиеся виджеты при повторной инициализации начинали бы с позиции 0.0.