Смесь 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 во вкладках