【问题标题】:How to run code after some delay in Flutter?在 Flutter 中延迟一段时间后如何运行代码?
【发布时间】:2018-09-03 09:27:09
【问题描述】:

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

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

【问题讨论】:

    标签: flutter dart delay


    【解决方案1】:

    您可以在一段时间后使用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 之前检查您的小部件是否仍然挂载
    【解决方案2】:

    倒计时后触发动作

    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");
    });
    

    【讨论】:

    【解决方案3】:

    想通了?

    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,
        );
      }
    }
    

    【讨论】:

    • 你从哪里导入Timer
    • 知道了import 'dart:async'
    • 一项修改是将timer = ... 放在initState 覆盖中。这样,您就可以访问在State&lt;&gt; 构造函数中设置的widget
    • 我认为这不应该被接受,因为它不仅会在延迟后运行代码,还会重复代码。 @Rahul Sharma 延迟解决方案要好得多。
    • @BradleyCampbell Rahul 的回答没有计时器。这是一个延迟后运行一次的函数。
    【解决方案4】:

    把大家都在找的sn-p留在这里:

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

    【讨论】:

    【解决方案5】:

    您可以通过两种方式进行操作,1 是 Future.delayed,2 是 Timer

    使用计时器

    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");
    });
    

    【讨论】:

    【解决方案6】:

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

    我尝试在一个块内的回调中产生一个新状态,但它不起作用。尝试使用 Timer 和 Future.delayed。

    但是,起作用的是……

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

    等待一个空的未来,然后运行该函数。

    【讨论】:

      【解决方案7】:

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

      计时器功能也适用于以下持续时间:

      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");
        });
      

      【讨论】:

      【解决方案8】:

      Future.delayed(Duration(seconds: 3) , your_function)

      【讨论】:

      • 可以添加持续时间:新蜜蜂的持续时间(秒:3)
      【解决方案9】:
      import 'dart:async';   
      Timer timer;
      
      void autoPress(){
        timer = new Timer(const Duration(seconds:2),(){
          print("This line will print after two seconds");
       });
      }
      
      autoPress();
      

      【讨论】:

        【解决方案10】:

        await Future.delayed(Duration(毫秒: 1000));

        【讨论】:

          猜你喜欢
          • 2020-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-14
          • 1970-01-01
          • 2023-03-25
          • 2020-08-17
          相关资源
          最近更新 更多