Loops flatter-从List.map()中获取迭代索引
我在网上搜索了很多答案 我在字母列表上写下了迭代,并用“地图”将卡片放在屏幕上 阶级 在代码中,你可以看到我做了一行,并使用“地图”将所有的用户板打印到屏幕上。 我想在里面添加一些逻辑,所以我需要获取元素的id(用于录制事件)。 有一种方法我能做到吗 实际上,我想在userBoard上获得元素的特定索引 代码: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
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很好!已修复。非常感谢您的支持