编写 StatefulWidget
本课属于 Coddy Flutter 学习旅程的“让应用具有交互性”单元。第 12 课,共 34 课。
这次你要自己编写 StatefulWidget。屏幕上显示 I feel Sleepy,按下 Drink coffee 后,应该变成 I feel Awake。作为 StatelessWidget,它永远无法做到这一点。
将 StatelessWidget 转换为 StatefulWidget 分为三个步骤:
- 将
extends StatelessWidget改为extends StatefulWidget,并将它的build替换为createState。 - 在它下面编写
State类,并将build移到这个类中,保持不变。 - 将会变化的变量从
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 类顶部的变量只会创建一次,并会保留你赋给它的值。
挑战
中等将 HomePage 改为带有 _HomePageState 类的 StatefulWidget。在 State 顶部用 String _mood = 'Sleepy'; 保存心情,并让 Drink coffee 使用 setState 将它改为 'Awake'。
亲手试试
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'),
),
],
),
),
);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
让应用具有交互性中的所有课
自己练习: Flutter 在线编译器