← Назад к вопросам

Что такое PageStorage?

1.3 Junior🔥 172 комментариев
#Архитектура Flutter

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое PageStorage?

PageStorage - это вспомогательный класс Flutter, который позволяет сохранять состояние (state) виджетов при навигации между страницами. Он предоставляет механизм для восстановления данных формы, позиции скролла и других состояний, когда пользователь возвращается на предыдущую страницу.

Основная функция PageStorage

PageStorage используется для восстановления состояния страницы после навигации:

  • Позиция скролла в списке
  • Введенный текст в текстовом поле
  • Выбранный элемент в выпадающем списке
  • Состояние любого другого виджета с key

Как работает PageStorage

class MyScrollableWidget extends StatefulWidget {
  @override
  State<MyScrollableWidget> createState() => _MyScrollableWidgetState();
}

class _MyScrollableWidgetState extends State<MyScrollableWidget> {
  final PageStorageKey _storageKey = PageStorageKey("my_list");
  
  @override
  Widget build(BuildContext context) {
    return ListView(
      key: _storageKey,
      children: List.generate(
        100,
        (index) => ListTile(title: Text("Item $index")),
      ),
    );
  }
}

Пример с сохранением позиции скролла

class ProductListPage extends StatefulWidget {
  @override
  State<ProductListPage> createState() => _ProductListPageState();
}

class _ProductListPageState extends State<ProductListPage> {
  final PageStorageKey _listKey = PageStorageKey("products");
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Products")),
      body: ListView(
        key: _listKey,
        children: List.generate(
          100,
          (index) => ListTile(
            title: Text("Product $index"),
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => ProductDetailPage(id: index),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

PageStorage с TabBarView

Особенно полезен PageStorage при работе с TabBarView:

class TabbedPage extends StatefulWidget {
  @override
  State<TabbedPage> createState() => _TabbedPageState();
}

class _TabbedPageState extends State<TabbedPage>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;
  
  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this);
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Tabs"),
        bottom: TabBar(
          controller: _tabController,
          tabs: [
            Tab(text: "Home"),
            Tab(text: "Search"),
            Tab(text: "Profile"),
          ],
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          ListView(
            key: PageStorageKey("home_tab"),
            children: _buildList("Home"),
          ),
          ListView(
            key: PageStorageKey("search_tab"),
            children: _buildList("Search"),
          ),
          ListView(
            key: PageStorageKey("profile_tab"),
            children: _buildList("Profile"),
          ),
        ],
      ),
    );
  }
}

Важные моменты

  • PageStorageKey должен быть уникален в пределах страницы
  • PageStorage работает только с Navigator.pop()
  • Если использовать replacement навигацию, состояние теряется
  • Состояние сохраняется во время жизни приложения

Когда использовать PageStorage

  • Большие списки с позицией скролла
  • Формы с несколькими полями ввода
  • TabBarView с дорогостоящим контентом
  • Фильтры и сортировка в списках

PageStorage - простой и мощный инструмент для улучшения UX в Flutter приложениях.