J'ai cherché beaucoup sur le net pour obtenir une réponse.
J'ai écrit une itération sur la liste des lettres et mis des cartes à l'écran en utilisant la classe "map"
Dans le code, vous pouvez voir que j'ai fait une rangée et en utilisant "map", j'ai imprimé tout le UserBoard sur des cartes à l'écran. Je veux ajouter quelques logiques à l'intérieur, donc j'ai besoin d'obtenir l'identifiant de l'elemnt (pour l'événement d'enregistrement). Y a-t-il un moyen que je puisse faire?
En fait, je veux obtenir un index d'élément spécifique 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 un "élément" de la carte. Je veux obtenir les index de la fonction onTap.
Je vous remercie.
Pour accéder à l'index, vous devez convertir votre liste en carte à l'aide de l'opérateur asMap .
Exemple
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();
Votre code
userBoard.asMap().map((i, element) => MapEntry(i, Stack(
GestureDetector(onTap: () {
setState(() {
// print("element=${element.toString()}");
// print("element=${userBoard[i].toString()}");
});
}),
))).values.toList();
Vous pouvez obtenir l'utilisation de l'index list.indexOf
lorsque la liste ne contient aucun élément en double。
Exemple
userBoard.map((element) {
// get index
var index = userBoard.indexOf(element);
return Container(
);
}).toList()
Une autre approche utilisant List.generate
:
var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));
Nous pouvons étendre Iterable
avec une nouvelle fonction:
import 'Dart:core';
extension IndexedIterable<E> on Iterable<E> {
Iterable<T> mapIndexed<T>(T f(E e, int i)) {
var i = 0;
return this.map((e) => f(e, i++));
}
}
Usage:
myList.mapIndexed((element, index) {});
Tiré de ici .
Cette approche nécessite Dart 2.7 et supérieur.
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
Vous pouvez utiliser package:quiver
fonction enumerate
d'abord:
enumerate(userBoard).map((indexedValue) {
final index = indexedValue.index;
final element = indexedValue.value;
// ...
})
Il n'y a pas de fonction intégrée pour obtenir l'index d'itération.
Ce que vous voulez probablement, c'est un map
qui vous donne l'index:
children: enumerate(
list,
(index, item) => Text("event_$index")
).toList();
L'implémentation de enumerate
est simple:
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;
});
}
Une autre solution est d'obtenir le hascode de votre objet est un unique comme int exemple:
yourClass.hasCode()
cela renverra un identifiant comme 123456789 pour chaque itération
vous lorsque vous utilisez dans un autre widgets lorsque vous avez besoin
onSelectChanged: (d) {
setState(() {
selectedRow = d == true ? object.hascode : null;
});
},
selected: object.hascode == selectedRow,