Menu
CoddyTech

Создание StatefulWidget

Часть раздела Добавляем интерактивность путешествия по Flutter на Coddy. Урок 12 из 34.

На этот раз ты сам пишешь StatefulWidget. На экране отображается I feel Sleepy, а нажатие кнопки Выпить кофе должно изменить текст на I feel Awake. В виде StatelessWidget он не сможет этого сделать.

Чтобы превратить StatelessWidget в StatefulWidget, выполни три шага:

  1. Замени extends StatelessWidget на extends StatefulWidget и замени его build на createState.
  2. Напиши под ним класс State и перенеси туда build без изменений.
  3. Перенеси изменяемую переменную из build в начало класса State.
class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String _mood = 'Sleepy';

  @override
  Widget build(BuildContext context) {
    ...
  }
}

Шаг 3 важен. Переменная в начале build создаётся заново при каждом запуске build, поэтому после setState её значением снова станет 'Sleepy'. В начале класса State она создаётся один раз и сохраняет заданное ей значение.

challenge icon

Задание

Средне

Преврати HomePage в StatefulWidget с классом _HomePageState. Храни настроение в String _mood = 'Sleepy'; в начале состояния и сделай так, чтобы Drink coffee меняла его на 'Awake' с помощью 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 StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    String mood = 'Sleepy';
    return Scaffold(
      appBar: AppBar(title: Text('Mood')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('I feel $mood', style: TextStyle(fontSize: 32)),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {},
              child: Text('Drink coffee'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Добавляем интерактивность

Потренируйтесь самостоятельно: Онлайн-компилятор Flutter