如何定期设置状态?

isa*_*ürk 5 setstate dart flutter

我正在尝试为特殊的日子(例如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()),
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我得到的,并且不会重新加载时间。我在扑扑上还很新。

Feu*_*Feu 9

如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),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 太感谢了。现在我更好地理解了初始化状态逻辑。在java和.net之后Flutter感觉很奇怪 (2认同)
  • `dispose` 在不再需要小部件并且即将被销毁时被调用。假设您在 `initState` 中打开一个连接,并且出于某种原因将其保持打开状态,您将实现 `dispose` 方法,因为这是关闭该连接的好时机。这是一个不好的例子,但给了你这个想法。[也检查这个](https://docs.flutter.io/flutter/widgets/State/dispose.html)。 (2认同)

Mig*_*ivo 6

这种递归方法应该足以满足您的需求。设置为 1 将每秒seconds持续触发,从而刷新您的小部件树。setState

void _timer() {
    Future.delayed(Duration(seconds: 1)).then((_) {
      setState(() {
        print("1 second closer to NYE!");
        // Anything else you want
      });
      _timer();
    });
  }
Run Code Online (Sandbox Code Playgroud)


小智 5

有一个名为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()}");
      }
    );
  }

}
Run Code Online (Sandbox Code Playgroud)