flutter版本:3.7.9,Android Studio版本:2022.1.1
注意点(书上没提但可能会报错):
①在代码文件开头另外引入'dart:async'库用于之后调用时间库使用
②IDE可能会通过画绿色波浪线的形式提示使用'const'前缀,在代码编写过程中可先不理会(之后补充的代码可能会与该前缀产生冲突,因此会报错),待之后代码完全后再按照提示进行修改
③IDE可能会建议变量的第一个字母要小写,如示例代码中变量'DEFAULT_COUNT_DOWN',此处可根据个人喜好,保留第一个字母大写也可
④在IDE中'Timer'变量的定义如果按照书中代码及IDE提示放在代码注释'late Timer timer;'位置,在软件运行中仍会报错,可在'startCountDown()'函数内部进行变量的定义,并在变量类型'Timer'加上一个问号'?'(使其可为空值null)
以下为示例代码:
import 'dart:async'; //注意点一
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp( //注意点二(包括代码文件中其他可能会提示const的地方)
title: '番茄钟',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const DEFAULT_COUNT_DOWN = Duration.secondsPerMinute * 25; //注意点三
int countDown = 0;
//late Timer timer; //注意点四(修改前)
void startCountDown() {
Timer? timer; //注意点四(修改后)
if (timer != null) timer.cancel();
countDown = DEFAULT_COUNT_DOWN;
timer = Timer.periodic(const Duration(seconds: 1), (timer) {
setState(() {
countDown--;
});
debugPrint(countDown.toString());
if (countDown == 0) {
timer.cancel();
showDialog(
context: context,
builder: (context) {
return const AlertDialog(
content: Text("成功获得一个番茄,请注意休息!"),
);
});
}
});
}
String padDigits(int value) {
return value.toString().padLeft(2, '0');
}
String parseText() {
return '${padDigits(countDown ~/ 60)}:${padDigits(countDown % 60)}';
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text(
parseText(),
style: const TextStyle(
fontSize: 48, fontWeight: FontWeight.bold, color: Colors.blue),
),
),
floatingActionButton: FloatingActionButton(
onPressed: startCountDown, //只要写前面声明的函数名称即可,后面不加括号
child: const Icon(Icons.play_arrow),
),
);
}
}
书中本部分对应源代码查看链接:flutter-book-examples/main.dart at main · maxiee/flutter-book-examples · GitHub