从List.map()获取迭代索引

问题描述 投票:0回答:21

我在字母列表上编写了一个迭代,并使用“地图”类将内部卡片放在屏幕上。

在代码中你可以看到我做了一行,并使用“map”将卡片上的所有用户板打印到屏幕上。我想在里面添加一些逻辑,所以我需要获取元素的 id(用于录制事件)。 有什么办法可以做到这一点吗?

实际上,我想通过 userBoard 获取元素的特定索引。

代码:

Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[
            Row(
              children: userBoard
                  .map((element) => Stack(children: <Widget>[
                        Align(
                          alignment: Alignment(0, -0.6),
                          child: GestureDetector(
                            onTap: (() {
                              setState(() {
                                // print("element=${element.toString()}");
                                // print("element=${userBoard[element]}");
                              });
                            }),
                            child: SizedBox(
                              width: 40,
                              height: 60,
                              child: Card(
                                  shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(5.0),
                                  ),
                                  child: Center(
                                    child: Text(element,
                                        style: TextStyle(fontSize: 30)),
                                  )),
                            ),
                          ),
                        )
                      ]))
                  .toList(),
            )
          ],
        ),
}

Picture - each card is

loops dictionary indexing dart flutter
21个回答
179
投票

要访问索引,您需要使用 asMap 运算符将列表转换为地图。

示例

final fruitList = ['apple', 'orange', 'mango'];
final fruitMap = fruitList.asMap(); // {0: 'apple', 1: 'orange', 2: 'mango'}

// To access 'orange' use the index 1.
final myFruit = fruitMap[1] // 'orange'

// To convert back to list
final fruitListAgain = fruitMap.values.toList();

您的代码

userBoard.asMap().map((i, element) => MapEntry(i, Stack(
  GestureDetector(onTap: () {
    setState(() {
      // print("element=${element.toString()}");
      // print("element=${userBoard[i].toString()}");
    });
  }),
))).values.toList();

参考其他答案


100
投票

Dart 发布了

collection
软件包,其中包含针对所有 Iterables 的
mapIndexed
扩展。

import 'package:collection/collection.dart';

void main() {
  final fruitList = ['apple', 'orange', 'mango'];
  final withIndices = fruitList.mapIndexed((index, fruit) => "$index - $fruit");
  print(withIndices);
}

(飞镖板)

该软件包附带了各种方便的扩展和有用的工具来处理集合。


88
投票

当列表没有重复元素时可以使用索引

list.indexOf

示例

userBoard.map((element) {
  // get index
  var index = userBoard.indexOf(element);
  return Container(

  );
}).toList()

56
投票

如果你想迭代,这是最简单的方法

我们可以用新函数扩展

Iterable

import 'dart:core';

extension IndexedIterable<E> on Iterable<E> {
  Iterable<T> mapIndexed<T>(T Function(E e, int i) f) {
    var i = 0;
    return map((e) => f(e, i++));
  }
}

用途:

myList.mapIndexed((element, index) {});

取自这里


38
投票

另一种使用

List.generate
的方法:

var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));

14
投票

您可以简单地使用

mapIndexed
方法:

userBoard.mapIndexed(
  (int index, element) => Container( ... ))
     .toList();

这是 FIC 包的众多扩展之一:https://pub.dev/packages/fast_immutable_collections


如果您不想将包添加到项目中,您可以直接复制扩展本身:

extension FicListExtension<T> on List<T> {

  /// Maps each element of the list.
  /// The [map] function gets both the original [item] and its [index].
  Iterable<E> mapIndexed<E>(E Function(int index, T item) map) sync* {
    for (var index = 0; index < length; index++) {
      yield map(index, this[index]);
    }
  }
}

注意:我是该包的作者之一。


更新:我现在已经删除了一些方法,例如

FIC包
中的Iterable.mapIndexed(),因为Google向他们的集合包添加了类似的方法,并且我希望这两个包兼容。


14
投票

您可以使用asMap()和entries.map()来获取索引。

list.asMap().entries.map((e) {
      var index = e.key;
      var value = e.value;
      // ...
    }

6
投票

您可以使用

list.asMap()

var result = list.asMap().map((e) => '${e[0]} - ${e[1]});
print(result);

https://api.dartlang.org/stable/2.2.0/dart-core/List/asMap.html


6
投票

你可以试试这个

children: [
          for(int index = 0; index < list.length; index++)
            Text(list[index])
        ]

3
投票

内置集合包的当前版本现在包含方法

mapIndexed
以及其他
List
/
Iterable
扩展方法的综合集。

import 'package:collection/collection.dart';

2
投票

试试这个:来源

(地图中的键)相同(列表中的索引)

myList.asMap().entries.map((entry) {
    int idx = entry.key;
    String val = entry.value;

    return something;
}

1
投票

没有内置函数来获取迭代索引。

您可能想要的是

map
,它为您提供索引:

children: enumerate(
  list,
  (index, item) => Text("event_$index")
).toList();

enumerate
的实现很简单:

Iterable<E> enumerate<E, T>(
    Iterable<T> items, E Function(int index, T item) f) {
  var index = 0;
  return items.map((item) {
    final result = f(index, item);
    index = index + 1;
    return result;
  });
}

1
投票

另一个解决方案是获取对象的 hascode 是唯一的 int 示例:

yourClass.hasCode()

这将为每次迭代返回一个像 123456789 这样的 id

当您需要时在其他小部件中使用时

onSelectChanged: (d) {
    setState(() {
       selectedRow = d == true ? object.hascode : null;
    });
 },
 selected: object.hascode == selectedRow,

1
投票

您可以先使用

package:quiver
enumerate
功能

enumerate(userBoard).map((indexedValue) {
  final index = indexedValue.index;
  final element = indexedValue.value;
  // ...
})

1
投票

使用

map
将您的列表转换为另一个列表。

var yourList = ['A', 'B', 'C'];
var textList = yourList.map((e) => Text(e)).toList();

用途:

Column(
  children: textList,
)

1
投票

也可以尝试这个:

list.asMap().keys.toList().map((index) {
  // var item = list[index];
  // index is the index of each element.
  return youFunction(index);
});

我还在我的博客中写了其他方法。 https://medium.com/@channaly/map-with-index-in-dart-flutter-6e6665850ea8


1
投票

在 Dart 中非常简单直接。

myList.map((item) =>
print(myList.indexOf(item));//here I printing index             
).toList()

1
投票
Map map = {
'1st':'first',
'2nd':'second'}; //any data

List mapAsList = map.keys.toList(); //convert map to list to get iteration index

print( map[mapAsList[0]] ); //first 
print( map[mapAsList[1]] ); //second

1
投票

您可以通过定义一个名为index的变量来做到这一点:

Widget listWidget() {

  List < String > myList = ['A', 'B', 'C'];

  int index = -1;

  return Column(
    children: myList.map < Widget > ((element) {
      index++;
      return Container(
        Text("$index : $element")
      );
    }).toList()
  );
}

1
投票
List mapList = [{'1st':'First'},{'2nd':'Second'}];
var element=mapList.map((e)=> e.value);
int getIndex = mapList.indexof(element);

0
投票

您还可以使用

indexed

void main() {
  final fruitList = ['apple', 'orange', 'mango'];
  print(fruitList.indexed.map((e) => "${e.$1} - ${e.$2}").toList());
}

会输出这个

[0 - apple, 1 - orange, 2 - mango]

© www.soinside.com 2019 - 2024. All rights reserved.