Named intermediate lists make a pipeline easier to inspect and test.

Program

Play the program to select tasks and then transform their titles.

pipeline_stages.dart
void main() {
  var tasks = [
    {'title': 'docs', 'done': true},
    {'title': 'tests', 'done': false},
    {'title': 'deploy', 'done': false},
  ];
  var showDone = ;
  var selected = <Map<String, Object>>[];
  for (var task in tasks) {
    if (showDone || task['done'] == false) selected.add(task);
  }
  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();
  print('tasks=${titles.join(",")}');
}
void main() {
  var tasks = [
    {'title': 'docs', 'done': true},
    {'title': 'tests', 'done': false},
    {'title': 'deploy', 'done': false},
  ];
  var showDone = ;
  var selected = <Map<String, Object>>[];
  for (var task in tasks) {
    if (showDone || task['done'] == false) selected.add(task);
  }
  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();
  print('tasks=${titles.join(",")}');
}
stage names `selected` and `titles` make intermediate data visible.
map `selected.map(...)` transforms each selected task.
toUpperCase String methods can be part of the transform stage.