dart future.wait在第一次之后没有执行它的项

vm0i2vca  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(112)

有两页:第1页和第2页。
page1将List<Future>传递给page2,page2执行这些期货。
下面是所有的源代码:

class _Page1 extends StatelessWidget {
  const _Page1({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('page 1'),
      ),
      body: ElevatedButton(
        child: Text('push page 2'),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => _Page2(
                requests: [_load1(), _load2()],
              ),
            ),
          );
        },
      ),
    );
  }

  Future<void> _load1() {
    return Future.delayed(Duration(seconds: 1), () {
      log('load1 finish');
    });
  }

  Future<void> _load2() {
    return Future.delayed(Duration(seconds: 2), () {
      log('load2 finish');
    });
  }
}

class _Page2 extends StatelessWidget {
  const _Page2({Key? key, required this.requests}) : super(key: key);

  final List<Future> requests;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('page 2'),
      ),
      body: ElevatedButton(
        child: Text('future wait'),
        onPressed: () {
          Future.wait(requests).then((value) {
            log('all finish');
          });
        },
      ),
    );
  }
}

第一次点击page2按钮,记录:load1 finishload2 finishall finish
但是第一次之后,它只有log all finish
为什么?每次点击page2按钮时,如何将其更改为日志load1 finishload2 finishall finish

njthzxwz

njthzxwz1#

_Page2中的列表requests是一个future的列表,而不是一个函数,这意味着它只返回一次性的结果。所以当你说Future.wait(requests)时,你是在告诉它只监听已经完成的返回结果,而不是要求它执行函数。
如果你想在点击'future wait'按钮后执行函数,你必须将列表转换为函数。

final List<Function> requests;

所以现在你从page1传递对象如下:

onPressed: () {
      _load1();
      _load2();
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => _Page2(
            requests: [_load1, _load2],
          ),
        ),
      );
    },

所以现在你在执行request列表中的函数后调用future wait来执行它的函数,如下所示:

Future.wait(requests.map((e) => e())).then((value) {
            log('all finish');
            debugPrint('all finish');
          });
u4dcyp6a

u4dcyp6a2#

为什么?
因为它们完成了。它们已经完成了。如果你想再次运行它们,你必须创建新的Future

相关问题