Как обновить переменную, поддерживающую длину списка в каскадной структуре?

#list #dart

#Список #dart

Вопрос:

 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;
  }
  .....
}
  

Длина возвращаемого списка составляет около 2500, и это значение принимается numAssets , однако, поскольку вы видите, что список изменен позже, и поэтому его длина меньше, тогда оценка ( counter >= numAssets ) неверна. Итак, возможно ли исправить этот код, сохранив его текущую структуру?

.take(3) является временным, оно должно быть удалено позже.

Комментарии:

1.«однако, как вы видите, этот список изменяется позже, и поэтому его длина меньше». Я не вижу никаких измененных списков. Вы вызываете несколько методов для Iterable , которые возвращают новое Iterable значение. Если вы хотите numAssets отразить длину Iterable результата из .where(...) , вы должны сначала присвоить этот результат переменной.

2. Спасибо за ваш скрупулезный ответ. Я думал аналогичным образом, поэтому я расширил тело функции, но при запуске программы она остается неподвижной, не отображая никаких ответов, поэтому я попробовал другой способ.

3. Ваш подход действительно работает, это было бы так: « .map((e) => e[«asset_id»].toString()) ..every((_) => NumAssets > 0) ..forEach((битКойн) { «

4. Предыдущий код был другим подходом, это с where: .where((map) { bool flag = map["type_is_crypto"] == 1; if (flag) numAssets; return flag; })

5. Однако, если я удалю .take(3) , программа станет беспорядочной. Итак, я попробовал другой подход, но это другой вопрос.