J'ai cherché beaucoup de réponses sur le net.
J'ai écrit une itération sur une liste de lettres et mis des cartes à l'intérieur à l'écran en utilisant la classe "map"
Dans le code, vous pouvez voir que j'ai fait une ligne et en utilisant "carte" imprimé tout le userBoard sur des cartes à l'écran. Je veux ajouter quelques logiques à l'intérieur donc j'ai besoin d'obtenir l'id de l'elemnt (pour l'événement d'enregistrement). Theres un moyen que je peux faire taht?
En fait, je veux obtenir un index spécifique de l'élément sur userBoard
code:
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(), ) ], ),
}
Image - chaque carte est "élément" de la carte. Je veux obtenir les index de la fonction onTap.
Merci.
12 Réponses :
Vous pouvez utiliser 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
Je veux envoyer un index de "userBoard" comme paramètre userBoard.map ((element) => Container (child: Text (element) // .... Un peu de code et un écouteur du bouton func (element_index);
Pour accéder à l'index, vous devez convertir votre liste en carte à l'aide de l'opérateur asMap .
Exemple
userBoard.asMap().map((i, element) => MapEntry(i, Stack( GestureDetector(onTap: () { setState(() { // print("element=${element.toString()}"); // print("element=${userBoard[i].toString()}"); }); }), ))).values.toList();
Votre code
final fruitList = ['apple', 'orange', 'mango']; final fruitMap = myList.asMap(); // {0: 'apple', 1: 'orange', 2: 'mango'} // To access 'orange' use the index 1. final myFruit = fruitMap[1] // 'orange' // To convert back to list fruit fruitListAgain = fruitMap.values.toList();
Vous pouvez obtenir l'index use list.indexOf
lorsque la liste n'a pas d'éléments en list.indexOf
€ ‚
Exemple
userBoard.map((element) { // get index var index = userBoard.indexOf(element); return Container( ); }).toList()
Ce sera faux lorsque l'élément dupliqué dans votre liste renvoie l'index du premier élément fondé.
Ce serait très inefficace.
les éléments en double doivent être vérifiés à coup sûr
@jamesdlin Pourquoi est-ce inefficace?
@SimpleUXApps Parce que list.indexOf
doit parcourir la liste pour trouver l'élément spécifié. Chaque appel list.indexOf
est O (n), et son utilisation pour chaque élément de la liste serait donc O (n ^ 2). Ceci est inefficace car cette opération pourrait être facilement effectuée en un temps O (n).
Il n'y a pas de fonction intégrée pour obtenir l'index d'itération.
Ce que vous voulez probablement, c'est une map
qui vous donne l'index:
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; }); }
L'implémentation d' enumerate
est simple:
children: enumerate( list, (index, item) => Text("event_$index") ).toList();
Une autre solution est d'obtenir le hascode de votre objet est un exemple unique comme int :
onSelectChanged: (d) { setState(() { selectedRow = d == true ? object.hascode : null; }); }, selected: object.hascode == selectedRow,
cela renverra un identifiant comme 123456789 pour chaque itération
vous lorsque vous l'utilisez dans un autre widget lorsque vous avez besoin
yourClass.hasCode()
Une autre approche utilisant List.generate
:
var list = ['y', 'e', 's']; var widgets = List.generate(list.length, (i) => Text(list[i]));
Vous pouvez utiliser la fonction enumerate
package:quiver
premier:
enumerate(userBoard).map((indexedValue) { final index = indexedValue.index; final element = indexedValue.value; // ... })
Cela ne fonctionne pas!
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 }, ), )
Solutions
List myList = ['a', 'b', 'c']; myList.map( (val, index) { // This does not work! // Which index am I on? })
Nous pouvons étendre Iterable
avec une nouvelle fonction:
myList.mapIndexed((element, index) {});
Usage:
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++)); } }
Pris d' ici .
Vous pouvez essayer ceci
children: [ for(int index = 0; index < list.length; index++) Text(list[index]) ]
Transformez votre liste en une autre à l'aide de la map
.
Column( children: textList, )
Usage:
var yourList = ['A', 'B', 'C']; var textList = yourList.map((e) => Text(e)).toList();
Peut également essayer ceci:
list.asMap().keys.toList().map((index) { // var item = list[index]; // index is the index of each element. return youFunction(index); });
J'écris également d'autres approches dans mon blog ici. https://medium.com/@channaly/map-with-index-in-dart-flutter-6e6665850ea8