Flutter延迟一段时间后如何运行代码?


123

我想在构建Widget后经过一定的延迟后执行一个函数。在Flutter中这样做的惯用方式是什么?

我要实现的目标:我想从默认的FlutterLogoWidget开始,然后style在一段时间后更改其属性。

Answers:


234

Future.delayed一段时间后,您可以用来运行代码。例如:

Future.delayed(const Duration(milliseconds: 500), () {

// Here you can write your code

  setState(() {
    // Here you can write your code for open new view
  });

});

在setState函数中,您可以编写与应用程序UI相关的代码,例如刷新屏幕数据,更改标签文本等。


为避免发出警告,请在调用setState之前检查您的小部件是否仍已挂载
Tom

68

想通了😎

class AnimatedFlutterLogo extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _AnimatedFlutterLogoState();
}

class _AnimatedFlutterLogoState extends State<AnimatedFlutterLogo> {
  Timer _timer;
  FlutterLogoStyle _logoStyle = FlutterLogoStyle.markOnly;

  _AnimatedFlutterLogoState() {
    _timer = new Timer(const Duration(milliseconds: 400), () {
      setState(() {
        _logoStyle = FlutterLogoStyle.horizontal;
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
    _timer.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return new FlutterLogo(
      size: 200.0,
      textColor: Palette.white,
      style: _logoStyle,
    );
  }
}

1
Timer从哪里进口的?
路西姆'18

4
知道了import 'dart:async'
露西姆

一个修改是把timer = ...initState覆盖。这样,您就可以访问构造函数中widget设置的内容State<>
stevenspiel

我不认为这是应该接受的答案,因为它不仅会延迟运行代码,还会重复执行代码。@Rahul Sharma解决方案仅用于延迟要好得多。
Andris

Rahul的答案不会取消计时器,因此,如果您的小部件消失了,肯定会泄漏吗?(注意:我不是开发人员,我几年前才使用过它!)
Bradley Campbell

59

倒数后触发动作

Timer(Duration(seconds: 3), () {
  print("Yeah, this line is printed after 3 seconds");
});

重复动作

Timer.periodic(Duration(seconds: 5), (timer) {
  print(DateTime.now());
});

立即触发计时器

Timer(Duration(seconds: 0), () {
  print("Yeah, this line is printed immediately");
});

10

只是在上述答案上添加更多描述

计时器功能还可以与以下持续时间一起使用:

const Duration(
      {int days = 0,
      int hours = 0,
      int minutes = 0,
      int seconds = 0,
      int milliseconds = 0,
      int microseconds = 0})

例:

  Timer(Duration(seconds: 3), () {
    print("print after every 3 seconds");
  });

7

(在旧q上添加响应,因为这是google上的最高结果)

我试图在一个集团内部的回调中产生一个新状态,但是它没有用。尝试使用Timer和Future.delayed。

但是,工作是...

await Future.delayed(const Duration(milliseconds: 500));

yield newState;

等待一个空虚的未来,然后再运行该功能。



4

您可以通过两种方式做到1Future.delayed和2Timer

使用计时器

Timer 是代表递减计时器的类,该计时器被配置为在达到时间结束时触发动作,并且可以触发一次或重复触发。

确保导入 dart:async 程序包以使用程序启动 Timer

Timer(Duration(seconds: 5), () {
  print(" This line is execute after 5 seconds");
});

使用Future.delayed

Future.delayed 是创建一个在延迟后运行其计算的未来。

确保 import "dart:async"; 打包以启动要使用的程序 Future.delayed

Future.delayed(Duration(seconds: 5), () {
   print(" This line is execute after 5 seconds");
});

4

只是在这里留下所有人都在寻找的摘录:

Future.delayed(Duration(milliseconds: 100), () {
  // Do something
});

2
import 'dart:async';   
Timer timer;

void autoPress(){
  timer = new Timer(const Duration(seconds:2),(){
    print("This line will print after two seconds");
 });
}

autoPress();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.