codestory

Die Anleitung zu 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>

In den meisten Programmiersprachen ist Array ein unverzichtbares Konzept. Die Programmiersprache Dart hat jedoch nicht das traditionelle Array-Konzept. Stattdessen verwendet es List mit ähnlichen Funktionen und fügt neue Funktionen hinzu.
Unten sind die Eigenschaften von List:
  • Wie tradionelle Arrays enthält List geordnete Elemente und wird beginnend bei 0 indiziert.
  • Je nach Art der erstellten List ist deren Größe fest oder kann bei Bedarf automatisch vergrößert werden.
abstract class List<E> implements EfficientLengthIterable<E>
  • DoubleLinkedQueue
  • IterableBase
  • IterableMixin
  • LinkedList
  • ListQueue
  • Queue
  • Set
  • Runes

2. Constructors

List ist eine Klasse. Nach gesundem Menschenverstand müssen Sie zum Erstellen eines Objekts seinen Konstruktor oder die bereitgestellte statische Factory-Methode verwenden.
Die Konstruktor
@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?])
Der Konstruktor List([int?]) ist veraltet und wurde durch dieselbe Syntax wie die tradionelle Array-Erstellung ersetzt:
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});
Beispiel: Erstellen Sie eine erweiterbare List, die 5 Elemente enthält, alle Elemente sind "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});
Erstellen Sie eine leere List, die größer werden kann
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});
Erstellt ein Objekt List, das alle Elemente einer Iterable enthält.
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});
Erstellen Sie ein Objekt List, das alle Elemente einer Iterable enthält. Dieser Konstruktor ähnelt List.of, hat jedoch nicht die Möglichkeit, die Daten des eingegebenen Iterable selbst zu überprüfen, sodass er zur Laufzeit des Programms die Fehler verursachen kann.
Zum Beispiel:
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});
Gibt eine Liste von [length]-Elementen mit den von der angegebenen Funktion generierten Elementen zurück.
Beispiel: Erstellen Sie eine List mit 5 Elementen, die Elemente werden anhand ihrer Indizes generiert.
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

Die Operator vom List:
E operator [](int index);
void operator []=(int index, E value);
bool operator ==(Object other);
List<E> operator +(List<E> other);

4. Properties

Die Properties vom List:
void set first(E value);
void set last(E value);
int get length;
set length(int newLength);
Iterable<E> get reversed;

5. Methods

Die Methode vom 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();
Gibt ein nicht änderbares Objekt Map<int,E> zurück, mit den Werten 0, 1, 2.. als Schlüssel und den Elementen der Liste als Werte.
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>();
Gibt eine Ansicht dieser List<E> als List<R> zurück.
Zum Beispiel:
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);
Eine statische Methode, die eine Ansicht einer angegebenen List<S> als List<R> zurückgibt.
Zum Beispiel:
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])
Ersetze Elemente von Index [at] einer List durch Elemente von Index [start] bis [end-1] einer Iterable.
Diese Methode kann einen RangeError auslösen, wenn:
end - start + at > target.length
Zum Beispiel:
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]);
Ersetzen Sie alle Elemente von Index [start] bis [end-1] durch [fillValue].
Zum Beispiel:
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]);
Gibt den Index des ersten Elements zurück, das den angegebenen Test besteht.
Zum Beispiel:
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);
Fügen Sie alle Elemente einer Iterable in diese List am Index [index] ein.
Zum Beispiel:
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));
Entfernt alle Elemente, die den angegebenen Test bestehen.
Zum Beispiel:
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);
Ersetzt die Elemente vom Index [start] bis [end-1] dieser List durch die Elemente des angegebenen Iterable.
Zum Beispiel:
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));
Entfernt alle Elemente, die einen angegebenen Test nicht bestehen.
Zum Beispiel:
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);
Ersetzt Elemente aus dem Index [index] dieser List durch die Elemente einer angegebenen Iterable.
Diese Methode löst einen RangeError aus, wenn:
iterable.length + index > thisList.length
Zum Beispiel:
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]);
Mischt die Elemente dieser Liste zufällig
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);
Ersetzen Sie die Elemente aus dem Index [at] einer List durch die Elemente einer Iterable.
Diese Methode löst einen RangeError aus, wenn:
source.length + at > target.length
Zum Beispiel:
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]