一、跨平臺語言
1、對跨平臺的理解(跨操作系統)
-
java語言的跨平臺說白了是讓程序員用戶可以跨平臺,它的平臺移植與管理交給某個團隊統一管理。就是java虛擬機需要某個團隊寫多個不同平臺的代碼,java程序員只寫java代碼,編譯一次就可以在多個平臺上運行。語言跨平臺是編譯後的文件跨平臺,而不是源程序跨平臺。.java經過編譯器(與平臺無關)編譯爲.class文件,再根據解釋器(與平臺相關)解釋執行。Java是解釋執行的,編譯爲中間碼的編譯器與平臺無關,編譯生成的中間碼也與平臺無關(一次編譯,到處運行),中間碼再由解釋器解釋執行,解釋器是與平臺相關的,也就是不同的平臺需要不同的解釋器.
JAVA字節碼通過虛擬機翻譯(解釋)給不同的平臺,這個過程就叫做跨平臺。JAVA字節碼文件只有一個,但針對不同的平臺會有不同的虛擬機,實現跨平臺最根本的東西是虛擬機(JVM)。
C語言有跨平臺的虛擬機,比如VMware Workstation在Windows上創建一個Linux虛擬機,或者你有興趣也可以自己寫在多個平臺上運行的c虛擬機。因爲c主要用在嵌入式編程,面對的是多種多樣的硬件設備,在多樣性面前很難統一,寫虛擬機維護與管理成本太高,沒人願意去做。除非硬件廠商都按一個標準,那麼c就可以很輕鬆地擁有跨平臺虛擬機。 C語言編譯出來直接就是機器碼,不需要虛擬機這一層
2、移動端的跨平臺發展
-
H5:WebView擔任Js與原生之間通信的Bridge橋樑,渲染界面使用的是js,html。
缺點:性能差
-
RN:RN不再使用WebView進行加載,而是通過Bridge橋樑,在運行時編譯成各個平臺的Native代碼,RN本質就是通過js寫一些配置文件,渲染界面還是使用原生的言語。
缺點:頻繁的跨橋調用,Bridge成本高。
Flutter:依託於DVM(dart虛擬機),使用Dart語言開發,在不同平臺編譯成不同平臺的機器碼,達到跨平臺的特點,這種編譯成機器碼,編譯型語言(類似於c語言),所以性能大大提高了。
二、Flutter
1、Flutter架構
- Framework層:用dart語言實現,裏面包括各種基礎組件,Widget、動畫等。
- Engine層:C++實現的,dart虛擬機就在這一層。還有skia渲染引擎(谷歌開發的),android原生繪圖也是通過skia渲染引擎。
- 判斷一個app是否時使用flutter開發的,只要下載這個apk解壓縮之後,看lib目錄裏的so文件,是否包含flutter.so文件就行了。
2、Flutter特點
-
熱重載(Hot Reload):修改代碼,界面實時更新,
原理:修改更新的配置文件,通過啓動電腦上的websocket服務,實現電腦到手機的雙向通信,實時更新手機UI界面
內置很多豐富的UI組件:統一ios和android的UI風格。
性能優越:相對其他跨平臺框架性能相對優越。
與原生app相比:1、apk包比原生大。2、cpu和內存佔用,比原生稍微高一點。
3、Dart
- 1、單線程:不存在多線程開發,所以不需要鎖,不存在線程間的數據競爭,所以沒有這方面的性能損耗。
三、Dart基礎
變量
未初始化的變量值都是null
1、var與dynamic:
var可以接受任意類型的變量,但一旦被賦值,類型就會被確定。
dynamic可以接受任意類型的變量,被賦值後,類型還可以再被賦值再改變。
2、final與const
final與const都可以修飾一個不可變的變量,但final變量是一個運行時常量,在第一次使用的時候被初始化。
const變量是一個編譯時常量,在編譯的時候就被初始化了。所以,const的性能比final高。
操作符
1、?.
a?.cancel():a不爲空纔會執行a的cancel()方法
2、??
var i = a??"a是空":a是空時,將a賦值爲字符串"a是空"
3、??=
k??="1":如果k之前沒有賦值,則會被賦值爲“1”,如果之前有值,這句話就無效。
函數
1、可選位置參數
例如有一個函數:String say(String from, String msg, [String device])
那麼device可以傳也可以不傳值,下面兩種調用方式都是對的。
say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');
2、可選命名參數
例如有一個函數:void fun1({int i,int j}),
使用時:fun1(i = 1)、fun1(j = 10)、fun1(i = 10,j = 20)都可以。
可選位置參數和可選命名參數都可以設置默認參數值
例如:
void fun1({int i = 1,int j = 2})
String say(String from = "a", String msg = "b", [String device = "c"])