26
votes

Flutter - Obtenez l'index d'itération de List.map ()

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.


0 commentaires

12 Réponses :


2
votes

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 commentaires

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



62
votes

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


0 commentaires

23
votes

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


5 commentaires

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).



0
votes

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


0 commentaires

0
votes

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


0 commentaires

8
votes

Une autre approche utilisant List.generate :

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


0 commentaires

0
votes

Vous pouvez utiliser la fonction enumerate package:quiver premier:

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


0 commentaires

-5
votes

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?
})


0 commentaires

14
votes

L'approche la plus simple si vous souhaitez itérer

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 .


0 commentaires

2
votes

Vous pouvez essayer ceci

children: [
          for(int index = 0; index < list.length; index++)
            Text(list[index])
        ]


0 commentaires

0
votes

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


0 commentaires

1
votes

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


0 commentaires