# 前言
最近十分熱門的跨平臺框架使用了一門比較生僻的編程語言dart。dart語言自己深受早期一些編程語言的影響。特別是**Smalltalk,Java和JavaScript**。我是從Java語言向dart過分的,一開始感受很不錯,快速就對這門語言有了一個初步的認識,並可以寫小段代碼了。編程
但在flutter的不斷學習過程當中,我遇到了很多由於dart的一些語法而產生的困惑。回過頭來看dart的語法以後產生了一些頓悟,在此記錄下來但願能幫助到更多的學習者。json
## 你將學到什麼
- 外部庫的徹底導入與不徹底導入
- 導入新的庫對變量命名空間的影響
- 庫的拆分——part網絡
# 導入
## 徹底導入
咱們假定須要在A庫裏使用B庫的某些方法,咱們須要將B庫import進A庫。這是咱們十分熟悉的。框架
import 'B.dart';
不只如此,dart的導入語句還適用於任意url。咱們可使用網絡上的某個資源(dart文件)做爲外部庫導入。less
import 'http://hello/hello.dart';
可是咱們不推薦這樣作。由於網絡資源隨時可能會發生變化。一旦改變,咱們的程序將會被破壞。dom
真正嚴謹的作法是: 編程語言
import'package:hello/hello.dart';
使用 package:導入方式會執行一個常駐的封裝了代碼位置信息的包管理器。ide
一個庫可使用的所有對象包括這個庫自己聲明的,以及經過導入語句從其餘庫導入的。在dart:core中定義的對象是隱式導入的。而一個庫對外可以使用的對象稱爲庫導出的命名空間。學習
理論上一個庫的命名空間中不該有名稱相同的兩個對象,不然你須要使用別名。url
import 'test2.dart' class Test{ static final hello = new Test(); }
class Test2{ static final hello = new Test2(); Test2 _test = new Test2(); }
在這段代碼中,Test2被import進了Test庫,咱們在test庫中是沒法看到Test2的私有變量_test的,因此這個變量將不會被導入到命名空間。
在Dart中,當前庫所聲明的對象優先級高於任何對象,所以導入的庫中有頂層對象並不會有想象中那樣具備破壞性。可是若是你訪問了一個導入的對象,另一個導入後續又添加了一個同名對象,那麼新導入的對象會覆蓋原有對象。
## 不徹底導入
Dart提供了額外的機制來控制導入到庫內的對象:命名組合器show和hide。
### show
當咱們只須要一個龐大庫中某一個或某幾個(少數)的對象的時候,咱們能夠選擇使用show組合器進行導入。這樣可使你的庫更加健壯。
import 'package:math' show Random;
在這行代碼中,咱們只導入了math庫中的Random對象。
show組合器接收一個命名空間和一個標識符列表,並將標識符列表中出現的對象保留在命名空間。
### hide
當咱們在一個庫種但願不導入某一個或某幾個對象的時候,咱們可使用hide組合器進行導入。
import 'package:math' hide Random;
這段代碼將導入math庫但不導入math庫種的Random對象。實現方式與show相似。一樣也是接收一個命名空間和標識符列表,並將標識符列表中出現的對象從命名空間中丟棄,而後產生一個新的命名空間。
### 解決變量名衝突的辦法
解決此問題最好的辦法是將引入的庫加上別名。
import 'package:math' as mymath;
經過這種方式咱們能夠完美避開不一樣庫之間由於導入而使得變量名衝突的問題。
## 庫的拆分
有的時候一個庫可能太大,不能方便的保存在一個文件當中。Dart容許咱們把一個庫拆分紅一個或者多個較小的part組件。或者咱們想讓某一些庫共享它們的私有對象的時候,咱們須要使用part。
![](https://user-gold-cdn.xitu.io/2018/8/3/164fec464c3e0fc2?w=862&h=333&f=png&s=11670)
![](https://user-gold-cdn.xitu.io/2018/8/3/164fec4821d50947?w=877&h=437&f=png&s=20143)
這裏咱們能夠看到,parttest2.dart是part of 'parttest.dart'的文件,能夠理解爲,parttest2是parttest的一部分。在part test2.dart中,咱們並無引入package:flutter/material.dart包就直接繼承了StatelessWidget,是由於,在part中,import進來的庫是共享命名空間的。
不是全部的庫都有名稱,但若是使用part來構建庫,那麼庫必需要命名。
library xxx;
每一個子part都存放在各自的文件中。可是它們共享同一做用域,庫的內部命名空間,以及全部的導入(import)。
在上述例子中,咱們能夠看到,part data.dart中Data類中調用了part data.g.dart的DataFromJson(json)方法,而第二個part中構建DataFromJson(json)方法返回Data對象並無在part data.g.dart定義。它們彼此之間是共用的命名空間。而且私有對象也是能夠互相訪問的。
part也能夠經過url指明它所在的庫,可是咱們一樣也是不推薦這樣作的。
## Part與import有什麼區別
可見性:
若是說在A庫中import了B庫,A庫對B庫是不可見的,也就是說B庫是沒法知道A庫的存在的。而part的做用是將一個庫拆分紅較小的組件。兩個或多個part共同構成了一個庫,它們彼此之間是知道互相的存在的。
做用域:import不會徹底共享做用域,而part之間是徹底共享的。若是說在A庫中import了B庫,B庫import了C庫,A庫是沒有辦法直接使用C庫的對象的。而B,C如果A的part,那麼三者共享全部對象。而且包含全部導入。
# 寫在最後 以上就是Dart中庫的導入與拆分的所有內容,如有描述不許確或錯誤之處歡迎各位大牛指正!