![Flutter开发实例解析](https://wfqqreader-1252317822.image.myqcloud.com/cover/665/41398665/b_41398665.jpg)
2.5 开发番茄钟
本节将开发一个简单的番茄钟计时器,以巩固本章介绍的理论基础。
lib/main.dart是App的入口页面,因此需要对默认代码进行重写。首先创建番茄钟的首页MyHomePage,它是带有状态的StatefulWidget,状态类为_MyHomePageState。在build方法中进行布局搭建,使用Scaffold组件搭建页面的骨架。在Scaffold中,body表示页面的内容区,这里通过Text组件展示了一段文本,并通过floatingActionButton属性添加了一个悬浮按钮。将main.dart的代码替换如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/56_02.jpg?sign=1739522655-dzSj33V4U3yXEYwBAMhrfYD7XjcehRMa-0-76ac2c6c08a6d6ea65f66fc55964acd2)
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/57_01.jpg?sign=1739522655-TTafmOfiHGYsWjL8yJS7uPN7Uu926ox2-0-16f8eb2b3cd61e4fcd42a3e25b1f0cd9)
运行代码效果如图2-5所示。
其中,界面中包含一个展示文本和一个悬浮按钮。目前应用还不具备实际功能,将在下面小节中逐步进行实现。
2.5.1 使用Center组件进行居中显示
在上面的代码中,向Scaffold组件的body传入了一个Center组件,其作用是在视图容器中居中显示。
如果不使用Center组件,而是直接向Scaffold传入Text组件,运行程序会发现文本定位到了起始位置,即屏幕的左上角,如图2-6所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/57_02.jpg?sign=1739522655-uUkU0y3L2vzVZQbVse5ZmbhPhd4JNBgO-0-e4dbb8a3164e05cf84f0b3f437794c05)
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_01.jpg?sign=1739522655-ns1yEFyG0Oah5GClLUhJ2mC7UqPv2NqV-0-686ab0bc0ab6d59c29749d83e4b9953a)
图2-5 番茄钟初始界面效果
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_02.jpg?sign=1739522655-ggbp8b9sTkKUBX3fM440XuAWoF1A5xk1-0-57409cb51a4b7476a8ed48c1bafa4176)
图2-6 未使用Center组件时文本展示效果
2.5.2 Text文本展示组件
番茄钟的主要功能是25 min倒计时,首先需要在屏幕上创建一个文本展示组件,来展示倒计时。在Flutter中,展示文本使用Text组件。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_03.jpg?sign=1739522655-oJOF9CAbGN0TPLOnAzzazdPzdv6LgOW5-0-96e318fe32f0cd1c6e0d7104d5ac2012)
图2-7 文本组件展示效果
下面代码创建了一个文本,其运行效果如图2-7所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_04.jpg?sign=1739522655-S2aq9X9VkIOIKn86L7tO3yyRWxRzE61b-0-7efac5b43426fc4153d5ee8c72e1d5de)
需要注意的是,Text组件需要被嵌套在Scaffold组件内部使用,如果跳过Scaffold直接使用Text,由于默认样式没有设置,会出现展示异常的效果,如图2-8所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_05.jpg?sign=1739522655-DdXIT4Kbd5Tj3zhns82Ect3zKiJk4ReK-0-b8daf68381cd4d48a79dfc8e2b1de7de)
图2-8 Text在Scaffold外的异常展示效果
通过Text的style属性可以方便地设置文本样式。下面介绍一些基础的样式设置方法。
1 设置文本颜色
通过TextStyle样式的color属性可以修改文本颜色,示例代码如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_06.jpg?sign=1739522655-BZzeJo0QzBT1oUZZKp6bQHacr2SQZMxu-0-17f5e891ceca238a431d6f8c6c0b7c61)
运行效果如图2-9所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/58_07.jpg?sign=1739522655-v1Ec0NH58C2aTZVtJ9klBqtb7yAU1v9T-0-201198755d000731018910ff2560eece)
图2-9 设置文本颜色效果
2 设置字体大小
通过TextStyle样式的fontSize属性可以修改文本大小,示例代码如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_01.jpg?sign=1739522655-Rur8JnXAqgbRoHaXRSYifhBmKEZ11IfP-0-c7e1acffe45da08374b4e1f771a2f933)
运行效果如图2-10所示。
3 文字加粗
通过TextStyle样式的fontWeight属性可以修改文本颜色,示例代码如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_02.jpg?sign=1739522655-O9rSayTCSZwDcNIbNo2IARDOfjt4rFAb-0-c3315826d2c3175e2482ee681423d09e)
运行效果如图2-11所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_03.jpg?sign=1739522655-U2bLtksP8qh0O08efkhN9QOt1AoKR4FQ-0-9b76535a4c73bace0d85ab4b1d761ae4)
图2-10 设置字体大小效果
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_04.jpg?sign=1739522655-04PkM7ije6vlWJUkVXgdtqVWqDdkeAEr-0-2db63e688a2aee29b7429b4f357e4b18)
图2-11 字体加粗效果
4 倒计时文本组件
了解了Text组件的基础使用后,下面回到番茄钟工程,创建倒计时文本展示组件。将main.dart位于屏幕中心的Text替换为以下代码:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_05.jpg?sign=1739522655-mgZSkAzQlzYQvDcwcq7KoYGGXEiVOKOu-0-e71ff79f081ceb4ae336f07cca5745ce)
其中设定了一个固定文本,在下一节对定时器的讲解中,会通过状态对其进行替换。再次运行main.dart效果如图2-12所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/59_06.jpg?sign=1739522655-Pt51RzIeyaDRW4UNXKUxHNDpOdwIMoOR-0-050e0ab8d67cace35c4d86ee439eed84)
图2-12 倒计时文本组件展示效果
2.5.3 添加Timer定时器
在应用开发中经常会使用到定时器,它能够每隔一段时间触发执行相应代码。一种典型的应用场景是网络轮询请求,每隔固定时间发起请求,适用于一些需要定时与后端数据保持同步的应用场景。
Dart标准库的async包中提供了定时器能力,具体实现类为Timer。
Timer的使用主要分为几个步骤,首先在组件的初始化生命周期中创建一个Timer实例,在创建时需指定定时间隔(Duration),以及定时触发时所需执行的代码。
Timer有两种工作模式:单次触发与循环触发。
对于单次触发,定时器触发一次后自动停止。创建方法如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/60_01.jpg?sign=1739522655-jBhWy4a539y2K29ew1E0FlpuZom3FxXX-0-fcca6497b8fb577382dac8a3cf1171bd)
其中,通过debugPrint方法可以输出日志。
对于循环触发,定时器会循环定时触发下去,直到调用它的cancel()方法手动停止。创建方法如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/60_02.jpg?sign=1739522655-VgcWQeTBj3sfIg8wg9S4od4ODOL7Tge9-0-c11829a4b3544bc6d2fbda42265be0aa)
结合番茄钟实例,基于周期为1s的定时器,创建一个状态用于统计倒计时的秒数。具体代码如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/60_03.jpg?sign=1739522655-x7pfnAscrncxImGBdbXgQdMoAsMc6F1A-0-70457a91720eb54c96a05c39393e3a68)
运行程序可以看到Logcat日志:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/60_04.jpg?sign=1739522655-YgCPZGxvrbsEra6ZsKgyCgLtfgzOIBwn-0-0fcc46fd421374baf6f042c2d83e602c)
2.5.4 为按钮添加单击事件控制番茄钟开始
现在文本展示、按钮及定时器都已就绪,接下来需要将它们串起来。FloatingActionButton的onPress属性用于设置按钮单击后的行为,这也是整个程序的触发点。当单击按钮后,创建定时器开始计时,每次定时器触发时都更新countDownSeconds状态,每次状态变化倒计时文本组件也会进行相应更新。如果定时器倒计时为0,还需要再关闭定时器,同时弹出一个对话框向用户发出提示。具体实现代码如下:
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/61_01.jpg?sign=1739522655-Mar37bPA3PmUj7EjpafpZduoJ91EoM4m-0-628ac52c2c0261062d2cb406e61f7e75)
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/62_01.jpg?sign=1739522655-9XvrzLPXGhKUSLJN1kHyFRf01UyhQ900-0-9dd0c6052f36eca26f8d8119676d3968)
其中,将startCountDown设置为悬浮按钮的回调函数,在其中启动定时器。通过showDialog方法弹出对话框。parseText方法用于将countDown状态从整数转换为文本形式进行展示。pad-Digits方法的作用是将只有一位的整数通过补0将其扩充至两位,使其更加美观。
运行程序,倒计时中效果如图2-13所示,倒计时完成后弹窗提示如图2-14所示。
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/62_02.jpg?sign=1739522655-Og3wEoymLOwoHdYR3w1EFjG7WOlsp8KR-0-f6d89629ad3ad2c6defa86d1cfb3f912)
图2-13 番茄钟运行时效果
![](https://epubservercos.yuewen.com/411DE0/21570843401308606/epubprivate/OEBPS/Images/62_03.jpg?sign=1739522655-8L1qBNfQawriDawSA65qNsc8D55EWXBX-0-f9cd3730eeae70af1f1e88b6450c062e)
图2-14 倒计时结束弹窗提示