如何定期设置状态?
How to periodically set state?
我正在尝试为特殊日子构建一个倒计时应用程序,例如 11 d 2 h 30 m 23s 到新的一年,但我无法每秒重新加载我的状态所以它只显示我加载的第二个页面 我不知道如何动态重新加载页面。
import 'package:flutter/material.dart';
class RopSayac extends StatefulWidget {
_RopSayacState createState() => _RopSayacState();
}
class _RopSayacState extends State<RopSayac> {
var now = DateTime.now().second.toString();
String asd(){
setState(() {
now = DateTime.now().second.toString();
});
return now;
}
@override
Widget build(BuildContext context) {
return Container(
child: new Text(asd()),
);
}
}
这是我得到的,它没有重新加载时间。我对 flutter 还很陌生。
这是我的工作。在我的例子中,我在 _liveUpdate()
中轮询一个网络服务
void startUpdates(AppState appState) async {
await new Future.delayed(const Duration(milliseconds: 100));
while (true) {
_liveUpdate();
appState.setState(() {});
await new Future.delayed(const Duration(seconds : 15));
}
这种递归方法应该足以满足您的需求。 seconds
设置为 1 将保持每秒触发 setState
,从而刷新您的小部件树。
void _timer() {
Future.delayed(Duration(seconds: 1)).then((_) {
setState(() {
print("1 second closer to NYE!");
// Anything else you want
});
_timer();
});
}
正如 pskink 和 Günter 提到的,使用 Timer
。您甚至可以使用适合您的场景的 periodic
构造函数。
请注意,您不需要 asd()
函数。当您调用 setState()
时,将自动调用 build
方法并传递新的 now
属性 值。
如果需要,请使用 initState
设置初始值,并像本例一样设置 Timer
。
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(title: 'Timer Periodic Demo', home: RopSayac());
}
}
class RopSayac extends StatefulWidget {
_RopSayacState createState() => _RopSayacState();
}
class _RopSayacState extends State<RopSayac> {
String _now;
Timer _everySecond;
@override
void initState() {
super.initState();
// sets first value
_now = DateTime.now().second.toString();
// defines a timer
_everySecond = Timer.periodic(Duration(seconds: 1), (Timer t) {
setState(() {
_now = DateTime.now().second.toString();
});
});
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: new Text(_now),
),
);
}
}
有一个很棒的库,叫做 timer_builder。我想它会对你有所帮助。
来自发布页面的示例:
import 'package:timer_builder/timer_builder.dart';
class ClockWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TimerBuilder.periodic(Duration(seconds: 1), //updates every second
builder: (context) {
return Text("${DateTime.now()}");
}
);
}
}
我正在尝试为特殊日子构建一个倒计时应用程序,例如 11 d 2 h 30 m 23s 到新的一年,但我无法每秒重新加载我的状态所以它只显示我加载的第二个页面 我不知道如何动态重新加载页面。
import 'package:flutter/material.dart';
class RopSayac extends StatefulWidget {
_RopSayacState createState() => _RopSayacState();
}
class _RopSayacState extends State<RopSayac> {
var now = DateTime.now().second.toString();
String asd(){
setState(() {
now = DateTime.now().second.toString();
});
return now;
}
@override
Widget build(BuildContext context) {
return Container(
child: new Text(asd()),
);
}
}
这是我得到的,它没有重新加载时间。我对 flutter 还很陌生。
这是我的工作。在我的例子中,我在 _liveUpdate()
中轮询一个网络服务void startUpdates(AppState appState) async {
await new Future.delayed(const Duration(milliseconds: 100));
while (true) {
_liveUpdate();
appState.setState(() {});
await new Future.delayed(const Duration(seconds : 15));
}
这种递归方法应该足以满足您的需求。 seconds
设置为 1 将保持每秒触发 setState
,从而刷新您的小部件树。
void _timer() {
Future.delayed(Duration(seconds: 1)).then((_) {
setState(() {
print("1 second closer to NYE!");
// Anything else you want
});
_timer();
});
}
正如 pskink 和 Günter 提到的,使用 Timer
。您甚至可以使用适合您的场景的 periodic
构造函数。
请注意,您不需要 asd()
函数。当您调用 setState()
时,将自动调用 build
方法并传递新的 now
属性 值。
如果需要,请使用 initState
设置初始值,并像本例一样设置 Timer
。
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(title: 'Timer Periodic Demo', home: RopSayac());
}
}
class RopSayac extends StatefulWidget {
_RopSayacState createState() => _RopSayacState();
}
class _RopSayacState extends State<RopSayac> {
String _now;
Timer _everySecond;
@override
void initState() {
super.initState();
// sets first value
_now = DateTime.now().second.toString();
// defines a timer
_everySecond = Timer.periodic(Duration(seconds: 1), (Timer t) {
setState(() {
_now = DateTime.now().second.toString();
});
});
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: new Text(_now),
),
);
}
}
有一个很棒的库,叫做 timer_builder。我想它会对你有所帮助。
来自发布页面的示例:
import 'package:timer_builder/timer_builder.dart';
class ClockWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TimerBuilder.periodic(Duration(seconds: 1), //updates every second
builder: (context) {
return Text("${DateTime.now()}");
}
);
}
}