#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)
, программа станет беспорядочной. Итак, я попробовал другой подход, но это другой вопрос.