Dart library 可見性及 library part / part of 命令詳解—庫的組合及可見性


一、庫與可見性的概念

    首先說明一個概念,在dart中,默認一個dart文件就是一個庫,稱為Mini Library.而不是在pubspec中用name關鍵字定義的包名下的lib目錄下的所有的文件是一個庫。理解了這個概念以后,再理解可見性就簡單多了。官方文檔說的“Every Dart app is a library”,實際上很多翻譯過來都是不對的(實際上我覺得官方原文說的也有歧義)。因為如果每一個dart App都是一個庫的話,那么如果這個App由多個dart文件組成,你會發現以‘_’開頭的庫成員(變量/方法等)在多個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

文檔,向原作者致敬。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM