74

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

在代码中你可以看到我做了一行,并使用“地图”将卡片上的所有用户板打印到屏幕上。我想在里面添加一些逻辑,所以我需要获取元素的 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(),
            )
          ],
        ),
}

图片- 每张卡片都是地图的“元素”。我想获取函数 onTap 的索引。

4

17 回答 17

137

要访问索引,您需要使用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();
于 2019-03-05T04:44:04.250 回答
60

list.indexOf当列表没有重复元素时, 可以获取索引使用。</p>

例子

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

  );
}).toList()
于 2019-07-17T08:06:44.780 回答
46

如果您想迭代,最简单的方法

我们可以扩展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) {});

取自这里

于 2020-03-03T07:47:16.257 回答
30

Dart 已经发布了包含所有 Iterables 扩展的collection包。mapIndexed

import 'package:collection/collection.dart';

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

飞镖垫

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

于 2021-07-13T06:35:53.610 回答
26

另一种方法使用List.generate

var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));
于 2019-10-18T04:39:19.660 回答
9

您可以简单地使用以下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]);
    }
  }
}

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


更新:我现在已经删除了一些方法,比如Iterable.mapIndexed()FIC 包中,因为谷歌在他们的集合包中添加了一个类似的方法,我希望这两个包兼容。

于 2021-04-02T14:38:34.920 回答
6

你可以试试这个

children: [
          for(int index = 0; index < list.length; index++)
            Text(list[index])
        ]
于 2020-09-03T00:18:18.233 回答
5

您可以使用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

于 2019-03-04T20:25:01.797 回答
3

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

list.asMap().entries.map((e) {
      var index = e.key;
      var value = e.value;
      // ...
    }
于 2021-04-11T08:32:16.587 回答
1

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

yourClass.hasCode()

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

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

onSelectChanged: (d) {
    setState(() {
       selectedRow = d == true ? object.hascode : null;
    });
 },
 selected: object.hascode == selectedRow,
于 2019-08-25T03:02:08.440 回答
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

于 2020-11-14T05:23:51.123 回答
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;
  });
}
于 2019-08-06T08:17:23.820 回答
0

使用 . 将您的列表转换为另一个列表map

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

用法:

Column(
  children: textList,
)
于 2020-11-12T10:30:26.280 回答
0

它在飞镖中非常简单直接。

myList.map((item) =>
print(myList.indexOf(item));//here I printing index             
).toList()
于 2021-04-02T13:25:58.157 回答
0
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
于 2021-12-09T09:57:56.063 回答
0

您可以先使用package:quiver'enumerate功能

enumerate(userBoard).map((indexedValue) {
  final index = indexedValue.index;
  final element = indexedValue.value;
  // ...
})
于 2019-12-29T18:20:52.370 回答
0

当前版本的内置集合包现在包含方法mapIndexed和全面的其他List/Iterable 扩展方法集。

import 'package:collection/collection.dart';
于 2021-11-16T13:29:31.073 回答