Spread operators スプレッド演算子 ... と ...?
コレクション式を評価し、コレクション内の全要素を展開・取り出し、別のコレクションリテラル(リスト、Set、Map)に挿入します
演算子式には該当せず、...、...? は伝統的な意味での演算子ではなく、シンタックスシュガー(糖衣構文)に分類されます
2種類に分かれます
...collection:通常展開。コレクションが必ず null でないことを要求。nullを渡すと即時エラーが発生
...?collection:Null安全展開。コレクションがnullの場合、無視され例外はスローされません
公式サンプルコードを見れば簡単に理解できます
void main() {
final list1 = [1, 2, 3];
final list2 = [0, ...list1, 4, 5];
print(list2); // [0, 1, 2, 3, 4, 5]
// Null安全展開
List<int>? maybeList;
final safeList = [10, ...?maybeList, 20];
print(safeList); // [10, 20]、maybeListがnullでもエラーなし
}Code language: Dart (dart)
上記は2つのコレクションの例で、1つ目のコレクションは1、2、3の3要素です。2つ目のコレクションは0の後ろに1つ目のコレクションを挿入し、続けて4、5を追加することで [0, 1, 2, 3, 4, 5] となります
2番目の例も挿入処理ですが、maybeListがnullでありNull安全展開を使用しているため、要素が挿入されず結果に影響せずエラーも発生しません
Setの例
void main() {
final set1 = {1, 2};
final set2 = {3, ...set1, 4};
print(set2); // {3, 1, 2, 4}
}Code language: PHP (php)

Mapの例
void main() {
final map1 = {'a': 1, 'b': 2};
final map2 = {'c': 3, ...map1, 'd': 4};
print(map2); // {c: 3, a: 1, b: 2, d: 4}
}Code language: PHP (php)
注意事項
[] {} の外側で単独で ... を使用することはできません
void main() {
final list1 = [1, 2, 3];
var arr = ...list; // 文法エラー、コレクションリテラル内部のみ記述可能
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:12: Error: Expected an identifier, but got '...'.
Try inserting an identifier before '...'.
var arr = ...list; // 文法エラー、コレクションリテラル内部のみ記述可能
^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
var arr = ...list; // 文法エラー、コレクションリテラル内部のみ記述可能
^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
var arr = ...list; // 文法エラー、コレクションリテラル内部のみ記述可能Code language: PHP (php)
... で直接nullを展開すると実行時エラーが発生します。nullになる可能性がある場合は必ず ...? を使用してください
void main() {
List<int>? list = null;
var res = [...list]; // エラー発生
var resSafe = [...?list]; // 正常動作
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:16: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
var res = [...list]; // エラー発生Code language: PHP (php)
Previous: Dart カスケード記法
Next: Dart コメント