このページでは、Dartのコアライブラリの主要な機能を使用する方法を示します。 これは単なる概要であり、決して包括的なものではありません。 クラスの詳細が必要な場合は、DartAPIリファレンスを参照してください。
Contents
dart:core – numbers, collections, strings, and more
dart:coreライブラリ(APIリファレンス)は、小さいながらも重要な組み込み機能のセットを提供します。 このライブラリは、すべてのDartプログラムに自動的にインポートされます。
Printing to the console
トップレベルのprint()メソッドは、単一の引数(任意のオブジェクト)を受け取り、そのオブジェクトの文字列値(toString()によって返される)をコンソールに表示します。
print(anObject); print('I drink $tea.');
文字列とtoString()メソッドに関するさらに詳しい情報はlanguage tourのStringsをご覧ください。
Numbers
dart:coreライブラリは、num、int、およびdoubleクラスを定義します。これらには、数値を操作するための基本的なユーティリティがいくつかあります。
文字列は、それぞれintおよびdoubleのparse()メソッドを使用して整数またはdoubleに変換できます。
文字列→数値
assert(int.parse('42') == 42); assert(int.parse('0x42') == 66); assert(double.parse('0.50') == 0.5);
または、numのparse()メソッドを使用します。これにより、可能であれば整数が作成され、それ以外の場合はdoubleが作成されます。
assert(num.parse('42') is int); assert(num.parse('0x42') is int); assert(num.parse('0.50') is double);
整数の底を指定するには、基数パラメーターを追加します。
assert(int.parse('42', radix: 16) == 66);
文字列’42’を16進数で数値に変換している、ということですね。はい。
toString()メソッドを使用して、intまたはdoubleを文字列に変換します。 小数点の右側の桁数を指定するには、toStringAsFixed()を使用します。 文字列の有効桁数を指定するには、toStringAsPrecision()を使用します。
// Convert an int to a string. assert(42.toString() == '42'); // Convert a double to a string. assert(123.456.toString() == '123.456'); // Specify the number of digits after the decimal. assert(123.456.toStringAsFixed(2) == '123.46'); // Specify the number of significant figures. assert(123.456.toStringAsPrecision(2) == '1.2e+2'); assert(double.parse('1.2e+2') == 120.0);
もっと詳しい情報は、int, double, numのAPIドキュメントをご覧ください。
Strings and regular expressions
Dartの文字列は、UTF-16コードユニットのimmutableのシーケンスです。 languageツアーには、文字列に関する詳細情報があります。 正規表現(RegExpオブジェクト)を使用して、文字列内を検索したり、文字列の一部を置き換えたりできます。
Stringクラスは、split()、contains()、startsWith()、endsWith()などのメソッドを定義します。
Searching inside a string
文字列内の特定の場所を検索したり、文字列が特定のパターンで開始するか終了するかを確認できます。 例えば:
// 文字列が指定した文字列('odd')を含んでいるか。 assert('Never odd or even'.contains('odd')); // 文字列が指定した文字列('Never')で始まるか。 assert('Never odd or even'.startsWith('Never')); // 文字列が指定した文字列('even')で終わるか。 assert('Never odd or even'.endsWith('even')); // 文字列中の位置を調べる。 assert('Never odd or even'.indexOf('odd') == 6);
Extracting data from a string
文字列から個々の文字をそれぞれStringsまたはintとして取得できます。 正確には、実際には個々のUTF-16コードユニットを取得します。 高音部記号( ‘\ u {1D11E}’)などの数字の大きい文字は、それぞれ2つのコードユニットです。
部分文字列を抽出したり、文字列を部分文字列のリストに分割したりすることもできます。
// 文字列の6番目(一番最初は0番目から9番目の前までを取得。 //9番目は含まない。) assert('Never odd or even'.substring(6, 9) == 'odd'); // 文字列パターンにより分割して、分割された文字列を要素として // 持つリストを生成。 var parts = 'structured web apps'.split(' '); assert(parts.length == 3); assert(parts[0] == 'structured'); // Get a UTF-16 code unit (as a string) by index. assert('Never odd or even'[0] == 'N'); // split()メソッドの引数に空文字列を渡すと一文字ずつ // 分割して要素として持つリストを生成するので、 // イテレーティングに使える。 for (var char in 'hello'.split('')) { print(char); } // UTF-16コードユニットのリストを取得する。 var codeUnitList = 'Never odd or even'.codeUnits.toList(); assert(codeUnitList[0] == 78);
Converting to uppercase or lowercase
文字列を大文字、小文字に変換するのは簡単です。
// 大文字に変換 assert('structured web apps'.toUpperCase() == 'STRUCTURED WEB APPS'); // 小文字に変換 assert('STRUCTURED WEB APPS'.toLowerCase() == 'structured web apps');
注:これらの方法は、すべての言語で機能するとは限りません。 たとえば、トルコ語のアルファベットのドットなしIは正しく変換されません。
Trimming and empty strings
// 先頭と最後の空白を除去します。 assert(' hello '.trim() == 'hello'); // 文字列が空かを調べます。 assert(''.isEmpty); // スペース(空白文字)があれば空文字列ではありません。 assert(' '.isNotEmpty);
Replacing part of a string
文字列は不変のオブジェクトです。つまり、文字列を作成することはできますが、変更することはできません。
String APIリファレンスをよく見ると、どのメソッドも実際にはStringの状態を変更していないことがわかります。 たとえば、メソッドreplaceAll()は、元の文字列を変更せずに新しい文字列を返します。
var greetingTemplate = 'Hello, NAME!'; var greeting = greetingTemplate.replaceAll(RegExp('NAME'), 'Bob');
print(greetingTemplate); //Hello, NAME! print(greeting); //Hello, Bob!
置換後の文字列が生成されてgreetingにセットされるが、greetingTemplate自体の値は変わっていない。
Building a string
プログラムで文字列を生成するには、StringBufferを使用できます。 StringBufferは、toString()が呼び出されるまで、新しいStringオブジェクトを生成しません。
writeAll()メソッドには、区切り文字(この場合はスペース)を指定できるオプションの2番目のパラメーターがあります。
var sb = StringBuffer(); sb ..write('Use a StringBuffer for ') ..writeAll(['efficient', 'string', 'creation'], ' ') ..write('.'); var fullString = sb.toString(); assert(fullString == 'Use a StringBuffer for efficient string creation.');
Regular expressions
RegExpクラスは、JavaScript正規表現と同じ機能を提供します。 文字列の効率的な検索とパターンマッチングのために正規表現を使用します。
// 1桁以上の数値を表す正規表現 var numbers = RegExp(r'\d+'); var allCharacters = 'llamas live fifteen to twenty years'; var someDigits = 'llamas live 15 to 20 years'; // contains() は正規表現を使用できます。 assert(!allCharacters.contains(numbers)); assert(someDigits.contains(numbers)); // パターンにマッチした文字列(1桁以上の数値)を'XX'に置換する。 var exedOut = someDigits.replaceAll(numbers, 'XX'); assert(exedOut == 'llamas live XX to XX years');
RegExpクラスを直接操作することもできます。 Matchクラスは、正規表現の一致へのアクセスを提供します。
var numbers = RegExp(r'\d+'); var someDigits = 'llamas live 15 to 20 years'; // 受け取った文字列に、正規表現にマッチする部分があるかチェックします。 assert(numbers.hasMatch(someDigits)); // 全てのmatchをループします。 for (var match in numbers.allMatches(someDigits)) { print(match.group(0)); // 15, then 20 }
Refer to the String API reference for a full list of methods. Also see the API reference for StringBuffer, Pattern, RegExp, and Match.
Collections
Dartには、リスト、セット、マップのクラスを含むコアコレクションAPIが付属しています。
Lists
言語ツアーが示すように、リテラルを使用してリストを作成および初期化できます。 または、Listコンストラクターの1つを使用します。
Listクラスは、リストにアイテムを追加したり、リストからアイテムを削除したりするためのいくつかのメソッドも定義しています。
// Listコンストラクタでリストを生成する。 var vegetables = List(); // リストリテラルでリストを生成する。 var fruits = ['apples', 'oranges']; // 要素を追加します。 fruits.add('kiwis'); // 複数の要素を全て追加します。 fruits.addAll(['grapes', 'bananas']); // リストの長さを取得します。 assert(fruits.length == 5); // 一つの要素を除去します。 var appleIndex = fruits.indexOf('apples'); fruits.removeAt(appleIndex); assert(fruits.length == 4); // 全ての要素を削除します。 fruits.clear(); assert(fruits.isEmpty);
リストの中のインデックスを見つけるのにindexOf()メソッドを使います。
var fruits = ['apples', 'oranges']; // インデックスを利用してリストの要素にアクセスする。 assert(fruits[0] == 'apples'); // リストの要素の場所(インデックス)を見つける。 assert(fruits.indexOf('apples') == 0);
sort()メソッドを使ってリストの要素をソート(並べ替え)します。ソート用の関数を渡して並べ替え方(ソート方法)を指定できます。
下記のサンプルではcompareTo()メソッドを使ってソート用関数を定義しています。compareTo()メソッドはComparableクラスで定義されており、Stringクラスで実装されています。
var fruits = ['bananas', 'apples', 'oranges']; // Sort a list. fruits.sort((a, b) => a.compareTo(b)); assert(fruits[0] == 'apples');
リストクラス(リスト型)はジェネリック型です。リストが保持すべき要素の型を指定できます。
// fruitsは文字列を要素として持つリスト var fruits = List<String>(); fruits.add('apples'); var fruit = fruits[0]; assert(fruit is String);
//static analysis(静的解析)でエラー/警告 fruits.add(5); // Error: 'int' can't be assigned to 'String'
リストクラスの全てのメソッドはList API referenceをご覧ください。
Sets
Dart言語のSetは順番が無い、全ての要素がユニークなコレクションです。
(一つのセットの中に同じ値の要素が存在しない。)
順番が無いので、インデックス(ポジション)を指定して要素にアクセスすることはできません。
var ingredients = Set(); ingredients.addAll(['gold', 'titanium', 'xenon']); assert(ingredients.length == 3); // 重複する要素をaddしようとしても何も起こらない。 ingredients.add('gold'); assert(ingredients.length == 3); // セットから要素を削除する。 ingredients.remove('gold'); assert(ingredients.length == 2);
contains()メソッドとcontainsAll()メソッドを使って、セットの中に一つ、あるいは複数の要素があるかを調べることができます。
var ingredients = Set(); ingredients.addAll(['gold', 'titanium', 'xenon']); // Check whether an item is in the set. assert(ingredients.contains('titanium')); // Check whether all the items are in the set. assert(ingredients.containsAll(['titanium', 'xenon']));
intersectionメソッドはingredients,nobleGasesの両方のセットに含まれている要素を持つ、新しいセットを返します。
var ingredients = Set(); ingredients.addAll(['gold', 'titanium', 'xenon']); // Create the intersection of two sets. var nobleGases = Set.from(['xenon', 'argon']); var intersection = ingredients.intersection(nobleGases); assert(intersection.length == 1); assert(intersection.contains('xenon'));
セットの全てのメソッドの情報はSet API referenceをご覧ください。
Maps
マップ(Map)は一般的にはDictionary(ディクショナリ、Swiftなど)、またはhash(ハッシュ)として知られています。マップはkey-value(キーバリュー)ペアの、順番の無いコレクションです。
簡単にアクセスできるようにキー(key)を値(value)と関連づけて(結び付けて)います。JavaScriptとは違い、DartのマップはDartのオブジェクトとは違います。
簡潔なリテラルを使ってマップを宣言することができます。伝統的なコンストラクタを使ってマップを宣言することも可能です。
// マップではキーに文字列(String)を使うことが多いです。 var hawaiianBeaches = { 'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'], 'Big Island': ['Wailea Bay', 'Pololu Beach'], 'Kauai': ['Hanalei', 'Poipu'] }; // コンストラクタを使ってマップを生成することもできる。 var searchTerms = Map(); // マップはジェネリック型です。キーと値の型を指定できます。 //↓キーがint型、値はString型と指定している。 var nobleGases = Map<int, String>();
ブラケット構文( [ ] )を使用して、マップアイテムを追加、取得、および設定します。キーとその値をマップから削除するためにremove()メソッドを使用します。
var nobleGases = {54: 'xenon'}; // キーを指定して値を取得する。 assert(nobleGases[54] == 'xenon'); // マップが指定したキーを持っているか調べる。 assert(nobleGases.containsKey(54)); // マップからキーバリューペアを削除する。 nobleGases.remove(54); assert(!nobleGases.containsKey(54));
マップから全てのキー、全ての値を取得することができます。↓
var hawaiianBeaches = { 'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'], 'Big Island': ['Wailea Bay', 'Pololu Beach'], 'Kauai': ['Hanalei', 'Poipu'] }; // Get all the keys as an unordered collection // (an Iterable). var keys = hawaiianBeaches.keys; assert(keys.length == 3); assert(Set.from(keys).contains('Oahu')); // Get all the values as an unordered collection // (an Iterable of Lists). var values = hawaiianBeaches.values; assert(values.length == 3); assert(values.any((v) => v.contains('Waikiki')));
マップの中に指定したキーが有るかをcontainsKey()メソッドで調べることができます。
マップの値はnullになる可能性があるため、nullをチェックしてキーの存在を判断して、キーの値を取得するだけでは不十分です。
var hawaiianBeaches = { 'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'], 'Big Island': ['Wailea Bay', 'Pololu Beach'], 'Kauai': ['Hanalei', 'Poipu'] }; assert(hawaiianBeaches.containsKey('Oahu')); assert(!hawaiianBeaches.containsKey('Florida'));
(null-safety導入前の話。
null-safety導入後は、マップの値をnull不可型で指定すれば、値がnullである可能性は無い。null可型(nullable型)で指定すればnullの可能性が有るので、nullチェックをしましょう、ということ。
それ自体(nullの可能性が有る場合nullチェックをすべきという話)はnull-safety導入前でも全く同じことではある)
整理する必要がある。null-safety導入前は全ての変数(マップの値も)がnullと評価される可能性がある、というのはその通り。
マップの場合、null-safety導入前は、存在しないキーでアクセスした場合nullが返されたはず。多分上の「マップの値はnullになる可能性がある」というのはそのことを言っていると思われる。そこはnull-safety導入後はどうなるのか?
値がnull不可型に指定されているマップで存在しないキーによるアクセスをしたらどうなるのか。
↓
https://dart.dev/null-safety/understanding-null-safety#the-map-index-operator-is-nullable
マップ(下記サンプルではteamAssignments)の中に「指定したキー(下記サンプルでは’Catcher’)」が無い場合のみ、そのキーに値をセットしたい時はputIfAbsent()メソッドを使います。
putIfAbsent()メソッドの第二引数には、値を返す関数を渡す必要があります。
var teamAssignments = {}; teamAssignments.putIfAbsent( 'Catcher', () => pickToughestKid()); assert(teamAssignments['Catcher'] != null);
teamAssignmentsに’Catcher’というキーが無い場合は
‘Catcher’:pickToughestKid()の返り値
というキーバリューペアを追加する。すでにteamAssignmentsに’Catcher’というキーが存在する場合は何もしない。
上記サンプルではteamAssignmentsに’Catcher’というキーは無いので、キーバリューペアが追加される。
Mapクラスの全てのメソッドについての情報はMapAPI referenceをご覧ください。
Common collection methods
リスト、セット、およびマップは、多くのコレクションに見られる共通の機能を共有しています。この一般的な機能の一部は、ListとSetが実装するIterableクラスによって定義されます。
注: MapはIterableを実装していませんが、Map
keys
とvalues
プロパティを使用してIterableを取得できます。
isEmptyメソッドとisNotEmptyメソッドを使ってリスト、セット、マップに要素があるかどうかを調べることができます。
var coffees = []; var teas = ['green', 'black', 'chamomile', 'earl grey']; assert(coffees.isEmpty); assert(teas.isNotEmpty);
リスト、セット、マップの全ての要素に対して関数を適用したい場合、forEach()メソッドを使います。
var teas = ['green', 'black', 'chamomile', 'earl grey']; teas.forEach((tea) => print('I drink $tea'));
マップに対してforEach()メソッドを実行する場合、キーとバリューの二つの引数をとる必要があります。
void main(){ var hawaiianBeaches = { 'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'], 'Big Island': ['Wailea Bay', 'Pololu Beach'], 'Kauai': ['Hanalei', 'Poipu'] }; hawaiianBeaches.forEach((k, v) { print('I want to visit $k and swim at $v'); }); } /* flutter: I want to visit Oahu and swim at [Waikiki, Kailua, Waimanalo] flutter: I want to visit Big Island and swim at [Wailea Bay, Pololu Beach] flutter: I want to visit Kauai and swim at [Hanalei, Poipu] */
イテラブルはmap()メソッドを提供しています。map()メソッドは、全ての結果を格納した一つのオブジェクトを嘉永します。
import 'package:flutter/material.dart'; void main(){ var teas = ['green', 'black', 'chamomile', 'earl grey']; var loudTeas = teas.map((tea) => tea.toUpperCase()); loudTeas.forEach(print); print(teas); } /* flutter: GREEN flutter: BLACK flutter: CHAMOMILE flutter: EARL GREY flutter: [green, black, chamomile, earl grey] teas自体は変化していない。 teasの各要素を大文字化した新しいリストをloudTeasにセットしている。 */
注: map()によって返されるオブジェクトは、遅延評価されるIterableです。返されたオブジェクトからアイテムを要求(アイテムにアクセス)するまで、コールバック関数は呼び出されません。
即時にコールバック関数を各要素に対して実行したい場合は、map.toList()またはmap().toSet()を使用します。
var loudTeas = teas.map((tea) => tea.toUpperCase()).toList();
Iterableのwhere()メソッドを使って、条件にマッチした全ての要素を取得することができます。
Iterableのany()メソッドを使って、要素の中に、条件にマッチする要素があるかを調べることができます。
Iterableのevery()メソッドを使って、全ての要素が条件にマッチするかを調べることができます。
var teas = ['green', 'black', 'chamomile', 'earl grey']; // 渡された引数が'chamomile'ならtrueを返す。 // それ以外はfalseを返す。 bool isDecaffeinated(String teaName) => teaName == 'chamomile'; // 渡された関数がtrueを返す要素だけを探す。 var decaffeinatedTeas = teas.where((tea) => isDecaffeinated(tea)); // or teas.where(isDecaffeinated) // 条件にマッチする要素(渡した関数がtrueを返す要素)が少なくとも一つあるかを調べる。 assert(teas.any(isDecaffeinated)); // 全ての要素が条件にマッチするか // (全ての要素に対して渡した関数がtrueを返すか)を調べる。 assert(!teas.every(isDecaffeinated));
他のメソッドに関しては、Iterable API reference、List、Set、Mapをご覧ください。
URI
Uri classは文字列をURI(URLなど)へとエンコード、あるいはURIを文字列へとデコードするための機能を提供します。これらの機能は、
&
とか、
=
などURIにとって特別な文字(列)をエンコードします。Uriクラスは、URIのコンポーネント(ホスト、ポート、スキームなど)も解析して公開します。
Encoding and decoding fully qualified URIs
URIにおける特別な文字列( / , : , & ,#など)を除いた文字をエンコードまたはデコードするためには、encodeFull()メソッドとdecodeFull()メソッドを使います。これらのメソッドは、URIにとって特別な文字をそのままにしたURIである「完全修飾URI」をエンコード・デコードするのに適しています。
var uri = 'https://example.org/api?foo=some message'; var encoded = Uri.encodeFull(uri); assert(encoded == 'https://example.org/api?foo=some%20message'); var decoded = Uri.decodeFull(encoded); assert(uri == decoded);
someとmessageの間のスペースのみがエンコードされていることに注目してください。
Encoding and decoding URI components
文字列の中の「URIにとって特別な文字(/,&,:など)」も含めて全ての文字をエンコード、またはデコードするには、encodeComponent()メソッドとdecodeComponent()メソッドを使います。
var uri = 'https://example.org/api?foo=some message'; var encoded = Uri.encodeComponent(uri); assert(encoded == 'https%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message'); var decoded = Uri.decodeComponent(encoded); assert(uri == decoded);
全ての特別な文字がエンコードされています。例えば、/は%2Fにエンコードされています。
Parsing URIs
UriオブジェクトやURI文字列があるとき、「path」などのUriフィールドを使って、URIの一部を取得することができます。文字列からUriを生成する場合、静的メソッドparse()を使います。
var uri = Uri.parse('https://example.org:8080/foo/bar#frag'); assert(uri.scheme == 'https'); assert(uri.host == 'example.org'); assert(uri.path == '/foo/bar'); assert(uri.fragment == 'frag'); assert(uri.origin == 'https://example.org:8080');
取得できるその他のURI構成要素についてはUri API referenceをご覧ください。
Building URIs
Uri()コンストラクタを使って、それぞれのパーツからURIを生成することができます。
var uri = Uri( scheme: 'https', host: 'example.org', path: '/foo/bar', fragment: 'frag'); assert( uri.toString() == 'https://example.org/foo/bar#frag');
Dates and times
DateTimeオブジェクトは特定の時点です。タイムゾーンはUTCまたはローカルタイムゾーンのいずれかです。
いくつかのコンストラクターを使用してDateTimeオブジェクトを作成できます。
// Get the current date and time. var now = DateTime.now(); // Create a new DateTime with the local time zone. var y2k = DateTime(2000); // January 1, 2000 // Specify the month and day. y2k = DateTime(2000, 1, 2); // January 2, 2000 // Specify the date as a UTC time. y2k = DateTime.utc(2000); // 1/1/2000, UTC // Specify a date and time in ms since the Unix epoch. y2k = DateTime.fromMillisecondsSinceEpoch(946684800000, isUtc: true); // Parse an ISO 8601 date. y2k = DateTime.parse('2000-01-01T00:00:00Z');
millisecondsSinceEpoch
プロパティは、「Unixエポック」からのミリ秒数を返します— 1970年1月1日、UTC:
// 1/1/2000, UTC var y2k = DateTime.utc(2000); assert(y2k.millisecondsSinceEpoch == 946684800000); // 1/1/1970, UTC var unixEpoch = DateTime.utc(1970); assert(unixEpoch.millisecondsSinceEpoch == 0);
Durationクラスを使って日時の間隔を計算したり、未来・過去へ指定した間隔分シフトしたりできます。
void main() { // 1/1/2000, UTC var now = DateTime.now(); print(now); //今から50日後 var d1=now.add(Duration(days:50)); print(d1); //d1の30日前 var d2=d1.subtract(Duration(days:15)); print(d2); var duration=d1.difference(d2); print(duration); /* flutter: 2020-11-26 15:04:28.601481 flutter: 2021-01-15 15:04:28.601481 flutter: 2020-12-31 15:04:28.601481 flutter: 360:00:00.000000 */ }
警告:
Durationを使用してDateTimeを日単位でシフトすると、クロックシフト(夏時間など)が原因で問題が発生する可能性があります。日をシフトする必要がある場合は、UTC日付を使用してください。
その他の情報はDateTime,DurationのAPIリファレンスをご覧ください。
Utility classes
コアライブラリには、並べ替え、値のマッピング、反復に役立つさまざまなユーティリティクラスが含まれています。
Comparing objects
Comparable インターフェースを実装して、通常はソートのために、オブジェクトを別のオブジェクトと比較できることを示します。このcompareTo()
メソッドは、小さい場合は<0 、同じの場合は0、大きい場合は> 0を返します 。
class Line implements Comparable<Line> { final int length; const Line(this.length); @override int compareTo(Line other) => length - other.length; } void main() { var short = const Line(1); var long = const Line(100); assert(short.compareTo(long) < 0); }
Implementing map keys
Dartの各オブジェクトは自動的に整数のハッシュコードを提供するため、マップのキーとして使用できます。ただし、hashCode
ゲッターをオーバーライドしてカスタムハッシュコードを生成することはできます 。
工事中🏗
Iteration
IterableクラスとIteratorクラスはfor-inループをサポートします。
for-inループで使用するイテレータを提供できるクラスを作成するときはいつでも、Iterableを拡張(可能な場合)または実装します。
Iteratorを実装して、実際の反復能力を定義します。
class Process { // Represents a process... } class ProcessIterator implements Iterator<Process> { @override Process get current => ... @override bool moveNext() => ... } // A mythical class that lets you iterate through all // processes. Extends a subclass of [Iterable]. class Processes extends IterableBase<Process> { @override final Iterator<Process> iterator = ProcessIterator(); } void main() { // Iterable objects can be used with for-in. for (var process in Processes()) { // Do something with the process. } }
↑上記ページがわかりやすい。
Exceptions
Dartコアライブラリは、多くの一般的な例外とエラーを定義しています。例外は、事前に計画してキャッチできる条件と見なされます。エラーは、予期しない、または計画していない状態です。
最も一般的なエラーのいくつかは次のとおりです。
受け取ったオブジェクト(nullの場合もある)がそのメソッドを実装していない場合にスローされます。
受け取るべき型とは別の型の引数を渡されたメソッドがスローするエラー。
アプリケーション固有の例外をスローすることは、エラーが発生したことを示す一般的な方法です。Exceptionインターフェイスを実装することにより、カスタム例外を定義できます。
class FooException implements Exception { final String msg; const FooException([this.msg]); @override String toString() => msg ?? 'FooException'; }
詳しい情報はExceptionsと、Exception API referenceをご覧ください。
参考
https://dart.dev/guides/libraries/library-tour#dartcore—numbers-collections-strings-and-more