setState перерисовывает экран
Часть раздела Добавляем интерактивность путешествия по Flutter на Coddy. Урок 11 из 34.
Нажми Add one в этом приложении и посмотри на Console: 1, 2, 3. Число на экране остаётся равным 0. Flutter построил экран один раз, и ничто не указало ему построить его снова.
StatelessWidget никогда не меняется. Экран, который меняется, — это StatefulWidget, состоящий из двух классов:
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Text('$_count');
}
}HomePage лишь указывает, какое состояние State создать (createState, записанный в стрелочной форме из раздела «Функции, возвращающие значения»). _HomePageState выполняет работу: хранит данные экрана в переменных в начале класса, например _count, и строит экран. Он существует, пока существует экран, поэтому _count сохраняет своё значение от одной отрисовки до следующей.
Чтобы изменить экран, измени данные внутри setState. Этот вызов сообщает Flutter: «это изменилось, построй экран снова», и Text показывает новое число:
setState(() {
_count = _count + 1;
});Подчёркивание в начале _HomePageState и _count делает имя приватным: использовать его может только этот файл. У классов состояния и их переменных обычно есть такое подчёркивание.
Задание
СреднеУвеличивай число на экране на единицу при каждом нажатии Add one: помести изменение _count внутрь setState.
Попробуйте сами
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Counter')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$_count', style: TextStyle(fontSize: 48)),
SizedBox(height: 16),
ElevatedButton(
onPressed: () {
_count = _count + 1;
print(_count);
},
child: Text('Add one'),
),
],
),
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Добавляем интерактивность
1Кнопки
Ваша первая кнопкаВывод в консольТекстовые и контурные кнопкиКнопки с иконкамиПлавающая кнопка действия7Переключатели и ползунки
Включаем и выключаем переключателемОтмечаем флажокВыбираем значение ползунком3Виджеты с состоянием
Свой класс виджетаПоказать SnackBarsetState перерисовывает экранСоздание StatefulWidgetСчётчик вверх и внизHot Reload сохраняет состояниеПотренируйтесь самостоятельно: Онлайн-компилятор Flutter