dart:core 是 Dart 自動隱式匯入 的標準核心函式庫,提供語言必備的基礎能力,下方依照模組整理核心功能與程式碼範例。
也就是開發者不需要手動撰寫匯入程式碼,此函式庫會自動載入。
一、主控台輸出
頂層函式 print(),會自動呼叫物件的 toString() 方法輸出文字。
void main() {
var tea = "milk tea";
print(tea);
print('I drink $tea.');
}Code language: Dart (dart)
二、數值型別:num / int / double
- 繼承關係:
int、double皆繼承自num - 字串轉數字:
parse(),int 支援指定進位 radix - 數字轉字串:
toString():基礎轉換toStringAsFixed(n):保留 n 位小數toStringAsPrecision(n):n 位有效數字
void main() {
// 字串轉數字
assert(int.parse('42') == 42);
assert(int.parse('42', radix:16) == 66);
assert(double.parse('0.5') == 0.5);
// 數字轉字串
assert(123.456.toStringAsFixed(2) == '123.46');
assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}Code language: Dart (dart)
三、字串 String & 正規表達式 RegExp
- String 不可變(所有修改方法都會回傳新字串);底層儲存 UTF-16 碼元
- 常用功能:搜尋、截取、分割、大小寫轉換、去除空白
void main() {
var str = 'Never odd or even';
// 查詢
assert(str.contains('odd'));
assert(str.startsWith('Never'));
assert(str.endsWith('even'));
assert(str.indexOf('odd') == 6);
// 截取、分割
assert(str.substring(6,9) == 'odd');
var parts = 'a b c'.split(' ');
// 修剪、判空
assert(' abc '.trim() == 'abc');
assert(''.isEmpty);
assert(' '.isNotEmpty);
// 大小寫
assert('dart'.toUpperCase() == 'DART');
// 字串拼接優先使用 StringBuffer(效能更佳)
var sb = StringBuffer();
sb.write('Hello ');
sb.writeAll([ 'A','B','C' ], ',');
print(sb.toString());
}Code language: Dart (dart)
正規表達式 RegExp
void main() {
var reg = RegExp(r'\d+'); // 比對連續數字
var text = 'llamas live 15 to 20 years';
assert(reg.hasMatch(text));
// 全域比對走訪
for(var m in reg.allMatches(text)){
print(m.group(0));
}
// 取代
var res = text.replaceAll(reg, 'XX');
print(res);
}Code language: Dart (dart)
注意:單純碼元不等於使用者可見字元,複雜 Unicode 字元(表情符號組合)建議使用第三方
characters套件。
四、集合(List / Set / Map)
1. List:有序、允許重複元素、支援索引存取
void main() {
var fruits = [ 'apple','orange' ];
fruits.add('kiwi');
fruits.addAll([ 'grape' ]);
fruits.removeAt(0);
fruits.sort((a,b)=>a.compareTo(b)); //排序
// 泛型限制
var strList = <String>[];
}Code language: Dart (dart)
2. Set:無序、元素唯一、無法使用索引存取
void main() {
var set = <String>{};
set.addAll([ 'gold','xenon' ]);
set.add('gold'); //重複新增不生效
assert(set.contains('xenon'));
// 交集運算
var set2 = Set.from([ 'xenon','argon' ]);
var inter = set.intersection(set2);
}Code language: Dart (dart)
3. Map:鍵值對集合,鍵具有唯一性
void main() {
var map = {54: 'xenon'};
print(map[54]);
assert(map.containsKey(54));
map.remove(54);
// key不存在才賦值
map.putIfAbsent('name', () => 'Dart');
// 走訪
map.forEach((k,v)=>print('$k:$v'));
}Code language: Dart (dart)
4. Iterable 通用集合操作(List/Set 實作 Iterable)
常用高階方法:forEach、map、where、any、every
void main() {
var list = [ 'green','black','chamomile' ];
list.forEach(print);
// map延遲求值,toList 立即執行
var upperList = list.map((e)=>e.toUpperCase()).toList();
// 篩選
var filter = list.where((e)=>e == 'chamomile');
assert(list.any((e)=>e == 'chamomile'));
assert(!list.every((e)=>e.contains('tea')));
}Code language: Dart (dart)
五、URI 位址處理(Uri)
用於URL編解碼、解析、組建網址
encodeFull:僅轉義空白等符號,保留/ : ? &等URL符號encodeComponent:全部特殊字元轉義(適合參數值編碼)
void main() {
// 解析url
var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
print(uri.scheme);
print(uri.host);
print(uri.queryParameters);
// 組建url
var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}Code language: Dart (dart)
六、日期時間 DateTime & Duration
DateTime:時間點,支援本地時區 / UTCDuration:時間區間,用於時間加減、計算時間差
void main() {
var now = DateTime.now();
var y2k = DateTime.utc(2000);
// 時間增減
var nextYear = y2k.add(const Duration(days:366));
var diff = nextYear.difference(y2k);
print(diff.inDays);
// 時間戳(毫秒,Unix紀元1970-01-01 UTC)
print(y2k.millisecondsSinceEpoch);
}Code language: Dart (dart)
警告:日光節約時間場景直接使用天數偏移容易發生錯誤,優先使用UTC時間。
七、工具介面與基礎類別
1. Comparable:實作物件比較,常用於排序
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}Code language: Dart (dart)
2. 自訂 Map Key:覆寫 == 與 hashCode
規則:相等的物件必須擁有相同 hashCode
class Person {
final String first, last;
Person(this.first,this.last);
@override
int get hashCode => Object.hash(first, last);
@override
bool operator ==(Object other) =>
other is Person && other.first == first && other.last == other.last;
}Code language: Dart (dart)
- 3. Iterable + Iterator
實作 Iterable 即可支援 for-in 迴圈,自訂迭代邏輯。
八、例外處理機制
- Error:嚴重錯誤,一般不建議攔截(例如 NoSuchMethodError)
- Exception:可預期的例外,可以攔截;支援自訂例外
class FooException implements Exception {
final String? msg;
const FooException([this.msg]);
@override
String toString() => msg ?? 'FooException';
}Code language: Dart (dart)
九、弱參考與終結器
WeakReference:弱參考,不會阻止GC回收物件Finalizer / NativeFinalizer:物件被回收後執行回呼,釋放原生資源Finalizable:避免物件被GC提前回收
dart:core 核心函式庫
Previous: dart:convert 函式庫
Next: dart:io