【问题标题】:sleep(duration) vs Future.delayed(duration)睡眠(持续时间)与 Future.delayed(持续时间)
【发布时间】:2020-09-24 00:04:18
【问题描述】:

他们两个有什么区别(sleep vs Future.delayed)?在这两种情况下,幕后发生了什么?

我不明白以下示例中的不同结果。

Future.delayed: 做我期望它做的事情:

  1. setState 重建小部件并将矩形着色为黑色
  2. 然后等待 10 秒
    import 'package:flutter/material.dart';
    import 'dart:io';

    void main() {
      runApp(MyApp());
    }

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }

    class _MyAppState extends State<MyApp> {
      Color appColor = Colors.green;

      changeColors() async {
        setState(() {
          appColor = Color(0xff000000);
        });
        await Future.delayed(Duration(seconds: 10));
        print('after 10 seconds');
      }

      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: SafeArea(
              child: Center(
                child: Column(
                  children: [
                    Container(height: 100, width: 100, color: appColor),
                    FlatButton(
                      onPressed: () => changeColors(),
                      child: Text('click me'),
                    ),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

睡眠:没有做我期望它做的事情:

  1. 一旦我将 appColor 更改为黑色,setState 就不会重建小部件树。为什么不呢?
  2. 等待 10 秒
  3. 然后不知从何而来,小部件树正在重建,矩形的颜色变成黑色:为什么?
    import 'package:flutter/material.dart';
    import 'dart:io';

    void main() {
      runApp(MyApp());
    }

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }

    class _MyAppState extends State<MyApp> {
      Color appColor = Colors.green;

      changeColors() {
        setState(() {
          appColor = Color(0xff000000);
        });

        sleep(Duration(seconds:10));
        print('after 10 seconds');
      }

      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: SafeArea(
              child: Center(
                child: Column(
                  children: [
                    Container(height: 100, width: 100, color: appColor),
                    FlatButton(
                      onPressed: () => changeColors(),
                      child: Text('click me'),
                    ),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

【问题讨论】:

  • 嗯...太奇怪了。我刚刚在 diff 计算机上尝试了我的原始示例,突然两个示例的行为方式相同(在查看窗口时)。唯一的区别在于控制台,因为 sleep 会引发一些错误。这怎么可能?有什么线索吗?

标签: flutter dart state


【解决方案1】:

sleep 在 Dart 隔离中暂停执行指定的时间。在此期间什么都不会发生。

Future.delayed安排在未来某个时间点发生的操作。它是异步的,可以同时进行其他操作。

【讨论】:

  • 感谢您的回答,但这并没有完全回答我的问题。在我的 sleep 示例中,为什么 setState 函数没有重建小部件树,然后在 Dart 隔离中暂停执行? setState 应该在 sleep 进来之前执行的,对吧?
  • @TomasBaran setState 确实会立即更新状态,但是通过暂停执行,您不允许小部件树重建并绘制新框架。
  • 嗯...太奇怪了。我刚刚在差异计算机上尝试了我的原始示例,突然两个示例的行为方式相同(在查看窗口时)。唯一的区别在于控制台,因为 sleep 会引发一些错误。
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2012-03-06
  • 2011-04-24
  • 2016-05-11
相关资源
最近更新 更多