如何在级联式结构中更新保持列表长度的变量? 类数据{ var_controller=StreamController(); ..... 流getAllCurrentRates(){ int numAssets=0; int计数器=0; 这是listAllAssets() .然后((列表){ 如果(列表!=null){ numAssets=list.length; 列表。从(列表) 。其中((map)=>map[“type_is_crypto”]==1) .采取(3) .map((e)=>e[“资产id”].toString()) .forEach((比特币){ 此.getCurrentRate(比特币) .then((速率)=>_controller.sink.add(Map.from(速率))) .完成时(){ 如果(++计数器>=numAssets)_controller.close(); }); }); } }); 返回_controller.stream; } ..... }

如何在级联式结构中更新保持列表长度的变量? 类数据{ var_controller=StreamController(); ..... 流getAllCurrentRates(){ int numAssets=0; int计数器=0; 这是listAllAssets() .然后((列表){ 如果(列表!=null){ numAssets=list.length; 列表。从(列表) 。其中((map)=>map[“type_is_crypto”]==1) .采取(3) .map((e)=>e[“资产id”].toString()) .forEach((比特币){ 此.getCurrentRate(比特币) .then((速率)=>_controller.sink.add(Map.from(速率))) .完成时(){ 如果(++计数器>=numAssets)_controller.close(); }); }); } }); 返回_controller.stream; } ..... },list,dart,List,Dart,返回列表的长度约为2500,此值由numAssets假定,但是,当您看到列表稍后被修改,因此其长度较短时,则计算(++counter>=numAssets)不正确。那么,是否有可能修复保持其当前结构的代码 .take(3)是暂时的,应该稍后删除。“但是,正如您所看到的,列表稍后会被修改,因此其长度较小”。我没有看到任何被修改的列表。确实可以在Iterable上调用许多方法,这些方法返回一个新的Iterable。如果您希望numAssets反映由生成的Iterable的长度。其中(…),您应该首先

返回列表的长度约为2500,此值由
numAssets
假定,但是,当您看到列表稍后被修改,因此其长度较短时,则计算(
++counter>=numAssets
)不正确。那么,是否有可能修复保持其当前结构的代码


.take(3)
是暂时的,应该稍后删除。

“但是,正如您所看到的,列表稍后会被修改,因此其长度较小”。我没有看到任何被修改的列表。确实可以在
Iterable
上调用许多方法,这些方法返回一个新的
Iterable
。如果您希望
numAssets
反映由
生成的
Iterable
的长度。其中(…)
,您应该首先将该结果分配给一个变量。感谢您谨慎的回复。我也以类似的方式思考,所以我扩展了函数体,但当运行程序时,它不会显示任何响应,所以我尝试了另一种方法。您的方法确实有效,它是这样的:```.map((e)=>e[“资产id”].toString())…every((u)=>++numAssets>0)…forEach((比特币){```先前的代码是另一种方法,这是在where:
中。where((map){bool flag=map[“type\u is\u crypto”]==1;if(flag)++numAssets;return flag;})
但是如果我删除
,则取(3)
程序会变得一团糟。所以我尝试了另一种方法,但这是另一个问题。
class CoinData {
  var _controller = StreamController<Map<String,dynamic>>();
  .....
  Stream<Map<String,dynamic>> getAllCurrentRates() {
    int numAssets = 0;
    int counter = 0;

    this.listAllAssets()
        .then((list) {
            if (list != null) {
                numAssets = list.length;
                List<Map<String, dynamic>>.from(list)
                    .where((map) => map["type_is_crypto"] == 1)
                    .take(3)
                    .map((e) => e["asset_id"].toString())
                    .forEach((bitCoin) {
                        this.getCurrentRate(bitCoin)
                            .then((rate) => _controller.sink.add(Map<String,dynamic>.from(rate)))
                            .whenComplete(() {
                                if (++counter >= numAssets) _controller.close();
                            });
                    });
            }
        });

    return _controller.stream;
  }
  .....
}