dart:core 核心函式庫

dart:core 是 Dart 自動隱式匯入 的標準核心函式庫,提供語言必備的基礎能力,下方依照模組整理核心功能與程式碼範例。

也就是開發者不需要手動撰寫匯入程式碼,此函式庫會自動載入。

一、主控台輸出

頂層函式 print(),會自動呼叫物件的 toString() 方法輸出文字。

void main() {
  var tea = "milk tea";
  print(tea);
  print('I drink $tea.');
}Code language: Dart (dart)

二、數值型別:num / int / double

  1. 繼承關係:intdouble 皆繼承自 num
  2. 字串轉數字:parse(),int 支援指定進位 radix
  3. 數字轉字串:
  • 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)

常用高階方法:forEachmapwhereanyevery

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編解碼、解析、組建網址

  1. encodeFull:僅轉義空白等符號,保留 / : ? & 等URL符號
  2. 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:時間點,支援本地時區 / UTC
  • Duration:時間區間,用於時間加減、計算時間差
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 核心函式庫

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *