flutter-對跨平臺的理解

一、跨平臺語言

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"])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章