Sobes.tech
Назад к вопросам
Junior — Middle
73

Можете объяснить концепцию PageStorage и для чего она используется в системе?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

PageStorage в Flutter нужен для сохранения небольшого состояния страницы между переключениями внутри дерева виджетов. Обычно он помогает запоминать позицию скролла или другой локальный UI-state, когда виджет временно убирается из дерева и потом создаётся снова. Это не полноценное хранилище данных, а механизм для восстановления состояния интерфейса.

Определение:

PageStorage — это специальное хранилище в Flutter, привязанное к дереву виджетов, которое позволяет сохранять и восстанавливать небольшие значения для отдельных страниц или вложенных виджетов. Чаще всего оно используется вместе с PageStorageKey, чтобы Flutter мог отличать одну страницу от другой и возвращать ранее сохранённое состояние, например положение списка.

Пример использования:

Типичный случай — вкладки с ListView: пользователь прокручивает список на одной вкладке, переключается на другую, затем возвращается обратно, и список остаётся на прежнем месте.

class MyTabs extends StatelessWidget {
  const MyTabs({super.key});

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          bottom: const TabBar(
            tabs: [
              Tab(text: 'Новости'),
              Tab(text: 'Чаты'),
            ],
          ),
        ),
        body: const TabBarView(
          children: [
            ListView(
              key: PageStorageKey<String>('news-list'),
              children: [
                ListTile(title: Text('Новость 1')),
                ListTile(title: Text('Новость 2')),
              ],
            ),
            ListView(
              key: PageStorageKey<String>('chats-list'),
              children: [
                ListTile(title: Text('Чат 1')),
                ListTile(title: Text('Чат 2')),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

Пояснение кода:

В этом примере у каждого ListView есть свой PageStorageKey.
Когда пользователь переключается между вкладками, TabBarView может пересоздавать содержимое, но PageStorage сохраняет состояние каждого списка отдельно.
За счёт ключа Flutter понимает, что news-list и chats-list — это разные сущности, и восстанавливает для каждой её сохранённые данные, например scroll offset.

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

  • PageStorage хранит только небольшое UI-состояние, а не бизнес-данные.
  • Основной практический кейс — сохранение позиции скролла при навигации или переключении вкладок.
  • Для работы обычно нужен PageStorageKey, чтобы состояние было привязано к конкретному виджету.
  • Это полезно, когда виджет удаляется из дерева и потом создаётся заново.
  • Не стоит использовать PageStorage как замену State, Provider, Bloc или другой архитектуре хранения данных.