Flutter 如何使用计时器更新小部件

Flutter 如何使用计时器更新小部件,flutter,dart,Flutter,Dart,在我的应用程序中,菜单中有带有“截止”时间的项目。一旦达到截止时间,该项目将变为红色并被禁用,并显示“截止时间已错过” 这可以很好地工作,但对于在截止时间过后观看菜单的用户,显示不会动态更新。这对我目前的应用来说不是什么大问题,如果有人想坐下来看菜单,并注意到它只会在你关闭并重新打开菜单时更新,我不在乎 但作为一个学习练习,如果我能让菜单项在时间流逝后重新构建,那就太好了 然而,我不想把大菜单树变成一个有状态的小部件。用一个有状态的小部件来实现这一点非常简单,下面的最小示例(基于flatterd

在我的应用程序中,菜单中有带有“截止”时间的项目。一旦达到截止时间,该项目将变为红色并被禁用,并显示“截止时间已错过”

这可以很好地工作,但对于在截止时间过后观看菜单的用户,显示不会动态更新。这对我目前的应用来说不是什么大问题,如果有人想坐下来看菜单,并注意到它只会在你关闭并重新打开菜单时更新,我不在乎

但作为一个学习练习,如果我能让菜单项在时间流逝后重新构建,那就太好了

然而,我不想把大菜单树变成一个有状态的小部件。用一个有状态的小部件来实现这一点非常简单,下面的最小示例(基于flatterdefault应用程序)显示了所需的效果。有两个字段使用计时器定期更新(每秒钟更新一次),计时器每秒只调用setState

导入'dart:async';
进口“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
日期时间(标记时间);;
//当前时间加上几秒钟。。。。
void _markTheTime(){
设置状态(){
_markedTime=DateTime.now().add(持续时间(秒:15));
});
}
//在本测试中,我们不使用intl包。
字符串HHMMSFROMDATETIME(DateTime tm){
如果(tm==null){
返回null;
}
返回${zeroppadded(tm.hour)}:${zeroppadded(tm.minute)}:${zeroppadded(
tm.second)}';
}
字符串零填充(int number)=>number.toString().padLeft(2,'0');
字符串get markedTime=>HHMMSFROMDATETIME(\u markedTime);
字符串get currentTime=>hhmssFromDateTime(DateTime.now());
计时器重建计时器;
@凌驾
void initState(){
重建计时器=计时器。周期性(持续时间(秒:1),(计时器){
设置状态(){
});
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
_markedTime==null
?文本('用工厂标记时间…')
:文本(
'标记时间:$markedTime',
风格:主题
.of(上下文)
.文本主题
.bodyText1
.抄袭(
颜色:DateTime.now().isAfter(\u markedTime)
?颜色:红色
:颜色。蓝色),
),
正文(
'当前时间:$currentTime',
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\标记时间,
工具提示:“设置”,
子:图标(图标。锁定时钟),
),//此尾随逗号使生成方法的自动格式设置更方便。
);
}
}
我相信解决方案在于围绕该列的StatefulBuilder,而不是statefulwidget。但我不明白有州的建筑商,即使他们看起来真的很方便

另外,我想知道是否有可能在FloatingActionButton周围再绕一个按钮,说一旦点击按钮,就禁用该按钮,直到标记的时间过期

我认为我最终想要实现的是使小部件树的各个部分相互独立地重建。因此,例如,使用单独的计时器,晶圆厂应在计时器到期时重建,而另一个定期计时器应每秒更新“时间显示”