Loops flatter-从List.map()中获取迭代索引

Loops flatter-从List.map()中获取迭代索引,loops,dictionary,indexing,dart,flutter,Loops,Dictionary,Indexing,Dart,Flutter,我在网上搜索了很多答案 我在字母列表上写下了迭代,并用“地图”将卡片放在屏幕上 阶级 在代码中,你可以看到我做了一行,并使用“地图”将所有的用户板打印到屏幕上。 我想在里面添加一些逻辑,所以我需要获取元素的id(用于录制事件)。 有一种方法我能做到吗 实际上,我想在userBoard上获得元素的特定索引 代码: Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.space

我在网上搜索了很多答案

我在字母列表上写下了迭代,并用“地图”将卡片放在屏幕上 阶级

在代码中,你可以看到我做了一行,并使用“地图”将所有的用户板打印到屏幕上。 我想在里面添加一些逻辑,所以我需要获取元素的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(),
        )
      ],
    ),
小部件构建(构建上下文){
返回行(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
划船(
儿童:用户板
.map((元素)=>堆栈(子项:[
对齐(
对齐:对齐(0,-0.6),
儿童:手势检测器(
onTap:(){
设置状态(){
//打印(“element=${element.toString()}”);
//打印(“元素=${userBoard[element]}”);
});
}),
孩子:大小盒子(
宽度:40,
身高:60,
孩子:卡片(
形状:圆形矩形边框(
边界半径:边界半径。圆形(5.0),
),
儿童:中心(
子元素:文本(元素,
样式:TextStyle(fontSize:30)),
)),
),
),
)
]))
.toList(),
)
],
),
}


谢谢。

您可以使用
list.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();
您的代码

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();

当列表中没有重复元素时,可以使用
list.indexOf
获取索引

范例

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

  );
}).toList()

没有用于获取迭代索引的内置函数

您可能需要的是一张
地图
,它提供了索引:

子项:枚举(
列表
(索引,项目)=>文本(“事件索引”)
).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;
  });
}
Iterable枚举(
Iterable项,E函数(int索引,T项)f){
var指数=0;
返回items.map((item){
最终结果=f(指数,项目);
指数=指数+1;
返回结果;
});
}

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

yourClass.hasCode()
对于每个迭代,这将返回一个类似于123456789的id

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

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

另一种方法是使用
List.generate

var list=['y','e','s'];
var widgets=List.generate(List.length,(i)=>Text(List[i]);
您可以先使用:

enumerate(userBoard).map((indexedValue){
最终索引=indexedValue.index;
最终元素=indexedValue.value;
// ...
})
这不起作用

List myList = ['a', 'b', 'c'];

myList.map( (val, index) {
    // This does not work!
    // Which index am I on?
})
解决方案

Container(
            width: MediaQuery.of(context).size.width,
            height: 170.0,
            child: ListView.builder(
              scrollDirection: Axis.horizontal,
              itemCount: myList.length,
              itemBuilder: (context, int index) {
                return ...//use index of item
              },
            ),
          )

如果要迭代,最简单的方法是 我们可以用一个新函数扩展
Iterable

导入“dart:core”;
Iterable上的扩展Indexedeterable{
Iterable mapIndexed(T函数(E,int i)f){
var i=0;
返回映射((e)=>f(e,i++);
}
}
用法:

myList.mapIndexed((元素,索引){});
摘自。

您可以试试这个

children: [
          for(int index = 0; index < list.length; index++)
            Text(list[index])
        ]
儿童:[
for(int index=0;index
使用
map
将您的列表转换为另一个列表

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

列(
儿童:文本列表,
)
也可以尝试以下方法:

list.asMap().keys.toList().map((index) {
  // var item = list[index];
  // index is the index of each element.
  return youFunction(index);
});
我也在我的博客里写了其他的方法。

省道很简单,直截了当

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

您只需使用
mapindex
方法即可:

userBoard.mapIndexed(
  (int index, element) => Container( ... ))
     .toList();
这是FIC软件包的众多扩展之一:


如果不想将包添加到项目中,只需复制扩展本身即可:

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]);
    }
  }
}
列表上的扩展名FicListExtension{ ///映射列表中的每个元素。 ///[map]函数获取原始[item]及其[index]。 Iterable MapIndex(E函数(int索引,T项)映射)同步*{ 对于(var索引=0;索引<长度;索引++){ 收益率图(指数,本[指数]); } } } 注:我是该软件包的作者之一


更新:我现在从中删除了一些方法,比如
Iterable.mapindex()
,因为Google在它们的包中添加了类似的方法,我希望两个包都兼容。

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

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

我想发送一个“userBoard”索引作为参数userBoard.map((元素)=>Container(子元素:Text(元素)/…..按钮func(元素索引)的一些代码和侦听器);当列表中的dublicate元素返回第一个建立的项的索引时,这将是错误的。这将是非常低效的。必须检查dublicate元素的sure@jamesdlin为什么效率低下?@SimpleUXApps因为
list.indexOf
必须迭代列表才能找到指定的元素。每个
list.indexOf
调用都是O(n),并将其用于列表的每个元素,因此将是O(n^2)。这是低效的,因为此操作可以在O(n)时间内轻松完成。感谢您的示例,但它不应该是第二行中的
final-fruitMap=fruitList.asMap();
?@DerKarim很好!已修复。非常感谢您的支持