颤动异步呼叫的最佳做法?

问题描述 投票:1回答:2

每次重建窗口小部件时,我都不希望异步调用触发。所以,我在initState中调用了异步函数。

  1. 在initState中调用async @override void initState() { someAsyncCall().then((result) { setState() { _result = result; } }); } @override Widget build(BuildContext context) { if (_result == null) { reutrn new Container(); } return new SomeWidget(); }
  2. 使用FutureBuilder @override void initState() { _future = someAsyncCall(); } @override Widget build(BuildContext context) { return new FutureBuilder( future: _future, builder: // do something ); }

两种解决方案都有任何副作用或不良做法吗?


我从flutter修改演示应用程序来解释为什么我在initSate中调用async。 1.打开应用程序,打印主要 2.推屏测试,打印测试,主要 3.弹出测试,打印主要

如果我在构建中调用异步函数,它会调用三次。 我想要的是,我需要一次异步函数调用,除非主要的dispose / pop。 根据RémiRousselet的回答,在initState中调用async是一个问题或错误。 那么,如何确保异步函数调用一次?

   @override
   Widget build(BuildContext context) {
    print("build main");
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new RaisedButton(onPressed: () {
              Navigator.push(context, new MaterialPageRoute(builder: (context) {
                return new Test();
              }));
            }),
          ],
        ),
      )
    );
  }

 class Test extends StatelessWidget {

   @override
   Widget build(BuildContext context) {
     print("build Test");
     return new Scaffold(
       body:
       new FlatButton(onPressed: () {
         Navigator.pop(context);
       }, child: new Text("back"))
     );
   }

 }

我需要做些什么吗?

@override
Widget build(BuildContext context) {
  if (!mounted) {
    print("build main");
    // aysnc function call here
  }
}
flutter
2个回答
1
投票

虽然稍微冗长一点,但FutureBuilder绝对是最佳选择。

在initState中调用异步函数,然后在完成时执行setState会出现一些问题。大多数情况下,在执行此操作时,您不必担心错误捕获或处理加载时间。

请记住,Flutter期望initState是同步的。因此,虽然dart不会阻止您对同步函数执行异步调用,但颤振很可能会认为您的小部件已准备就绪。


0
投票

我会选择第一种风格,因为我可以控制等待时发生的事情。这取决于你的应用程序你想要什么,我更喜欢一个明确的“加载”消息,而不是不知道它是卡住还是加载。

说到副作用,你可以看到他们对FutureBuilder的看法

这样做的副作用是向FutureBuilder提供一个新的但已经完成的未来将导致ConnectionState.waiting状态中的单个帧。这是因为无法同步确定Future已经完成。

© www.soinside.com 2019 - 2024. All rights reserved.