Dart library 可見性及 library part / part of 命令詳解—庫的組合及可見性
一、庫與可見性的概念
首先說明一個概念,在dart中,默認一個dart文件就是一個庫,稱為Mini Library.而不是在pubspec中用name關鍵字定義的包名下的lib目錄下的所有的文件是一個庫。理解了這個概念以后,再理解可見性就簡單多了。官方文檔說的“Every Dart app is a library”,實際上很多翻譯過來都是不對的(實際上我覺得官方原文說的也有歧義)。因為如果每一個dart App都是一個庫的話,那么如果這個App由多個dart文件組成,你會發(fā)現以‘_’開頭的庫成員(變量/方法等)在多個dart文件之間仍然不用復用,這也給我造成了很久的困惑。
總之:dart默認一個dart文件就是一個庫,該庫中以‘_’開頭的庫成員,僅在庫內可見,庫外不可見。
二、library、part、part of 關鍵字說明
2.1 多個文件組成一個庫
雖然在官方文檔和effective dart中,均不推薦使用library 和part 關鍵字,但一直想弄明白這兩個關鍵字是怎么使用的,以及又對前面提到的可見性有什么影響。
前面提到,dart默認一個dart文件就是一個庫,那么如何將多個文件組成一個庫呢?這就需要使用library和part關鍵字了。比如,我們做一個測試項目,文件目錄結構如下:

我們將visib/visib1/visib2三個dart文件組成一個庫。
1、首先,指定一個主庫文件,我們用visib.dart。在visib.dart中,使用library關鍵字定義庫名(visib):
library visib;
2、然后分別在visib1/visib2 兩個分庫文件中,使用part of 關鍵字,聲明是庫的一部分:
part of visib;
特別說明的一點是,1、2、步驟的兩句聲明,一定要放在文件的第一行,否則會出錯。
3、在visib.dart中,采用 part 關鍵字建立關聯:
part 'visib1.dart';
part 'visib2.dart';
這樣,這三個dart文件就組成了一個庫 library visib。
2.2 上述庫的可見性及使用方法
2.2.1 庫內可見性
上面3個文件組成一個庫以后,這3個文件內以‘_’開頭的成員,在庫內(3個文件內)可見,可互相調用,比如visib1.dart可以隨意調用visib.dart 或 visib2.dart的所有成員,就像它們是在同一個dart文件中一樣。且文件頭部不再需要使用import指令導入庫內的文件。當然,不以‘_’開頭的更可見了。
2.2.2 外部庫導入注意點
特別強調的一點是,如果需要使用import導入其它的庫,則該指令只能放在主庫文件中,不能放在分庫文件中。主庫文件中導入的外部庫,分庫不用重復導入即可直接引用。同時,import指令位置也有要求,只能放在 library 和 part指令行之間,否則也會報錯。示例代碼如下:
library visib; import 'dart:math'; part 'visib1.dart'; part 'visib2.dart'; void visib() { visib1(); visib2(); _vis1(); _vis2(); }
void _visi() {}
2.2.3 其它庫如何使用多個文件組成的庫
其它庫或腳本如果需要上述visib庫,則只需要/也只能導入主庫文件即可。該庫內位于多個文件內的不以‘_’開頭的成員,均可被調用。以‘_’開頭的成員則不可見。示例代碼如下:
import 'package:hello_lib/visibility/visib.dart'; void main() { visib(); // var vv = _Visib1(); visib1(); // in visib1.dart }
如上述代碼中的visib1()方法,就是定義在分庫文件visib1.dart中。如果導入分庫文件visib1.dart,則編譯器直接提示錯誤:
The imported library ''package:hello_lib/visibility/visib1.dart'' can't have a part-of directive.
Try importing the library that the part is a part of.dart(import_of_non_library)
意思就是說你導入的是個分庫文件,請導入主庫。
以上就是關于庫、library、part、可見性的說明,其中參考了:
http://www.5imoban.net/jiaocheng/dart/2020/0929/4002.html
文檔,向原作者致敬。
浙公網安備 33010602011771號