devstory

Le Tutoriel de Dart List

  1. List<E>
  2. Constructors
  3. Operators
  4. Properties
  5. Methods
  6. asMap()
  7. cast<R>()
  8. castFrom<S, T>(..)
  9. copyRange<T>(..)
  10. fillRange(..)
  11. indexWhere(..)
  12. insertAll(..)
  13. removeWhere(..)
  14. replaceRange(..)
  15. retainWhere(..)
  16. setAll(..)
  17. shuffle([Random? random])
  18. writeIterable<T>(..)

1. List<E>

Dans la plupart des langages de programmation, le tableau est un concept indispensable. Cependant, le langage de programmation Dart n'a pas de concept de tableau traditionnel. Il utilise plutôt List avec des fonctionnalités similaires et en a ajouté de nouvelles.
Ci-dessous les caractéristiques de List :
  • Comme les tableaux traditionnels, List contient des éléments ordonnés et est indexé à partir de 0.
  • En fonction du type de la List créée, sa taille est fixe ou peut être augmentée automatiquement si nécessaire.
abstract class List<E> implements EfficientLengthIterable<E>
  • DoubleLinkedQueue
  • IterableBase
  • IterableMixin
  • LinkedList
  • ListQueue
  • Queue
  • Set
  • Runes

2. Constructors

List est une classe. Par conséquent, pour créer un objet, vous devez utiliser son constructeur ou la méthode de fabrique statique fournie.
Les constructeurs :
@Deprecated("Use a list literal, [], or the List.filled constructor instead")
external factory List([int? length]);

external factory List.filled(int length, E fill, {bool growable = false});
@Since("2.9")
external factory List.empty({bool growable = false});
external factory List.from(Iterable elements, {bool growable = true});
external factory List.of(Iterable<E> elements, {bool growable = true});
external factory List.generate(int length, E generator(int index), {bool growable = true});
external factory List.unmodifiable(Iterable elements);
List([int?])
Le constructeur List([int?]) est obsolète (deprecated) et remplacé par la même syntaxe que la création d'un tableau traditionnel.
list_ex1.dart
var foo1 = List<String>();  // Deprecated (error)
var bar1 = List<String>(n); // Deprecated (error)
var baz1 = List<String>(0); // Deprecated (error)

List<int> foo2 = List<int>();  // Deprecated (error)
List<int> bar2 = List<int>(n); // Deprecated (error)
List<int> baz2 = List<int>(0); // Deprecated (error)

var foo3 = []; // OK
var bar3 = ["One", "Two"]; // OK

var foo4 = <String>[]; // OK
var bar4 = <String>["One", "Two"]; // OK

List<String> foo5 = []; // OK
List<String> bar6 = ["One", "Two"]; // OK

List<String> foo7 = <String>[]; // OK
List<String> bar7 = <String>["One", "Two"]; // OK
List.filled
external factory List.filled(int length, E fill, {bool growable = false});
Par exemple : Créer une List extensible, contenant 5 éléments, tous les éléments sont "Foo":
var list1 = List<String>.filled(5, 'Foo', growable: true);
var list2 = List.filled(5, 'Foo', growable: true);
List<String> list3 = List.filled(5, 'Foo', growable: true);
List.empty
@Since("2.9")
external factory List.empty({bool growable = false});
Créer une List vide dont la taille peut augmenter (growable).
var list1 = List<String>.empty(growable: true);  
var list2 = List.empty(growable: true);  
List<String> list3 = List.empty(growable: true);

// Same as:
var list4 = <String>[];
List<String> list5 = [];
List.of
external factory List.of(Iterable<E> elements, {bool growable = true});
Créer un objet List contenant tous les éléments d'un Iterable.
list_of_ex1.dart
import 'dart:collection';

void main() {
  // A collection containing non-duplicate elements
  var iterator = Set<String>.identity();
  iterator.add('Tom');
  iterator.add('Jerry');
  iterator.add('Donald');
  var list = List<String>.of(iterator, growable: true);
  print(list); // [Tom, Jerry, Donald]
}
List.from
external factory List.from(Iterable elements, {bool growable = true});
Créer un objet List contenant tous les éléments d'un Iterable. Ce constructeur est similaire à List.of, mais il n'a pas la capacité de vérifier les données d'Iterable d'entrée par lui-même, il peut donc provoquer des erreurs lors de l'exécution du programme.
Par exemple :
list_from_ex1.dart
void main() {
  // A collection containing non-duplicate elements
  var iterator = Set<dynamic>.identity(); // Any data type
  iterator.add('Tom');    // String data type
  iterator.add('Jerry');  // String data type
  iterator.add(1000);     // int data type

  var list = List<String>.from(iterator, growable: true); // Compile OK!! but Error at runtime.
  print(list);  
}
Output:
Unhandled exception:
type 'int' is not a subtype of type 'String'
#0      new List.from (dart:core-patch/array_patch.dart:40:5)
#1      main
bin/list_from_ex1.dart:10
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
List.generate
external factory List.generate(int length, E generator(int index), {bool growable = true});
Renvoyer une list d'éléments [length] avec des éléments générés par la fonction spécifiée.
Par exemple : Créer une List avec 5 éléments, les éléments sont générés en se basant sur leurs indices.
list_generate_ex1.dart
import 'dart:collection';
void main() {  
  // Create a Clousure (Function)
  var generator = (index)  {
     return 'Element $index';
  };
  var list = List<String>.generate(5, generator, growable: true );  
  print(list);  // [Element 0, Element 1, Element 2, Element 3, Element 4] 
}
List.unmodifiable
external factory List.unmodifiable(Iterable elements);

3. Operators

Les opérateurs de List :
E operator [](int index);
void operator []=(int index, E value);
bool operator ==(Object other);
List<E> operator +(List<E> other);

4. Properties

Les propriétés de List :
void set first(E value);
void set last(E value);
int get length;
set length(int newLength);
Iterable<E> get reversed;

5. Methods

Les méthodes de List :
static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);

static void copyRange<T>(List<T> target, int at, List<T> source, [int? start, int? end])  
    
static void writeIterable<T>(List<T> target, int at, Iterable<T> source);  

void add(E value);
void addAll(Iterable<E> iterable);

List<R> cast<R>();

void sort([int compare(E a, E b)?]);
void shuffle([Random? random]);

int indexOf(E element, [int start = 0]);
int indexWhere(bool test(E element), [int start = 0]);
int lastIndexWhere(bool test(E element), [int? start]);
int lastIndexOf(E element, [int? start]);

void clear();

void insert(int index, E element);
void insertAll(int index, Iterable<E> iterable);
void setAll(int index, Iterable<E> iterable);
bool remove(Object? value);
E removeAt(int index);
E removeLast();
void removeWhere(bool test(E element));
void retainWhere(bool test(E element));

List<E> sublist(int start, [int? end]);
Iterable<E> getRange(int start, int end);
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]);
void removeRange(int start, int end);
void fillRange(int start, int end, [E? fillValue]);
void replaceRange(int start, int end, Iterable<E> replacements);
Map<int, E> asMap();

6. asMap()

Map<int, E> asMap();
Renvoyer un objet Map<int,E> non modifiable (unmodifiable), avec les valeurs 0, 1, 2.. comme clefs et les éléments de la list comme valeurs.
list_asMap_ex1.dart
void main() {
  var list = <String>['Tom', 'Jerry', 'Donald'];
 
  Map<int,String> map = list.asMap();
  for(var idx in map.keys) {
    print('idx: $idx --> ${map[idx]}');
  }
}
Output:
idx: 0 --> Tom
idx: 1 --> Jerry
idx: 2 --> Donald

7. cast<R>()

List<R> cast<R>();
Renvoyer une vue de cette List<E> sous forme de List<R>.
Par exemple :
list_cast_ex1.dart
class Person {}
class Employee extends Person {
  String name;
  Employee(this.name);
}
void main() {
  var p1 = Employee('Jennifer');
  var p2 = Employee('James');
  var p3 = Employee('John');

  var list = <Person>[p1, p2, p3]; // List<Person>
  var empList = list.cast<Employee>(); // List<Employee>

  for (var emp in empList) {
    print(emp.name);
  }
}
Output:
Jennifer
James
John

8. castFrom<S, T>(..)

static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);
Une méthode statique qui renvoie une vue d'une List<S> spécifiée, en tant que List<R>.
Par exemple :
list_castFrom_ex1.dart
class Person {}
class Employee extends Person {
  String name;
  Employee(this.name);
}
void main() {
  var p1 = Employee('Jennifer');
  var p2 = Employee('James');
  var p3 = Employee('John');
  var personList = <Person>[p1, p2, p3]; // List<Person>
  var empList = List.castFrom<Person, Employee>(personList); // List<Employee>

  for (var emp in empList) {
    print(emp.name);
  }
}
Output:
Jennifer
James
John

9. copyRange<T>(..)

static void copyRange<T>(List<T> target, int at, List<T> source, [int? start, int? end])
Remplacer les éléments de l'index [at] d'une List par des éléments de l'index [start] à [end-1] d'un Iterable.
Cette méthode peut renvoyer une RangeError si :
end - start + at > target.length
Par exemple :
list_copyRange_ex1.dart
void main() {
  var sourceList = <String>['Zero', 'One', 'Two', 'Three'];
  var targetList = <String>['0', '1', '2', '3', '4', '5'];

  List.copyRange(targetList, 2, sourceList, 1, 3);
  print(targetList);
}
Output:
[0, 1, One, Two, 4, 5]

10. fillRange(..)

void fillRange(int start, int end, [E? fillValue]);
Remplacer tous les éléments de l'index [start] à [end-1] par [fillValue].
Par exemple :
list_fillRange_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
  print(flowers);
  print(' -- fillRange from index 2 to 5 -- ');  
  flowers.fillRange(2, 5, 'A');
  print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
 -- fillRange from index 2 to 5 --
[Rose, Lily, A, A, A, Marigold, Lavender]

11. indexWhere(..)

int indexWhere(bool test(E element), [int start = 0]);
Renvoyer l'index du premier élément qui réussit le test spécifié.
Par exemple :
list_indexWhere_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Water Lily', 'Marigold', 'Lavender'];

  var test = (String element) => element.contains('L'); // A Closure.

  var index = flowers.indexWhere((element) => element.contains('L'), 2);
  print('index found: $index --> ${flowers[index]}'); // 3 --> Lotus
}
Output:
index found: 3 --> Lotus

12. insertAll(..)

void insertAll(int index, Iterable<E> iterable);
Insérer tous les éléments d'un Iterable à cette List à l'index [index].
Par exemple :
list_insertAll_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
  print(flowers);

  Iterable<String> iterable = ['A', 'B', 'C'];
  flowers.insertAll(2, iterable);
  print(' --- After insertAll --- ');
  print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
 --- After insertAll ---
[Rose, Lily, A, B, C, Sunflower, Lotus, Snowdrop, Marigold, Lavender]

13. removeWhere(..)

void removeWhere(bool test(E element));
Supprimer tous les éléments qui réussissent le test spécifié.
Par exemple :
list_removeWhere_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
  print(flowers);

  var test = (String element) {  // A Closure.
     return element.contains('L') || element.contains('R');
  };
  flowers.removeWhere(test);
  print(' -- after removing -- ');
  print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
 -- after removing --
[Sunflower, Marigold]

14. replaceRange(..)

void replaceRange(int start, int end, Iterable<E> replacements);
Remplacer les éléments de l'index [star] à [end-1] de cette List par les éléments de l'Itérable spécifié.
Par exemple :
list_replaceRange_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
  print(flowers);
  print(' -- Replace elements from index 2 to 5 -- ');
  var iterable = ['A', 'B']; // Note: List is subclass of Iterable.

  flowers.replaceRange(2, 5, iterable);
  print(flowers); // [Rose, Lily, A, B, Marigold, Lavender]
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
 -- Replace elements from index 2 to 5 --
[Rose, Lily, A, B, Marigold, Lavender]
  • Dart Iterable

15. retainWhere(..)

void retainWhere(bool test(E element));
Supprimer tous les éléments qui ne réussissent pas le test spécifié.
Par exemple :
list_retainWhere_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
  print(flowers);

  var test = (String element)  => element.startsWith('S'); // A Clousure.
  flowers.retainWhere(test);
  print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
 -- fillRange from index 2 to 5 --
[Sunflower, Snowdrop]

16. setAll(..)

void setAll(int index, Iterable<E> iterable);
Remplacer les éléments de l'index [index] de cette List par les éléments d'un Iterable spécifié.
Cette méthode va lancer une RangeError si :
iterable.length + index > thisList.length
Par exemple :
list_setAll_ex1.dart
void main() {
  var flowers = <String>['Rose', 'Lily', 'Sunflower',  'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
  print(flowers);

  Iterable<String> iterable = ['A', 'B', 'C'];
  flowers.setAll(2, iterable);
  print(' --- After setAll --- ');
  print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
 --- After setAll ---
[Rose, Lily, A, B, C, Marigold, Lavender]

17. shuffle([Random? random])

void shuffle([Random? random]);
Mélanger de manière aléatoire les éléments de cette liste.
list_shuffle_ex1.dart
import 'dart:math';
void main() {
  var list = <int>[1, 2, 3, 4, 5, 6,7];
  list.shuffle(); //
  print(list);

  var random = Random(5); // seed = 5
  list.shuffle(random);
  print(list);
}
Output:
[4, 2, 5, 6, 7, 3, 1]
[3, 7, 6, 2, 5, 4, 1]

18. writeIterable<T>(..)

static void writeIterable<T>(List<T> target, int at, Iterable<T> source);
Remplacer les éléments de l'index [at] d'une List par les éléments d'un Iterable.
Cette méthode va lancer une RangeError si :
source.length + at > target.length
Par exemple :
list_writeIterable_ex1.dart
void main() {
  // Note: List is subclass of Iterable.
  Iterable<String> sourceIterable = <String>['Zero', 'One', 'Two', 'Three'];  
  var targetList = <String>['0', '1', '2', '3', '4', '5', '6', '7'];

  List.writeIterable(targetList, 2, sourceIterable);
  print(targetList);
}
Output:
[0, 1, Zero, One, Two, Three, 6, 7]