當前位置:首頁 » 網頁前端 » flutterweb參數傳遞
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

flutterweb參數傳遞

發布時間: 2023-01-30 18:17:26

❶ FlutterWeb 和 WebView 原生交互調用

需要創建兩個工程,一個是FlutterWeb工程最終打包成Web頁面,一個是Flutter原生工程承載一個WebView用來載入Web頁面。這樣做的好處在於只需要一種語言開發iOS和Android不用對接兩次,可以直接使用社區Flutter原生工程的插件,只需要封裝給Web調用。

FlutterWeb工程pubspec.yaml添加依賴

Flutter原生工程pubspec.yaml添加依賴

創建一個 toast_channel.dart,定義一個類實現 JavascriptChannel 重寫name指定channel名稱和onMessageReceived指定調用函數

在WebView的 javascriptChannels 配置上定義的Channel

創建一個 native_channel.dart ,定義一個外部函數通過 @JS("調用的channel和函數名") 註解指定調用的原生函數(JavascriptChannel固定名稱為postMessage)

需要使用的地方直接調用

創建一個 js_function.dart,存放被原生調用的函數名稱

將要提供給原生調用的函數,通過 js.context[原生調用名稱] = 函數 開放給外部調用

如果在FlutterWeb工程要使用這個函數也可以使用@JS註解

WebView 創建時會回調 onWebViewCreated 獲得 WebViewController ,WebViewController 調用 runJavascript 會執行JS函數無返回值,調用 runJavascriptReturningResult 會執行JS函數有返回值。

FutureBuilder獲取WebViewController, 需要使用的地方直接調用

使用 HTML,CSS,Canvas 和 SVG 元素來渲染。

缺點:會存在不同平台效果不一樣。

優點:不載入canvaskit默認使用系統字體,載入過程沒有多餘開銷。

需要用到wasm,WebAssembly 要求需要瀏覽器支持,WebView Android需要最低需要57,Safari iOS 需要最低需要 11。

缺點:canvaskit 有7m大默認地址在國外首次載入耗時;中文會載入字體庫默認地址在國外載入慢。

優點:性能更好,渲染效果一致。

--web-renderer=auto 默認移動端瀏覽器選擇 HTML,桌面端瀏覽器選擇 CanvasKit。

--web-renderer=html 使用 HTML 渲染器

--web-renderer=canvaskit 使用 CanvasKit 渲染器

綜上所訴推薦移動端使用HTML渲染更合適,在編譯和打包時指定渲染器 --web-renderer=html 。

--debug 模式構建的 Web 應用沒有被壓縮,且 Tree-shaking 沒有執行。

--profile 模式構建的 Web 應用沒有被壓縮,但 Tree-shaking 執行了。

--release 模式構建的 Web 應用被壓縮了,並且 Tree-shaking 執行了

運行命令

flutter run web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html

flutter run web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html --profile

打包命令

flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html --release

❷ Flutter 之 WebSockets (三十一)

Http協議是無狀態的,只能由客戶端主動發起,服務端再被動響應,服務端無法向客戶端主動推送內容,並且一旦伺服器響應結束,鏈接就會斷開所以無法進行實時通信。WebSocket協議正是為解決客戶端與服務端實時通信而產生的技術,現在已經被主流瀏覽器支持。目前 Flutter也提供了專門的包來支持WebSocket協議。

web_socket_channel package 提供了我們需要連接到WebSocket伺服器的工具。該package提供了一個 WebSocketChannel 允許我們既可以監聽來自伺服器的消息,又可以將消息發送到伺服器的方法。

執行flutter pub get 命令,即可

1. 連接到WebSocket伺服器

2. 監聽來自伺服器的消息

使用一個 StreamBuilder 來監聽新消息, 並用一個Text來顯示它們

工作原理
WebSocketChannel 提供了一個來自伺服器的消息 Stream 。該 Stream 類是 dart:async 包中的一個基礎類。它提供了一種方法來監聽來自數據源的非同步事件。與 Future 返回單個非同步響應不同, Stream 類可以隨著時間推移傳遞很多事件。該 StreamBuilder 組件將連接到一個 Stream , 並在每次收到消息時通知Flutter重新構建界面

3. 將數據發送到伺服器
為了將數據發送到伺服器,我們會add消息給WebSocketChannel提供的sink。

WebSocketChannel 提供了一個 StreamSink ,它將消息發給伺服器
StreamSink 類提供了給數據源同步或非同步添加事件的一般方法

4. 關閉WebSocket連接

思考:
假如我們想通過WebSocket傳輸二進制數據應該怎麼做(比如要從伺服器接收一張圖片)?我們發現StreamBuilder和Stream都沒有指定接收類型的參數,並且在創建WebSocket鏈接時也沒有相應的配置,貌似沒有什麼辦法……其實很簡單,要接收二進制數據仍然使用StreamBuilder,因為WebSocket中所有發送的數據使用幀的形式發送,而幀是有固定格式,每一個幀的數據類型都可以通過Opcode欄位指定,它可以指定當前幀是文本類型還是二進制類型(還有其它類型),所以客戶端在收到幀時就已經知道了其數據類型,所以flutter完全可以在收到數據後解析出正確的類型,所以就無需開發者去關心,當伺服器傳輸的數據是指定為二進制時,StreamBuilder的snapshot.data的類型就是List<int>,是文本時,則為String。

https://book.flutterchina.club/chapter11/websocket.html

❸ Flutter與原生通信概述

flutter與原生通信主要有三種方式:MethodChannel、EventChannel、BasicMessageChannel,這三種方式均各有適用的場景:MethodChannel用於native與flutter的方法調用,EventChannel用於native單向的向flutter發送廣播消息,BasicMessageChannel用於native與flutter之間的消息互發。

MethodChannel用於雙方之間的方法互調,使用步驟是:
1.創建一個MethodChannel對象,傳入MethodChannel名稱。
2.使用setMethodHandle對對方調用自己的方法進行監聽,通過回調中的MethodCall對象方法名判斷、獲取方法參數,並且返回調用結果。
3.使用invokeMethod來調用對方的方法,可傳入方法名,方法參數,以及監聽對方的回調結果。
以下是示例:

需要注意的是,MethodChannel的名稱需要雙方保持一致,否則就不是同一個MethodChannel了。另外這里的方法調用並不是像Java裡面反射那樣去先找到class示例對象再解析到相應的方法,而是將雙方互發的消息包裝成了MethodCall對象,拿到這個對象後通過MethodCall裡面的方法名去判斷要做什麼操作,並不是直接就調用了自身(native或flutter)相對應的方法。具體要做什麼操作、調用什麼方法還是得自己去調用和實現。

EventChannel適用於native向flutter發送廣播消息,只是單向的消息發送,native發,flutter收,返過來flutter並不能向native發送消息。例如native可將定位數據不斷的報給flutter,或者錄像數據等等,所有基於原生能力產生的數據都可以通過EventChannel進行發送。
步驟:
1.創建一個EventChannel對象,傳入EventChannel名稱。
2.flutter端調用receiveBroadcastStream進行廣播消息注冊,傳入arguments參數即為廣播名稱,此參數是告訴native端你要接受的廣播類型,判別是什麼廣播發送的數據。
2.native調用setStreamHandler方法進行廣播消息監聽,onListen回調里會有一個arguments參數,這里及為flutter注冊的廣播類型,若flutter端沒有注冊,則native端不會收到這個回調,也就無法進行消息發送。收到flutter端的廣播注冊後,根據arguments可判斷廣播類型,然後根據EventChannel.EventSink來進行消息發送,EventSink.success()即可將消息發送給flutter端。
3.flutter進行廣播注冊會返回一個streamSubscription類型的對象,該對象可以進行消息的停止,native可在onCancel回調裡面收到。
示例如下:

BasicMessageChannel就是比較常用的消息互發,使用步驟如下:
1.創建BasicMessageChannel對象,傳入BasicMessageChannel名稱。還需傳入編解碼方式(可以自己實現),系統提供了一些列的編解碼方式,後續會介紹到。
2.使用setMessageHandler方法進行消息監聽,也可進行回復。
3.使用send方法進行消息發送。

無論哪種方式的消息傳遞,最終都是將自定義數據轉化為二進制數據進行傳遞,flutter提供的編解碼方式分為MethodCodec和MessageCodec兩種,EventChannel和MethodChannel使用的就是MethodCodec,BasicMessageChannel使用的是MessageCodec。MethodCodec其實就是在MessageCodec的基礎上將數據包裝了一下,使其轉化為MethodCall對象方便使用。
MethodCodec源碼:

MethodCodec提供了兩種方式:JSONMethodCodec和StandardMethodCodec,前一種就是JSON和MethodCall對象之間的互轉,後一種則是根據傳入的數據基本類型(String,Integer等)來進行互轉。
MessageCodec則提供了四種方式,如下圖,具體就不詳細講述了,看看名字就知道是怎麼回事,可以直接去看源碼。最常用和默認的就是StandardMessageCodec方式。

從上面的使用方式可以看出,每一種Channel在創建的時候都需要傳遞一個BinaryMessenger,這個介面可以在FlutterEngine裡面拿到,因此需要在FlutterActivity裡面實現configFlutterEngine方法裡面重寫這個方法。FlutterActivity在attach FlutterEngine之後就會調用這個configFlutterEngine方法,通過flutterEngine.getPlugins().add(FlutterPlugin)方法可以FlutterPlugin的回調方法里進行數據的初始化和銷毀工作。如下圖

這個回調方法里的FlutterPluginBinding提供了一些我們可能會用到的對象,如下:

❹ flutter 與webview (vue)交互

flutter與webview交互

因為web端項目用的是vue框架 按照網上的教程flutter端調用js端方法不管用:

flutter端

web端

後來發現是vue的方法不會暴露給app使用 需要把方法名暴露給window

❺ flutter web(3) 快速創建web工程並運行

如果沒有輸出可能原因有兩個

1.我們使用 vscode ## vs code支持的額很好。

版本問題 --> 自行查找對應版本

修改 yaml 文件中的版本知道運行成功。或者直接改成any,從lock文件中找到真正版本再修改yaml中的文件

❻ flutter 網路請求dio的簡單使用以及請求頭參數的自定義

dio的使用方式有很多,我就只選出我認為最好用的api方式做下記錄,把get成post就是post請求了,網路請求都用的網路的api,實際上的response沒有任何意義,所以只要列印出response有值即可。
1.最簡單的請求例子,網路請求是非同步的所以用async await

2.帶有參數的get請求

3.自定義請求頭,可定義的請求頭dart已經為我們提供了專門的類存了對應的字元,引入以下庫,就能使用 HttpHeaders

一般我們請求接收到的數據是json格式,如'accept: application/json',我們就可以這樣自定義請求頭

4.使用Baseoptions

其他詳細參數設置參考如下:

❼ flutter 打包web

先運行下,看當前flutter 是否支持web項目, 如果沒有enable-web: true 則輸入 flutter config --enable-web

這時候項目中就包含了web文件夾.
輸入 flutter build web 就可以在build文件夾中生成web文件, 將它放到到tomcat或者其他容器就能訪問了!

附上項目的測試連接: http://47.100.55.134:8080/web/#/

參考: https://flutter.cn/docs/development/platform-integration/web

❽ flutter pushname使用和多參數傳遞

配置routes參數

main函數:

使用

單參數

多參數

參考了: Flutter命名路由及傳參的深度實踐與解讀 ;

❾ Flutter入門這一篇效率文章就夠了

本文面向 Flutter 初學者,旨在用易懂的方式帶大家入門。除了 Flutter 代碼,還會介紹到語法、原理、特性等基礎知識。相信本文能幫助你學習和理解 Flutter。

我們先看一下目前的一些跨平台方案,從前端渲染的角度來分類的話,大致可以分為以下幾種方案。

WebView 渲染

這種方案就很好理解,現在很多項目都會嵌入 H5 的頁面。就是用 JavaScript 等前端技術進行開發,在客戶端上用 WebView 來進行渲染。微信小程序目前使用的就是這種方案。

它的優點很明顯,使用成熟的前端技術進行開發,學習成本低,開發效率高,並且支持動態發布代碼。

但缺點也很明顯,在性能體驗上,和原生還是存在較大差距的。

原生控制項渲染

既然 WebView 的性能不夠好,於是就有了使用原生控制項進行渲染的方案。這種方案,同樣也是使用 JavaScript 開發,區別是它最終是調用原生控制項進行渲染的。這種方案的代表是 Facebook 的 React Native。

由於使用原生控制項進行渲染,性能體驗也會更接近原生。但也只是更接近,和原生還是有差距的,因為它需要頻繁的進行 JavaScript 和原生之間的通信,這個通信效率是比較低的。

另外,由於需要適配各個平台的控制項,那就有可能出現,系統控制項更新了,而框架本身還沒有更新,由此產生了一些問題。換句話說,這種方案是受到原生控制項限制的。

繪圖引擎渲染

接下來就是主角了。

在前端,如果完全不使用原生控制項,我們可以通過系統的繪圖 API 繪制出一個用戶界面。從這個角度出發,可以在各個平台使用一個統一介面的繪圖引擎來進行界面繪制,這個引擎最終調用的是系統的 API 繪制的。這樣的話,它的性能可以做到接近原生,並且又不受原生控制項的限制,在不同平台上能夠做到 UI 統一。

Flutter 就是這樣的一個開發框架。

一個跨平台 UI 解決方案

Flutter 是由 Google 開發的,一個跨平台 UI 解決方案。換句話說,它原則上只管 UI 的問題,如果涉及到平台本身的一些功能,比如調用藍牙、攝像頭,一般還是需要原生代碼去操作。但現在也會有一些第三方庫幫我們解決這些問題。

繪圖引擎 Skia

Flutter 使用 Skia 作為它的繪圖引擎。Skia 已經被 Google 收購,目前很多 Google 旗下的產品都是用 Skia 繪制的,包括 Android。

Android 內置了 Skia,但 iOS 沒有,所以在打 iOS 安裝包的時候,會把 Skia 一起打進去。這就導致了,用同一份 Flutter 代碼打包之後,iOS 的包要比 Android 的包大一些。

開發語言 Dart

Flutter 使用的開發語言,叫 Dart。Dart 也是 Google 自家的,它是一門面向對象的語言,從它身上會看到一些其他開發語言的影子。學習起來難度不大的。

前面講跨平台方案的時候,可以發現別的方案基本都是用 JavaScript 作為開發語言的,但為什麼 Flutter 不用?就因為 Dart 是谷歌自家的嗎?這個問題先留著,我們後面會提到。

這里部分就簡單點帶過了,具體的搭建流程可以在官網查看:

https://flutter-io.cn/docs/get-started/install

主要的搭建步驟如下:

下載 Flutter SDK

官網下載地址:

https://flutter.dev/docs/development/tools/sdk/releases

由於在國內訪問可能受限,官方為中國開發者搭建了鏡像:

https://flutter.dev/community/china

更新環境變數

解壓後,將 flutterin 的全路徑添加到環境變數 PATH 中。

安裝開發工具

理論上,任何文本編輯器都可以用來開發 Flutter 應用,但推薦的開發工具是 Android Studio、IntelliJ 以及 VS Code。因為在這些開發工具上,可以安裝官方的 Flutter 和 Dart 插件,得到更好的開發體驗。文章里使用 Android Studio 來演示。

如果你打算開發 iOS 應用,則還需要安裝 Xcode。

安裝插件

在開發工具的插件設置中,安裝上面說到的 Flutter 和 Dart 插件。Flutter 插件用於支持 Flutter 的運行、調試、熱重載等功能,而 Dart 插件則提供了代碼的輸入校驗、代碼補全等功能。

萬物始於 Hello World,我們先來創建一個顯示 Hello World 的 Flutter 項目。

在 Android Studio 的歡迎頁面選擇 Start a new Flutter project ,或者通過菜單欄的 File > New > New Flutter Project ,創建一個新的 Flutter 項目。

創建好的項目裡麵包含了 android 和 ios 兩個文件夾,它們是標準的 Android 和 iOS 項目。我們的 Flutter 代碼,存放在 lib 文件夾里。項目創建好後,會默認帶一個計數器的示例,我們不管它,把 main.dart 的代碼改成 Hello World:

啟動一個模擬器,或者連上真機,點擊 Run 運行一下,就能看這樣一個界面了:

具體代碼先混個眼熟就好,具體的後面會再講到。

在寫 Flutter 之前,還要先跟大家簡單介紹一下 Dart 的語法。如果你有 Java 或 JavaScript 的開發經驗,以及面向對象的編程思想,學起來是很快的。

我們可以在 test 文件夾下新建一個 dart 文件,用來寫測試代碼。

指定類型

var

但和 JavaScript 不同的是,以下代碼在 JavaScript 是不會報錯的,但在 Dart 里會報錯:

Object

如果非要上面這樣寫,那也可以。把 var 換成 Object 就不報錯了:

和 Java 類似,Object 是所有對象的根基類。但是這樣的話,如果想列印一下 num 的字元串長度,是會報錯的:

因為 length 是屬於 String 的,但系統只知道 num 是一個對象,並不知道它是一個 String。

dynamic

如果還是非要這樣寫,那也可以。Dart 有一個特有的關鍵字 dynamic,把 Object 改成 dynamic 就不報錯了:

我們運行一下這個文件,可以在控制台看到正確列印出了字元串長度。

函數

dynamic

在 Dart 里,函數也是可以不寫返回類型的,不寫的話會被當做 dynamic 來處理。這樣的話,函數的類型就是 return 的類型,如果沒有 return 則是 void 類型。比如可以這樣:

運行之後是能正確列印出字元串長度的。

用於傳參

Dart 里的函數也是一個對象,所以可以把函數作為參數來傳遞,比如:

可選參數

在 Dart 的函數傳參里,有一個叫可選參數的概念,我們以文字控制項 Text 為例,在源碼里可以看到 Text 的構造函數是這樣的:

首先,在參數里有一個 data,它是要顯示的文字內容,是一個必填項。而 data 後面的一堆參數,是用一個大括弧括起來的,這些參數就叫做可選參數,意思是這些參數可傳可不傳。

假如我們要顯示一個比較長的文字,又想限制它最多顯示兩行,就可以這樣來創建一個 Text:

可選參數,在 Flutter 裡面用的非常多。

非同步

Future

在 Dart 里使用 Future 來處理非同步任務,比如我們現在延時一秒列印 666,代碼如下:

Future 的語法和 Promise 非常像。任務執行成功會調用 then,執行失敗會調用 catchError,而無論成功還是失敗,都會調用 whenComplete。

async/await

如果你不喜歡上面那種寫法,或者是想把非同步轉成同步,就可以用 async 和 await 這兩個關鍵字來轉換。

我們把上面的代碼轉換一下,寫一個 getString 方法,返回的類型是 Future,它會延時返回一個字元串。在 main 函數後面加上 async 關鍵字,在 getString() 前面加上 await,代碼如下:

運行之後可以看到,能正常延時一秒後,把字元串列印出來。這里 getString() 返回的類型是 Future,而 await getString() 則是返回了延時之後返回的字元串。await 要在 async 的函數裡面才能使用。

async 和 await 其實是一個語法糖,它最終也是轉換成 Future 調用鏈的形式執行的。

接下來回到 Flutter,Flutter 里最重要的一個概念是 Widget(下面翻譯作控制項)。

在原生開發裡面,我們可能會在界面上區分,這是一個 View,這是一個 Layout,這是一個 View Controller。但在 Flutter 裡面,它們全都屬於一個統一的模型 Widget。可以說,在 Flutter 界面里,所有東西都是 Widget。

以前學面向對象的時候,我們都聽過一句話,叫萬物皆對象。我這里套用一下,在 Flutter 里, 萬物皆控制項

具體有哪些控制項,我做了一下簡單的分類。

根控制項

所有的控制項都屬於 StatefulWidget StatelessWidget 。它們的區別是,StatefulWidget 擁有狀態 State ,而 StatelessWidget 沒有。

StatefulWidget

當一個控制項是可變的時候,就要使用 StatefulWidget 來構建。StatefulWidget 本身不可變,但它持有的狀態 State 是可變的。

StatelessWidget

當一個控制項狀態是固定不可變的時候,就可以使用 StatelessWidget。前面我們寫的 Hello World 就是使用 StatelessWidget。

容器控制項

容器類控制項一般是將某些屬性或配置,作用在它的子控制項上,比如控制項所在的寬高、背景、位置等。

常用的容器控制項有 Container、Center、Padding 等。

布局控制項

布局控制項可以類比作原生開發中的 Layout,通常它會擁有一個 children 的屬性,用於接收一個控制項數組,對這些控制項進行特定的排版。

常用的布局控制項有 Row、Column、Stack、Flex 等。

基礎控制項

基礎控制項就是常用的文字、按鈕、圖片等控制項。

常用的基礎控制項有 Text、TextField、Button、Image 等。

功能控制項

在 Flutter 里還有一類控制項,它們不影響 UI 布局,但帶有一些特定的功能,比如頁面跳轉、事件監聽、定義主題等。我們把這一類控制項稱作功能控制項。

常用的功能控制項有 Navigator、NotificationListener、Theme 等。

開始寫 Flutter 代碼了。還記不記得,在 Flutter 項目創建之後,是自帶一個計數器 demo 的,現在我們用自己的代碼實現一遍。代碼修改成如下:

運行之後,就可以看到這樣的界面了:

按鈕每點擊一次,數字就會加一。下面我們來分析一下這段代碼,看下裡面用到的一些 Widget。

StatefulWidget

由於頁面中的數字是跟隨狀態變化的,所以該頁面改用 StatefulWidget。StatefulWidget 並不會直接返回一個 Widget,而是返回狀態 State,在 State 里再返回 Widget。

Scaffold

Scaffold 是一個標準的 Material Design 頁面,它包含了標題欄、浮動按鈕、側滑菜單、底部導航欄等配置。我們這里用到了標題欄 appBar、頁面內容 body、浮動按鈕 floatingActionButton。

AppBar

AppBar 就是標題欄,通過查看控制項的構造方法,我們可以知道它可配置的屬性。

AppBar 的可選參數除了標題 title,還可以配置標題前的內容 leading,右側的操作按鈕 anctions,控制項垂直高度 elevation 等。我們只傳了 title,其他屬性都用默認值。

Center

Center 是一個容器類控制項,它的作用就是讓它的子控制項居中顯示。

FloatingActionButton

熟悉安卓開發的應該對這個控制項比較熟悉,它就是頁面右下角一個特定樣式的 Button,參數裡面的 onPressed 是一個必填項,要傳一個點擊之後的回調函數。

根據這個例子,下面給大家介紹一下 Flutter 兩個比較重要的特性。

點擊 Button 之後,我們把 num 變數加一,並使用 setState 通知狀態發生了改變,Flutter 會根據新的狀態更新 UI。如果有接觸過小程序開發,setState 就和小程序的 setData 類似。

在 Flutter 裡面我們不需要用 set 方法來更新 UI,可變控制項是和狀態綁定的,這就是 Flutter 的響應式 UI 編程。

在 Android Q 和 iOS 13 里都加入了暗黑模式,我們也換一個暗黑主題來玩一下。MaterialApp 里有一個 theme 的屬性,我們把它配置一下:

這次改完之後不點 Run 了,我們點一下閃電圖標 Flutter Hot Reload ,就能看到界面發生了變化:

這就是 Flutter 的 熱重載 ,在修改完代碼之後,通過熱重載就能馬上在設備上看到修改結果,可以很大程度上增加開發效率。

下面再給大家介紹幾個 Flutter 里的常見操作。

在 Flutter 里,使用 Navigator 來管理頁面跳轉,比如要跳轉到一個 NewPage 可以這樣寫:

進棧使用 push,出棧則是 pop。

使用 MaterialPageRoute 會模擬出 Android 上頁面跳轉的過場效果。

我們來看看怎麼顯示一張本地圖片。

先在根目錄新建一個存放圖片的文件夾,比如叫 images,把圖片 picture.png 放進去。

找到根目錄下的 pubspec.yaml 文件,這個便是 Flutter 依賴配置文件,我們需要在這里配置一下剛才的圖片:

這樣,我們就能使用 Image 控制項把這張圖片顯示出來了:

和 node 的 npm 以及 Android 的 jcenter 類似,Flutter 也擁有一個公共倉庫 pub.dev。pub.dev 是 Google 官方的 Dart 倉庫,在上面可以找到我們需要的包和插件。

Flutter 本身沒有 Toast,我們來接入一個。在 pub.dev 上搜索後,我決定使用 fluttertoast:

按照說明,在 pubspec.yaml 文件里的 dependencies 下配置:

點一下 Android Studio 右上角的 Packages get 同步之後就可以使用了:

我們上面使用的都是 Material Design 的控制項,它們都是在 flutter/material.dart 包裡面的。如果要使用 iOS 風格的控制項,則要用到 flutter/cupertino.dart 包:

iOS 風格的控制項,基本都以 Cupertino 開頭。我們把計時器頁面里的控制項替換一下:

效果如下:

代碼的部分就到這里了,接下來跟大家聊一下編譯方式,編程語言的編譯方式有兩種。

關於它們孰優孰劣,就要看從哪個角度去對比了。JIT 的話,它的一大特點就是支持動態發布代碼,也就是支持熱更新。但要是從性能的角度考慮,AOT 會更好,因為在運行的時候不用再進行編譯的操作的,運行的效率會更高一些。

回到我們一開始的時候留下的問題,為什麼別的跨平台方案都是用 JavaScript,而 Flutter 要用 Dart 來開發。JavaScript 的編譯方式是 JIT 的,它不支持 AOT。而 Dart 同時支持 JIT 和 AOT。

Flutter 在開發階段使用 JIT,讓我們用上了熱重載,增加了開發效率。在打包時改用 AOT,保證了正式版應用的性能。

最後講一下大家比較關心的一個東西,Flutter 是否支持熱更新?前面說到 Dart 支持 JIT,所以從技術層面它是支持的。但是目前是不支持的,在官方的計劃文檔中,可以看到:

至於原因,官方在這里進行了說明。總的來說,是由於政策的限制,以及出於對性能和安全性的考慮,暫時不支持了。

到這就結束啦。由於想把 Flutter 基礎在一篇內講完,沒有涉及太多細節,如果要寫 Flutter 代碼還需要深入學習。但相信理解之後再學,會輕松很多。

❿ 九、Flutter之webview

Flutter的webview常用的第三方庫有 flutter_webview_plugin 、 webview_flutter ,後者的文檔較少,暫先學習flutter_webview_plugin。

添加依賴

導入包

iOS端info.plist配置,其中NSAppTransportSecurity節點是為了支持http協議

一個簡單的demo

要監聽鏈接跳轉的話,實現onUrlChanged即可

添加依賴

導入包

iOS端info.plist配置

一個簡單的demo

但是在webview里點擊鏈接跳轉的時候,測試機有時會跳轉到系統瀏覽器上,並且點擊文本框無法彈出鍵盤,交互性很弱。

二者共同的缺點是與javascript難以交互,目前只能實現Flutter->JS傳遞信息,還沒找到可以進行完美交互的第三方庫。並且一些常見的協議還不支持,比如撥號和調用攝像頭等,期待後續完善。