在做完一个活动后,我想显示我的 Text
小组件,并在时间为23:59:59时更改该小组件......到目前为止,我做了以下代码。
DateFormat("HH:mm:ss").format(DateTime.now()) =="23:59:59"
? Text("After")
: Text("Before")
但问题是......每当我关闭我的应用程序,然后重新打开应用程序......小组件并没有改变从 Text("Before")
到 Text("After")
虽然时间已经在23:59:59...但只有在我做了一个事件点击后,当应用程序仍然打开时,部件才会发生变化...有什么方法可以在没有任何额外事件的情况下解决这个问题吗?
你有你的 Text
在 build
方法。这个方法只在widget的更新时起作用,例如,如果状态发生变化(这就是为什么当你的状态发生变化时,widget会更新。do an event click
我想你的widget在点击后会重建)。) 但小部件不知道任何关于 DateTime.now()
. 所以你应该把 DateTime.now
到状态,并秒速更新一次。
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Padding(
padding: EdgeInsets.all(16),
child: BeforeAfter(),
),
),
),
);
}
}
class BeforeAfter extends StatefulWidget {
@override
_BeforeAfterState createState() => _BeforeAfterState();
}
class _BeforeAfterState extends State<BeforeAfter> {
String time = DateFormat("HH:mm:ss").format(DateTime.now()); // our time which we will update
@override
void initState() {
super.initState();
updateTime();
}
void updateTime() {
Future.delayed(Duration(seconds: 1), () {
updateTime();
setState(() {
time = DateFormat("HH:mm:ss").format(DateTime.now()); // update time
});
});
}
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
time == "12:13:00" ? Text("After") : Text("Before"),
Text(time)
]); // compare time with some value
}
}
void main() {
runApp(MyApp());
}
Gif如何工作