我正在嘗試將一種型別的串列的流轉換為另一種型別的串列的流,并且對此有疑問。
我有這個從 Firebase 流式傳輸的習慣串列,我想在函式中接受該流,并回傳一個新流,該流是另一個型別的 ViewModel 串列。但是我的函式回傳了錯誤型別的流。
這是我的代碼:
Stream<List<HabitCompletionViewModel>> _getTodaysHabits(
Stream<List<Habit>> habitsStream) {
var result = habitsStream.map((habitsList) {
habitsList.map(
(habit) async {
await _getHabitCompletionsCurrent(habit);
HabitCompletion completion = habit.completions!.firstWhere(
(completion) => completion.date
.dayEqualityCheck(DateTime.now().startOfDate()));
return HabitCompletionViewModel(completion: completion, habit: habit);
},
).toList();
});
return result;
}
我收到編譯錯誤,因為當我將滑鼠懸停在result變數上時它顯示為型別Stream<Null>,我希望它是Stream<List<HabitCompletionViewModel>>. 知道我做錯了什么嗎?
uj5u.com熱心網友回復:
您的外部.map呼叫沒有 return 陳述句,這就是您獲得Stream<Null>.
所以像這樣添加一個 return 陳述句:
Stream<List<HabitCompletionViewModel>> _getTodaysHabits(
Stream<List<Habit>> habitsStream) {
var result = habitsStream.map((habitsList) {
// added return statement here
return habitsList.map(
(habit) async {
await _getHabitCompletionsCurrent(habit);
HabitCompletion completion = habit.completions!.firstWhere(
(completion) =>
completion.date.dayEqualityCheck(DateTime.now().startOfDate()));
return HabitCompletionViewModel(completion: completion, habit: habit);
},
).toList();
});
return result;
}
然而,上面的代碼仍然有一個錯誤,因為它現在回傳的是 aStream<List<Future<HabitCompletionViewModel>>>而不是期望的Stream<List<HabitCompletionViewModel>>. 要解決此問題,您可以使用.asyncMap而不是.map.
Stream<List<HabitCompletionViewModel>> _getTodaysHabits(
Stream<List<Habit>> habitsStream) {
var result = habitsStream.asyncMap((habitsList) {
return Stream.fromIterable(habitsList).asyncMap(
(habit) async {
await _getHabitCompletionsCurrent(habit);
HabitCompletion completion = habit.completions!.firstWhere(
(completion) =>
completion.date.dayEqualityCheck(DateTime.now().startOfDate()));
return HabitCompletionViewModel(completion: completion, habit: habit);
},
).toList();
});
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518335.html
標籤:镖异步
