Flutter 不一樣的跨平臺解決方案

来源:https://www.cnblogs.com/holy-loki/archive/2018/10/01/9735010.html
-Advertisement-
Play Games

本文主要介紹Flutter相關的東西,包括Fuchsia、Dart、Flutter特性、安裝以及整體架構等內容。 ...


本文主要介紹Flutter相關的東西,包括Fuchsia、Dart、Flutter特性、安裝以及整體架構等內容。

1. 簡介

Flutter作為谷歌最近推出的跨平臺開發框架,一經推出便吸引了不少註意。關於Flutter,目前我們知道它是一個跨平臺開發框架。但是它本身並不止於此,例如Fuchsia、Dart等,我們也都需要去瞭解。

1.1 Fuchsia

說到Flutter,絕對繞不開Fuchsia,這個是谷歌開發的一款全新的操作系統,GitHub地址以及Google source主頁。Fuchsia內核是Magenta Kernel,一個基於LittleKernel的項目。該系統與Android相比,無論是存儲器還是記憶體之類的硬體要求都大幅降低,外界推論是一款面向物聯網的系統。筆者倒是沒有查到谷歌開發這款操作系統的目的,如果有知曉的,也煩請告知。

就像很多博客主說的那樣,如果只是取代Android,那無疑是一種很不好的做法。任何技術的推動,都得靠背後的商業驅動,尤其是這種涉及到手機廠商利益的技術。

1.2 Flutter

Flutter是Fuchsia的開發框架,是一套移動UI框架,可以快速在iOS、Android以及Fuchsia上構建高質量的原生用戶界面。 目前Flutter是完全免費、開源的,GitHub地址。其官方編程語言為Dart,也是一門全新的語言。所以說,上手成本比較高,對於移動端開發人員,語言以及框架都是全新的,整個技術棧的積累也都得從頭開始。

可以看下其官方介紹的特性:

  • 快速開發:Flutter的熱重載可以快速地進行測試、構建UI、添加功能並更快地修複錯誤。
  • 富有表現力,漂亮的用戶界面:自帶的Material Design和Cupertino(iOS風格)widget、豐富的motion API、平滑而自然的滑動效果。
  • 響應式框架:使用Flutter的現代、響應式框架,和一系列基礎widget,輕鬆構建您的用戶界面。
  • 訪問本地功能和SDK:Flutter可以復用現有的Java、Swift或ObjC代碼,訪問iOS和Android上的原生系統功能和系統SDK。
  • 統一的應用開發體驗:Flutter擁有豐富的工具和庫,可以幫助開發者輕鬆地同時在iOS和Android系統中實現想法和創意。
  • 原生性能:Flutter包含了許多核心的widget,如滾動、導航、圖標和字體等,這些都可以在iOS和Android上達到原生應用一樣的性能。

其實從官方特性來看,唯一有點吸引力的就是統一的應用開發體驗。一套代碼運行在多個平臺,做到真正的跨平臺。像熱載入,目前Android開發本身就支持了,響應式框架以及訪問本地功能和SDK,對於Native來說,本身並沒有多大的吸引。至於漂亮的用戶界面,國內的商業項目,哪一個會去按照Material Design去設計。

跨平臺本身,往往意味著性能受損,通用性解決不了的問題,又得回到Native去實現。所以這些因素也是跨平臺從移動端誕生之初就開始提,到現在也沒有被很好解決的一個原因。至於谷歌能夠做到什麼程度,或者說開發者該保持什麼期許,我覺得都不好說,或許谷歌解決了一個多年的難題,或者又像被谷歌放棄掉的其他項目一樣。拋開商業層面,對於技術人員,我們更多的是應該去關註它的思想,谷歌是如何去解決這些實際存在很久的問題的,至於技術本身的發展,這個是個人開發者無法去左右的,技術的更迭,保持一種學習的狀態,然後努力鍛煉身體,就能夠保證不被淘汰掉。

1.3 Dart

Dart是谷歌開發的電腦編程語言,於2011年10月份發佈,可以被用於web、伺服器、移動端和物聯網等領域的開發。Flutter採用Dart,原因很多,拋開商業層面的Java版權問題,單純從技術層面:

  • Dart是AOT(Ahead Of Time)編譯的,編譯成快速、可預測的本地代碼,使Flutter幾乎都可以使用Dart編寫;
  • Dart也可以JIT(Just In Time)編譯,開發周期快;
  • Dart可以更輕鬆地創建以60fps運行的流暢動畫和轉場;
  • Dart使Flutter不需要單獨的聲明式佈局語言;
  • Dart容易學習,具有靜態和動態語言用戶都熟悉的特性。

Dart最初設計是為了取代JavaScript成為web開發的首選語言,最後的結果可想而知,到Dart 2的發佈,專註於改善構建客戶端應用程式的體驗,可以看出定位的轉變。用過Java、Kotlin的人,可以很快的上手Dart。

一門語言的成敗,拋開背後的商業推動,我想很重要的一點在於其生態,生態的好壞,主要包括開發者以及第三方庫的數目,目前看,Dart的生態還是比較差。對於個人開發者,可以根據心情來選擇,但是對於商業應用,有更複雜的考量標準。Dart背後有谷歌的推動,能發展到什麼程度,還得看其商業運作能力了。

2. 配置

此部分針對Mac平臺,Windows平臺的安裝配置Linux平臺的安裝配置。由於筆者主要做移動端開發,如果想使用Flutter進行iOS和Android全平臺的開發,環境也建議是Mac平臺,畢竟iOS只能在Mac下進行模擬調試。

2.1 安裝Flutter

git clone -b beta https://github.com/flutter/flutter.git
export PUB_HOSTED_URL=https://pub.flutter-io.cn //國內用戶需要設置
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn //國內用戶需要設置
export PATH=`pwd`/flutter/bin:$PATH

2.2 iOS設置

brew update
brew install --HEAD libimobiledevice
brew install ideviceinstaller ios-deploy cocoapods
pod setup

2.3 Android設置

下載Android Studio,安裝Flutter插件,會將Dart插件也一起安裝。

2.4 體驗Flutter

IDE建議選擇Android Studio,安裝了Flutter插件後,Flutter的開發跟Android
開發類似,附帶三種模版工程、斷點調試等。

在Android Studio裡面新建一個Flutter Application的項目,選擇模擬器或者直接連接真機運行,就可以看到一個簡單的Flutter應用了,可以在Android和iOS不同平臺下看看差異。

3. Flutter架構

Flutter是一款移動應用程式SDK,一份代碼可以同時生成iOS和Android兩個高性能、高保真的應用程式。

Flutter不同平臺表現

Flutter對於移動開發人員,最誘惑的能力是其完全的跨平臺特性,不同於RN這種一處學到處寫,它是一處寫到出跑,但是他跟其他的跨平臺有何區別呢?

3.1 跨平臺解決方案

市面上的跨平臺解決方案,可以大致歸結為兩類:

  • 使用平臺支持的web技術:這些解決方案基本上載入了應用程式中的移動瀏覽器,併在該瀏覽器中執行所有的邏輯,例如PhoneGap。
  • 本地跨平臺:程式員編寫的代碼自動轉換為Native代碼,這種方式的優點是近乎原生的性能,例如RN、Weex、Xamarin等。

這些方案是否真正的解決了跨平臺問題呢?從目前的狀況來看,很顯然是沒有的,因為它們都始終逃不開性能、包大小、流暢性、記憶體、平臺特性等問題。

2017年8月跨平臺性能測試

RN單獨擰出來說,是因為它們並不是追求的一次寫到處跑,FB自己也知道不現實,所以把口號改成一次學到處寫,去考慮平臺的特性,去考慮這個被跨平臺方案經常忽略的問題。但是RN也並沒有被廣泛的接納,從阿裡開始使用到放棄,裡面的很多坑都繞不過去。寫一次到處跑確實很誘人,從企業角度講,可以節省大量的人力,但是卻忽略了一個很基礎的問題,不同平臺是否希望如此,蘋果是否會願意自己的生態被打破,不同平臺的特性是否應該被歸為一致。

3.2 Flutter的跨平臺解決方案

上面簡單說了傳統跨平臺解決方案,我們再回過頭看看Flutter的解決方案,Flutter跨平臺最核心的部分,是它的高性能渲染引擎(Flutter Engine)。Flutter不使用瀏覽器技術,也不使用Native的原生控制項,它使用自己的渲染引擎來繪製widget。

說到widget,就要說一句Flutter的一切皆為widget理念。widget是Flutter應用程式用戶界面的基本構建塊。每個widget都是用戶界面一部分的不可變聲明。與其他將視圖、控制器、佈局和其他屬性分離的框架不同,Flutter具有一致的統一對象模型:widget。在更新widget的時候,框架能夠更加的高效。

對於Android平臺,Flutter引擎的C/C++代碼是由NDK編譯,在iOS平臺,則是由LLVM編譯,兩個平臺的Dart代碼都是AOT編譯為本地代碼,Flutter應用程式使用本機指令集運行。

Flutter正是是通過使用相同的渲染器、框架和一組widget,來同時構建iOS和Android應用,而無需維護兩套獨立的代碼庫。

Flutter

Flutter將UI組件和渲染器從平臺移動到應用程式中,這使得它們可以自定義和可擴展。Flutter唯一要求系統提供的是canvas,以便定製的UI組件可以出現在設備的屏幕上。

3.3 Flutter框架

Flutter框架是一個分層的結構,每個層都建立在前一層之上。

Flutter 框架

框架沒什麼可介紹的(主要是詳細介紹我也沒找到啥資料,大寫的尷尬),看著很簡單,就分為兩個部分,Framework和Engine部分,其中Framework提供了各種基礎的組件庫,Engine部分渲染各種widget,兩者共同作用,使得運行性能高效穩定。

4. Flutter調研

4.1 生態

在Flutter官方的Pub平臺上,純Flutter Package大概有兩千多個,基本上常見的庫還是都有的,例如網路、圖片、音視頻播放等等。但是對於目前Android以及iOS的生態,還是遠遠的不足的,對於一些複雜的UI或者一些不是特別通用的功能,就得自己去實現。

4.2 包大小

根據官網的介紹,一個最小的Android版本的Flutter應用。release版本大小約6.7MB,其中核心引擎大約3.3MB,框架+應用程式代碼大約是1.25MB,LICENSE文件(包含在app.flx中)是55k,必需的Java代碼.dex為40k,並且約有2.1MB的ICU數據。考慮到目前網路環境,包大小的增加,還也在可以接受的範圍。

4.3 Crash

iOS運行官方的例子,會有時候crash掉,因此我們將一個開源的Flutter應用,添加了Bugly上報,在Android平臺進行了眾測。

眾測人次及啟動次數

參與人次大概150人左右,啟動次數大概500次左右,沒有出現一次Crash數據上報,由於app很簡單,並不能說明很多問題,但是眾測用戶反饋了約12條信息,其中1條是類似於ANR,無法操作,其餘的部分則是卡頓相關的反饋。

4.4 流暢性

將官方的例子發給測試同學,讓在iOS以及Android平臺的不同機子上運行了下。在iOS上基本上流暢運行,沒有出現卡頓的現象,在Android部分設備上,出現了卡頓的現象。

Android流暢性評測

iOS流暢性評測

由於沒有複雜的例子,其實這個流暢性的測試,意義不是特別大,官方簡單的控制項展示demo程式,本身就很簡單,但是在Android上還是出現了不少問題,只能說明整體還有非常大的優化空間。

4.5 編寫複雜程度

試著照著一張設計稿進行了簡單的純佈局代碼工作,初次接觸用起來還是比較複雜,尤其是那恐怖的嵌套層級,對代碼維護來說絕對是個問題,而且由於Flutter的widget機制,很多組件只支持最基本的操作,例如一些擴展的屬性,都得自己去實現,況且現在組件庫還不是非常的豐富。代碼量也比較多,整個代碼大概有500行左右,還只是不涉及到一些交互以及數據綁定等。

iOS和Android運行對比

從運行效果看,還是比較的不錯,兩者還原的效果都挺不錯的。

4.6 結論

如果是個人而言,我覺得可以放心大膽的去學習嘗試,如果自己開發app的話,可以寫一套代碼,在多個平臺運行發佈。

如果是商業團隊,這個就要自行取捨,目前而言,Flutter生態還是非常的不完善,相關的資料也非常少。目前處於beta 3階段,多久能到release,能否到release,都是個未知數,而且,用Flutter,最大的風險,就是項目整體的不可把控,一旦出現一些坑,如果能填好,那還行,如果涉及到無法解決的問題,就只能放棄。因此看自己團隊人力以及時間合理安排比較合適。目前看阿裡的鹹魚團隊在研究Flutter。

如果單純從Flutter本身能夠解決的問題的方面出發,使用Flutter確實能夠產生一定的收益,節省開發成本,如果考慮到目前坑比較多的狀況,加上踩坑的時間,可能就無法去評估了。

總體來說,Flutter確實是一個比較不錯的東西,如果谷歌能夠把它發展的比較完善,對於個人以及小團隊來說,確實是個福音。

5. 後話

筆者建了一個Flutter學習相關的項目,Github地址,裡面包含了筆者寫的關於Flutter學習相關的一些文章,會定期更新,也會上傳一些學習Demo,歡迎大家關註。

6. 參考

  1. Flutter中文網
  2. Google 悄悄開發的全新操作系統 Fuchsia 被髮現了!
  3. 為什麼Flutter會選擇 Dart ?
  4. Flutter教程(二) 瞭解Dart語言
  5. 為什麼移動端跨平臺開發不靠譜?
  6. 為什麼說Flutter是革命性的?

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • oracle10g以上支持正則表達式的函數主要有下麵四個:1、REGEXP_LIKE :與LIKE的功能相似2、REGEXP_INSTR :與INSTR的功能相似3、REGEXP_SUBSTR :與SUBSTR的功能相似4、REGEXP_REPLACE :與REPLACE的功能相似POSIX 正則表 ...
  • 一. xtrabackup 選項說明 在操作xtrabackup備份與恢復之前,先看下該工具的選項,下麵記錄了xtrabackup二進位文件的部分命令行選項,後期把常用的選項在補上。點擊查看xtrabackup Option 指南 選項名 說明 --apply-log-only 僅在準備備份時,執行 ...
  • like 用法介紹: 1、“_”:匹配單個任意字元 select * from bqh3 where name like '_崔'; 2、“%”:匹配0個或多個任意字元。但有三種情況如下: like %關鍵字:以關鍵字開頭的記錄 like 關鍵字%:以關鍵字結尾的記錄 like %關鍵字% :包含以 ...
  • 本文介紹了熱門的NoSQL資料庫MongoDB的副本集這種分散式架構的一些概念和操作。主要內容包括: MongoDB副本集相關概念 MongoDB副本集環境搭建 MongoDB副本集的讀寫分離 MongoDB副本集的故障轉移 MongoDB副本集的優點 MongoDB副本集的缺點 1.副本集相關概念 ...
  • 本文列舉了項目開發使用Flutter會遇到的問題,以及如何使用Flutter module在現有項目中集成Flutter,並對其原理進行了分析。 ...
  • launchMode,通俗點說,就是定義了Activity應該如何被launch的。那麼這幾種模式的區別以及應用場景,會有何不同呢?谷歌是基於什麼原因設計這幾種模式的呢?這幾種模式背後的工作原理是什麼呢? ...
  • 本文主要講述了App的啟動流程、Application的生命周期以及進程的回收機制。 ...
  • 本文主要是對Android系統做一個簡介,包括其架構、啟動流程、沙箱機制、APK、Darlvik以及ART。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...