web-dev-qa-db-fra.com

Flutter - Récupère l'index d'itération de List.map ()

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.

17
Shoham yetzhak

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

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

Une autre approche utilisant List.generate:

var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));
3
EricW

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.

1
Andrey Gordeev

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

1

Vous pouvez utiliser package:quiver fonction enumerate d'abord:

enumerate(userBoard).map((indexedValue) {
  final index = indexedValue.index;
  final element = indexedValue.value;
  // ...
})
0
jamesdlin

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;
  });
}
0
Vivien

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,
0
Lucas Breitembach