Dart equivalent to Python zip and list comprehension for generating list of widgets from two lists Dart equivalent to Python zip and list comprehension for generating list of widgets from two lists dart dart

Dart equivalent to Python zip and list comprehension for generating list of widgets from two lists


If your aim is to create a list of widgets (assuming both your lists will have same number of elements). You can try

List<Widget> getWidgets() {  List<Widget> my_widget_list = [];  const _categoryNames = <String>[    'Length',    'Area',    'Volume',  ]; const _baseColors = <Color>[    Colors.teal,    Colors.orange,    Colors.pinkAccent,  ];  for (int i = 0; i <= _categoryNames.length -1 ; i++){    my_widget_list.add(MyWidget(_categoryNames[i],_baseColors[i]));  }  return my_widget_list;  }Widget MyWidget(String categoryName, Color baseColor){  return Container(    color: baseColor,    child: Text(categoryName,));}


There is a zip function from package:quiver. Combined with collection-for (Dart's equivalent to Python list comprehensions) can get you most of the way there. Dart does not have Python's automatic unpacking, so unfortunately you won't get nice variable names:

my_widget_list = [  for (var pair in zip([_categoryNames, _baseColors]))    MyWidget(pair[0], pair[1]),]


"Pythonic" Dart Syntax

You can do something that looks very similar to Python using Control Flow Collections.

    List<Widget> myWidgetList = [      for (String name in categoryNames)        for (Color color in baseColors)          if (baseColors.indexOf(color) == categoryNames.indexOf(name))            myWidget(name, color)    ];

Maybe a little less "Pythonic" but more concise . . .

    List<Widget> myWidgetList = [      for (String name in categoryNames)        myWidget(name, baseColors[categoryNames.indexOf(name)])    ];

Specifically, you should read over Control Flow Collections: Composing

Complete Unit Test

For you convenience here is a quick unit-test you can run.

import 'dart:core';import 'package:flutter/material.dart';import 'package:flutter_test/flutter_test.dart';void main() {  test('build list of widgets with composing', () {    List<Widget> myWidgetList = [      for (String name in categoryNames)        for (Color color in baseColors)          if (baseColors.indexOf(color) == categoryNames.indexOf(name))            myWidget(name, color)    ];    List<Widget> myOtherWidgetList = [      for (String name in categoryNames)        myWidget(name, baseColors[categoryNames.indexOf(name)])    ];    expect(myWidgetList.length, equals(myOtherWidgetList.length));    expect(myWidgetList.toString(), equals(myOtherWidgetList.toString()));    print(myWidgetList);  });}const categoryNames = <String>[  'Length',  'Area',  'Volume',];const baseColors = <Color>[  Colors.teal,  Colors.orange,  Colors.pinkAccent,];Widget myWidget(String categoryName, Color baseColor) {  return Container(      color: baseColor,      child: Text(        categoryName,      ));}