53 votes

Flutter/Dart : Comment accéder à une seule entrée dans une carte/un objet ?

C'est peut-être une question très simple mais j'ai du mal à trouver une réponse. J'ai un objet/map que je ne voudrais pas itérer mais accéder à une clé/valeur spécifique à un index.

Par exemple :

var _results = {
  'Key_1' : 'Value_1',
  'Key_2' : 'Value_2', 
};

Comment accéder à la clé_2 et à la valeur_2 de l'index[1] ?

J'ai essayé _results[index] , _results[index].value , _results[index].key y _results[index].toString() mais tous retournent null.

80voto

lrn Points 8630

Une carte permet de rechercher des valeurs par clé. Donc :

print(_results["Key_1"]);  // prints "Value_1"

Une carte n'est pas une liste de paires, vous ne pouvez pas y accéder par index.

Vous puede accéder aux clés, aux valeurs et aux entrées (paires de clés et de valeurs) en tant que Iterable s .

for (var key in _results.keys) print(key); // prints Key_1 then Key_2
for (var value in _results.values) print(value); // prints Value_1 then Value_2
for (var entry in _results.entries) {
  print(entry.key);
  print(entry.value);
}

Vous pouvez même convertir les entrées en une liste si vous voulez vraiment indexer par nombre entier :

var entryList = _results.entries.toList();
print(entryList[0].key);  // prints "Key_1"

Pourtant, ce n'est pas pour cela que les cartes sont conçues et optimisées. Le littéral de la map que vous avez écrit va itérer les entrées, et leurs clés et valeurs, dans l'ordre où elles apparaissent dans la source, mais toutes les maps ne garantissent pas cela. Si vous avez réellement besoin d'une liste de paires de chaînes de caractères, je vous recommanderais de créer vos données de cette manière dès le début, au lieu d'utiliser une carte. Ce sera très probablement plus efficace, et peut-être plus facile à lire.

73voto

EdHuamani Points 563

Convertir les valeurs en liste :

var _list = _results.values.toList();

obtenir par index :

print(_list[1]);

1 votes

Cela fonctionne, merci ! Cependant, n'y a-t-il pas un moyen explicite d'y accéder sans le changer en liste ? C'est parce que j'essaie d'accéder à l'élément de l'objet à l'intérieur d'un fichier de type listViewItemBuilder qui itère déjà l'objet[] avec l'index.

6 votes

Essayez _results.values.first o _results.values.elementAt(0) . Il n'est pas forcément rapide pour les positions supérieures à zéro (pour les _results.values.elementAt(n) il est probable qu'il va juste itérer jusqu'à ce qu'il ait vu n ).

23voto

Fellipe Sanches Points 555

Pour imprimer la valeur d'une clé, il suffit d'utiliser :

void main(){

  var results = {
  'usd' : 3.80,
  'eur' : 4.10, 
  'gbp' : 4.90, 
  };

  print(results['usd']); //3.80
}

0 votes

Cette réponse est un peu comme la réponse de @lrn, mais je voudrais atteindre les personnes qui ont besoin d'un exemple vraiment simple.

2voto

Randal Schwartz Points 9756

Une carte est par nature "non ordonnée", sauf par accident dans certaines implémentations. Il n'y a donc pas de "première" paire clé/valeur, et votre question initiale n'a pas de sens.

0voto

Cevin Ways Points 69

C'est ce que je fais pour accéder à un objet dans une liste dans Flutter :

getOrderType() async{
    setState(() {
      order.add(new OrderTransactionTypeModel("1", "table", "TABLE"));
      order.add(new OrderTransactionTypeModel("10", "freeTable", "FREE TABLE"));
      order.add(new OrderTransactionTypeModel("7", "jasa", "JASA"));
      order.add(new OrderTransactionTypeModel("2", "bungkus", "BUNGKUS"));
      order.add(new OrderTransactionTypeModel("4", "delivery", "DELIVERY"));
      order.add(new OrderTransactionTypeModel("6", "ojekOnline", "OJEK ONLINE"));
      order.add(new OrderTransactionTypeModel("11", "reservasi", "RESERVASI"));
      order.add(new OrderTransactionTypeModel("99", "lainnya", "LAINNYA"));

      var mappedOrder = order.map((n) => 'Id: ${n.orderId} name: ${n.orderName}');
    });

    print(mappedOrder.toString());
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X