Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
799 of 1024 menu
◀ ▶

Смесь AutomaticKeepAliveClientMixin

Смесь AutomaticKeepAliveClientMixin подключают к State внутри прокручиваемых списков и вкладок. Геттер wantKeepAlive возвращает true, если State нужно сохранить. В build вызывают super.build(context) из миксина.

Синтаксис

class _TabState extends State<TabPage> with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => true; @override Widget build(BuildContext context) { super.build(context); return const Text('abcde'); } }

Пример

Давайте сохраним счётчик вкладки с wantKeepAlive:

import 'package:flutter/material.dart'; void main() { runApp( MaterialApp( home: DefaultTabController( length: 2, child: Scaffold( appBar: AppBar( bottom: const TabBar( tabs: [ Tab(text: 'abcde'), Tab(text: 'other'), ], ), ), body: TabBarView( children: [ KeepCounter(), const Center(child: Text('12345')), ], ), ), ), ), ); } class KeepCounter extends StatefulWidget { const KeepCounter({super.key}); @override State<KeepCounter> createState() => _KeepCounterState(); } class _KeepCounterState extends State<KeepCounter> with AutomaticKeepAliveClientMixin { var n = 0; @override bool get wantKeepAlive => true; @override Widget build(BuildContext context) { super.build(context); return Center( child: ElevatedButton( onPressed: () => setState(() => n++), child: Text('$n'), ), ); } }

На экране счётчик на вкладке 'abcde' сохранится после переключения вкладок.

Пример

Давайте отключим сохранение через wantKeepAlive false:

import 'package:flutter/material.dart'; void main() { runApp( MaterialApp( home: Scaffold( body: ListView( children: [ SizedBox( height: 400, child: DropCounter(), ), const SizedBox(height: 800), const Text('12345'), ], ), ), ), ); } class DropCounter extends StatefulWidget { const DropCounter({super.key}); @override State<DropCounter> createState() => _DropCounterState(); } class _DropCounterState extends State<DropCounter> with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => false; @override Widget build(BuildContext context) { super.build(context); return const Center(child: Text('abcde')); } }

На экране при wantKeepAlive false текст 'abcde' может сброситься после прокрутки.

Смотрите также

  • метод deactivate,
    который чаще вызывают без keep alive
  • метод dispose,
    который идёт, если State не удержали
  • класс State,
    к которому подмешивают mixin
  • класс StatefulWidget,
    чьи State используют mixin во вкладках
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить