Dart:映射列表(list.map)

Abd*_*ؤمن 41 functional-programming dart flutter

我有一个Strings 列表,例如,

var moviesTitles = ['Inception', 'Heat', 'Spider Man'];
Run Code Online (Sandbox Code Playgroud)

并希望用moviesTitles.map它们将它们转换为Tab WidgetFlutter 中的s 列表.

Abd*_*ؤمن 74

您可以使用

moviesTitles.map((title) => Tab(text: title)).toList()

例:

    bottom: new TabBar(
      controller: _controller,
      isScrollable: true,
      tabs:
        moviesTitles.map((title) => Tab(text: title)).toList()
      ,
    ),
Run Code Online (Sandbox Code Playgroud)

  • map()返回的Iterable是惰性的。它只有在有人真正对其进行迭代时才被评估。调用`toList()`不仅返回实际列表,还强制执行此评估。 (10认同)
  • @AbdulMomenعبدالمؤمن 我相信问题是首先为什么需要它。在 Swift 中,映射 Array<E> 会返回新结果类型的 Array<R>。为什么映射 Dart List<E> 的结果还不是列表? (7认同)
  • 为什么我们需要`toList`? (4认同)
  • @MichaelLong因为这里在Dart中,map <T>返回一个Iterable <T>,而不是List <T>。 (3认同)
  • @onmyway133 因为问题是关于映射列表 (2认同)

小智 31

我是扑的新手。我发现人们也可以通过这种方式实现它。

 tabs: [
    for (var title in movieTitles) Tab(text: title)
  ]
Run Code Online (Sandbox Code Playgroud)

注意:它要求 dart sdk 版本 >= 2.3.0,见这里


Ale*_*Pad 6

是的,你也可以这样做

 List<String> listTab = new List();
 map.forEach((key, val) {
  listTab.add(val);
 });

 //your widget//
 bottom: new TabBar(
  controller: _controller,
  isScrollable: true,
  tabs: listTab
  ,
),
Run Code Online (Sandbox Code Playgroud)


Mat*_*rea 5

我尝试了同样的方法,但在函数映射中使用了具有更多值的不同列表。我的问题是忘记了 return 语句。这是非常重要的 :)

 bottom: new TabBar(
      controller: _controller,
      isScrollable: true,
      tabs:
        moviesTitles.map((title) {return Tab(text: title)}).toList()
      ,
    ),
Run Code Online (Sandbox Code Playgroud)

  • 只需将其更改为 `map((title) =&gt; Tab(text: title)).toList()` ,因此不需要返回... (4认同)
  • 这是因为你的函数是用``{}``声明的,问题是一行函数 (3认同)

Azh*_*Ali 5

tabs: [...data.map((title) => Text(title)).toList(), extra_widget],

tabs: data.map((title) => Text(title)).toList(),
Run Code Online (Sandbox Code Playgroud)

对我来说效果很好