Метод setState
Метод setState класса State принимает колбэк, где меняют поля State. После колбэка фреймворк вызовет build для этого элемента. Вызывать setState нужно только когда State ещё смонтирован.
Синтаксис
void setState(VoidCallback fn)
Параметры
| Параметр | Описание |
|---|---|
fn |
Функция без аргументов, где обновляют поля State
перед следующим build.
|
Пример
Давайте переключим текст кнопкой через setState:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: ToggleCaption(),
),
),
),
);
}
class ToggleCaption extends StatefulWidget
{
const ToggleCaption({super.key});
@override
State<ToggleCaption> createState() => _ToggleCaptionState();
}
class _ToggleCaptionState extends State<ToggleCaption>
{
var label = 'abcde';
@override
Widget build(BuildContext context)
{
return ElevatedButton(
onPressed: () => setState(() {
label = label == 'abcde' ? '12345' : 'abcde';
}),
child: Text(label),
);
}
}
На экране setState сменит подпись между 'abcde' и '12345'.
Пример
Давайте увеличим счётчик в setState:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: PlusOne(),
),
),
),
);
}
class PlusOne extends StatefulWidget
{
const PlusOne({super.key});
@override
State<PlusOne> createState() => _PlusOneState();
}
class _PlusOneState extends State<PlusOne>
{
int n = 0;
@override
Widget build(BuildContext context)
{
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$n'),
ElevatedButton(
onPressed: () => setState(() => n++),
child: const Text('abcde'),
),
],
);
}
}
На экране число вырастет при каждом нажатии на 'abcde'.
Смотрите также
-
класс
State,
к которому относитсяsetState -
метод
build,
который вызывают послеsetState -
виджет
StatefulBuilder,
который даётsetStateбез отдельногоStateкласса -
класс
ChangeNotifier,
который оповещает слушателей вместоsetState