iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
Software Development

Dart 語言 - 開啟 Flutter 的鑰匙系列 第 26

Dart 26:用 import 匯入其他函式庫

在 Dart 中,每一個 *.dart 的檔案,都可以被其他檔案匯入 (import) 進來。無論是自己寫的程式碼,還是第三方的程式庫,都可以用關鍵字 import 來匯入。

簡單的程式庫架構

root directory --- lib --- lib_workshop.dart
                |
                -- pubspec.yaml 
  • 程式庫都是置放在 lib 目錄底下,如範例中的 lib_workshop.dart。放在該目錄中,就可以被使用關鍵字 import 匯入使用。

例如:

import 'package:[packagename]/lib_workshop.dart';
  • pubspec.yaml 是用來定義程式相關的設定,是 YAML 的格式,需注意空格。

範例如下:

name: lib_workshop
description: A starting point for Dart libraries or applications.
# version: 1.0.0
# homepage: https://www.example.com

environment:
  sdk: '>=2.8.1 <3.0.0'

#dependencies:
#  path: ^1.7.0

dev_dependencies:
  pedantic: ^1.9.0
  test: ^1.14.4
  • name:package 名稱。
  • description:package 的描述。
  • environment:定義需要的 SDK 版本
  • dependencies:可以匯入外部的 package。
  • dev_dependencies:可以匯入外部的 dev package。

參考:https://dart.dev/tools/pub/pubspec


將上方的架構修改為

root directory --- lib --- lib_workshop.dart
                |       |
                |       -- src --- lib_workshop_base.dart 
                |
                -- pubspec.yaml 
                |
                -- example --- lib_workshop_example.dart

在 lib 目錄下,建立我們需要的檔案結構,例如 lib\src

  • lib_workshop_base.dart :程式庫的內容包含在內。
class Sample {
	bool get isGood => true;
}
  • lib_workshop.dart:利用關鍵字 export 將其他的程式庫包含在此檔案裡面。
export lib_workshop_base.dart;

我們在 example\lib_workshop_example.dart 檔案中可以用將 lib_workshop.dart 匯入,就會連 lib_workshop_base.dart 一起匯入進來。

這樣做有什麼用意呢?

若在 lib 資料夾裡面有很多程式庫,那麼外面要匯入時,就只需要匯入一隻檔案,在這隻 *.dart 檔案中用關鍵字 export 包含在內的檔案就可以一併匯入,減少 import 的使用數量,也可以將程式庫做一個整理。


匯入第三方程式庫

除了我們自己寫的程式庫外,外部的程式庫也可以使用 import 匯入。

例如:為了在 lib_workshop_example.dart 處理 JSON 我們可以用 import 匯入 'dart:convert';

import 'dart:convert';
void main() {
  var json = {
    'name':'foo',
    'value':'bar'
  };
  var jsonMap = jsonEncode(json);
  print(json['name']);
}
//foo

匯入的程式庫含有衝突的類別名稱

若在 src 底下新增一個程式庫 (lib_workshop_base2.dart)

root directory --- lib --- lib_workshop.dart
                |       |
                |       -- src --- lib_workshop_base.dart 
                |               |_ lib_workshop_base2.dart
                |
                -- pubspec.yaml 
                |
                -- example --- lib_workshop_example.dart
  • 且在 lib_workshop_base2.dart 裡面有一個名為 Sample 的類別 (與lib_workshop_base.dart 裡面包含的類別相同)
//lib_workshop_base2.dart
class Sample {
	bool get isGood => false;
}

我們嘗試在 lib_workshop.dart export lib_workshop_base2.dart

export lib_workshop_base.dart;
export lib_workshop_base2.dart; //Compiliation-error
  • 使用 export 包含的程式庫裡,若有包含相同的類別名稱,會出現編譯錯誤,必須要將該 export 移除,或將同名的類別更名。

若直接在 lib_workshop_example.dart import 呢?

import 'package:dart_3/dart_2.dart';
import 'package:dart_3/src/dart_2_base_2.dart';

void main() {
  var sample = Sample(); //Compiliation-error
  print('sample: ${sample.isGood}');
}
  • 則會在使用的類別上出現編譯錯誤,此時,可以用關鍵字 asimport 的程式庫加上前綴字,如此就可以使用前綴字加上類別名稱,避免衝突。
import 'package:dart_3/dart_2.dart';
import 'package:dart_3/src/dart_2_base_2.dart' as sample2;

void main() {
  var sample = Sample(); 
  print('sample: ${sample.isGood}');

	var sample2 = sample2.Sample(); 
  print('sample2: ${sample2.isGood}');
}

//sample: true
//sample2: false

hide / show

在 Dart 中,每一個 *.dart 的檔案,並不一定包含一個類別,可能有多個組成。

例如:在 lib_workshop_base.dart 中,除了 Sample 類別外,還有一個類別名為 Hello

//lib_workshop_base.dart
class Sample {
	bool get isGood => true;
}

class Hello{
  void greeting(){
		print('Hello');
	}
}

若在其他的程式庫匯入 lib_workshop_base.dart 則兩個類別都能使用。

import 'package:[package_name]/srclib_workshop_base.dart'
void main{
	var sample = Sample();
	var hello = Hello();
}
  • hide:將不需要被匯入的類別隱藏起來。
import 'package:[package_name]/srclib_workshop_base.dart' hide Hello
void main{
	var sample = Sample();
	var hello = Hello(); //Compiliation-error
}
  • show:只顯示某類別。
import 'package:[package_name]/src/lib_workshop_base.dart' show Hello
void main{
	var sample = Sample(); //Compiliation-error
	var hello = Hello(); 
}

小結

當我們在 lib 資料夾中建立好我們的檔案之後,其他的程式碼就可以使用 import 來將類別匯入,如此,我們就可以在不同的檔案中沿用相同的類別,達到共用程式碼,以消除重複。

除了匯入自身的程式之外,還可以透過 pubspec.yaml 來加入外部的 package,接者同樣使用 import 來將 package 匯入。

若是同一個類別有很多檔案,我們可以新增一個檔案,該檔案專門使用 export 將相關類別的檔案包含在內,外部要使用則只需要 import 一個檔案即可。

import 匯入函式庫時,若我們不想要將該檔案中所有類別皆匯入,我們可以使用 hide 或是 show 來將不需匯入的類別排除。

最後,如果同一檔案匯入的檔案中有相同的類別名稱,可以使用 as 來將該類別加上前綴字,避免類別名稱衝突的情況發生。


上一篇
Day 25:擴充方法 (Extension method)
下一篇
Day 27:讓產生器 (Generator) 來產生一連串的同步或異步資料吧。
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30

尚未有邦友留言

立即登入留言