Flutter 当颤振中的时间发生变化时更新

Flutter 当颤振中的时间发生变化时更新,flutter,Flutter,我试图根据设备的当前时间在屏幕上显示消息 DateTime dateTimeNow = new DateTime.now(); String text; int hour = dateTimeNow.hour; if(hour >= 20 || hour <= 5) text = "Good night"; else if(hour >= 12) text = "Good afternoon"; else text = "Goo

我试图根据设备的当前时间在屏幕上显示消息

DateTime dateTimeNow = new DateTime.now();
String text;
int hour = dateTimeNow.hour;
if(hour >= 20 || hour <= 5) text = "Good night";
else if(hour >= 12) text = "Good afternoon";
else text = "Good morning";
DateTime dateTimeNow=new DateTime.now();
字符串文本;
int hour=dateTimeNow.hour;
如果(小时>=20 | |小时=12)text=“下午好”;
else text=“早上好”;
在消息需要更改之前,例如从7:59 PM(下午好)到8:00 PM(晚上好),这一切都可以正常工作

搜索时,我发现一些类似的主题使用了
Stream.periodic
,但它只允许每隔一段时间更新一次,例如每秒更新一次


有没有一种方法可以只检测时间上的变化而不在每次定义的时间刷新它?

您可能要做的是计算从现在到所需的变化之间的剩余时间,然后使用
Future.delayed

下面是一个简单的例子(我只实现了小时,但如果您愿意,您可以轻松地添加分钟!)


进口“包装:颤振/材料.省道”;
void main(){
runApp(MaterialApp(主页:SimplePage());
}
类SimplePage扩展StatefulWidget{
@凌驾
_SimplePageState createState()=>_SimplePageState();
}
类_SimplePageState扩展状态{
上午最后一分钟=8;
最终整夜小时=23;
字符串消息;
@凌驾
void initState(){
消息=_initMessage();
_notifyWhenMessageChange();
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:文本(消息),
),
);
}
void _notifyWhenMessageChange(){
DateTime now=DateTime.now();
如果(消息==“上午”){
未来。延迟(持续时间(小时:(晚上小时-现在。小时)%24),
()=>setState(()=>message=“晚间”);
}否则{
Future.delayed(持续时间(小时:(上午小时-现在小时)%24),
()=>setState(()=>message=“晚间”);
}
}
字符串_initMessage(){
DateTime now=DateTime.now();
如果(now.hour>morningHour&&now.hour

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(home: SimplePage()));
}

class SimplePage extends StatefulWidget {
  @override
  _SimplePageState createState() => _SimplePageState();
}

class _SimplePageState extends State<SimplePage> {
  final int morningHour = 8;
  final int eveningHour = 23;
  String message;

  @override
  void initState() {
    message = _initMessage();
    _notifyWhenMessageChange();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(message),
      ),
    );
  }

  void _notifyWhenMessageChange() {
    DateTime now = DateTime.now();
    if (message == "morning") {
      Future.delayed(Duration(hours: (eveningHour - now.hour) % 24),
          () => setState(() => message = "evening"));
    } else {
      Future.delayed(Duration(hours: (morningHour - now.hour) % 24),
              () => setState(() => message = "evening"));
    }
  }

  String _initMessage() {
    DateTime now = DateTime.now();
    if (now.hour > morningHour && now.hour < eveningHour) {
      return "morning";
    } else {
      return "evening";
    }
  }
}