首页 > 解决方案 > 睡眠(持续时间)与 Future.delayed(持续时间)

问题描述

他们两个有什么区别(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'),
                    ),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

sleep:没有做我期望它做的事情:

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

标签: flutterdartstate

解决方案


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

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


推荐阅读