【问题标题】:Future.wait possible in future builder when futures return different value types?当期货返回不同的值类型时,未来构建器中的 Future.wait 可能吗?
【发布时间】:2021-01-01 00:13:37
【问题描述】:

我找到了如何在构建小部件时等待 2 个不同的未来的答案,但它们属于同一类型。 Example from here:

但是如果firstFuture()secondFuture() 返回不同的值类型——例如int 和String(或我的用例中的不同类),是否也有可能? AsyncSnapshot<List<bool>> snapshot 中的 bool 对我来说是个挑战……

FutureBuilder(
    future: Future.wait([
         firstFuture(), // Future<bool> firstFuture() async {...}
         secondFuture(),// Future<bool> secondFuture() async {...}
         //... More futures
    ]),
    builder: (
       context, 
       // List of booleans(results of all futures above)
       AsyncSnapshot<List<bool>> snapshot, 
    ){

       // Check hasData once for all futures.
       if (!snapshot.hasData) { 
          return CircularProgressIndicator();
       }

       // Access first Future's data:
       // snapshot.data[0]

       // Access second Future's data:
       // snapshot.data[1]

       return Container();

    }
);

我还发现了另一个 answer 具有不同的类型,但这适用于函数而不是类

List<Foo> foos;
List<Bar> bars;
List<FooBars> foobars;

await Future.wait<void>([
  downloader.getFoos().then((result) => foos = result),
  downloader.getBars().then((result) => bars = result),
  downloader.getFooBars().then((result) => foobars = result),
]);

processData(foos, bars, foobars);

【问题讨论】:

    标签: flutter future


    【解决方案1】:

    嗯,你总是可以使用Object 作为这两种方法的最低公共返回值:

    Future.wait<Object>([firstFuture(), secondFuture()])
    

    但是您必须将生成的 List&lt;Object&gt; 的条目转换回您认为应该的状态。不完美,但它会工作。

    就个人而言,我更喜欢您已经发现的方法,只返回最小的未来,Future&lt;void&gt;,并让它写入方法内的相应变量。这也不完美,但它保持了类型安全。

    【讨论】:

      【解决方案2】:

      下面的答案可能对你有帮助

      在包内使用FutureGroup

      dependencies: async: ^2.4.1
      

      代码:

      void main()  {
        Future<String> future1 = getData(2);
        Future<String> future2 = getData(4);
        Future<String> future3 = getData(6);
        FutureGroup futureGroup = FutureGroup();
        futureGroup.add(future1);
        futureGroup.add(future2);
        futureGroup.add(future3);
        futureGroup.close();
        futureGroup.future.then((value) => {print(value)});
      }
      
      Future<String> getData(int duration) async {
        await Future.delayed(Duration(seconds: duration)); //Mock delay
        return "This a test data";
      }
      

      输出:

      I/flutter ( 5866): [This a test data, This a test data, This a test data] // Called after 6 seconds.
      

      更多参考:

      https://medium.com/flutterworld/flutter-futuregroup-d79b0414eaa7

      【讨论】:

        猜你喜欢
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多