国产精品chinese,色综合天天综合精品网国产在线,成午夜免费视频在线观看,清纯女学生被强行糟蹋小说

    <td id="ojr13"><tr id="ojr13"><label id="ojr13"></label></tr></td>
        • <source id="ojr13"></source>
            <td id="ojr13"><ins id="ojr13"><label id="ojr13"></label></ins></td>

            當前位置:文章中心>技術(shù)教程
            公告通知 新聞快遞 技術(shù)教程 產(chǎn)品展示

            iBox-面向Flutter的一站式研發(fā)工作臺

            發(fā)布時間:2022-02-28 點擊數(shù):1241
            簡介: Flutter 一碼多端的特性,解放了端上同學的人力,帶來了研發(fā)效率的提升。但隨之而來的又在研發(fā)鏈路中發(fā)現(xiàn)了各種問題,例如研發(fā)環(huán)境搭建,雙端工程環(huán)境,集成發(fā)布流程繁瑣等等。為了深入了解開發(fā)同學們的痛點,作者團隊內(nèi)部發(fā)起了一份問卷調(diào)查。本文將基于問卷調(diào)查中指出的痛點,以及解決這些問題的時候面臨的一些挑戰(zhàn)進行探討。


            作者 | 蘇策
            來源 | 阿里技術(shù)公眾號

            一 前言

            Flutter 一碼多端的特性,解放了端上同學的人力,帶來了研發(fā)效率的提升,淘特技術(shù)團隊因為早期雙端研發(fā)同學數(shù)量不匹配以及對研發(fā)效率的訴求,也是阿里集團內(nèi)部比較早在業(yè)務上落地 Flutter 的團隊之一。

            雖然有了一碼多端的便利,但是伴隨而來的還有研發(fā)鏈路中的各種問題,例如研發(fā)環(huán)境搭建,雙端工程環(huán)境,集成發(fā)布流程繁瑣等等。為了深入了解開發(fā)同學們的痛點,我們在團隊內(nèi)部發(fā)起了一份問卷調(diào)查。

            我們針對研發(fā)幸福感指數(shù)以及研發(fā)鏈路中遇到的各種問題進行了調(diào)查。結(jié)果如下:

            編輯搜圖

            在研發(fā)幸福感指數(shù)的打分中平均得分是 3.38(5分制)。我們針對影響研發(fā)幸福感的問題進行了分析,篩選出了一些大家普遍認為影響研發(fā)效率的問題。其中排名最高的是研發(fā)環(huán)境+工程環(huán)境(Flutter相關)的搭建,開發(fā)調(diào)試(Flutter相關)等問題。

            接下來我們就來看看這些問題的具體痛點,以及解決這些問題的時候面臨的一些挑戰(zhàn)。

            二 問題與挑戰(zhàn)

            1 問題

            在影響研發(fā)幸福感的問題中,主要是以下三個方面的問題比較突出。

            1)研發(fā)環(huán)境問題

            研發(fā)環(huán)境配置是編碼的前置工作,它也會影響新人落地對團隊研發(fā)體驗的第一印象。由于 Flutter 涉及 Android 與 iOS 雙端的環(huán)境配置,導致不熟悉另一個端的同學配置起來,十分麻煩,上手難度高。另外,F(xiàn)lutter 本地版本不一致,缺乏 Flutter 版本管理工具,文檔零散更新不及時,這些都極大的耗費了團隊同學的精力。

            2)工程環(huán)境問題

            解決了研發(fā)環(huán)境問題,還需要解決工程環(huán)境問題,雙端工程架構(gòu)復雜,不熟悉某個端的同學面對編譯問題難以解決。甚至很多同學就直接放棄了配置另外一個端的工程,平時開發(fā)只對著自己熟悉的端調(diào)試,違背了 Flutter 雙端開發(fā)的理念。

            點評:從團隊的調(diào)研采訪來看,一個新人同學搭建 Flutter 的研發(fā)環(huán)境和工程環(huán)境,先需要一天時間搭建好基礎環(huán)境,后面的兩三天時間折騰各種編譯問題,特別是 iOS 的相關環(huán)境對于 Android 同學來說想要完整跑起來十分費力。

            3)集成流程問題

            等到代碼開發(fā)測試完成以后,集成步驟多,平臺間來回切換,集成流程割裂,沒有形成完整的 SOP。整個集成流程既費時費力,又容易引發(fā)質(zhì)量問題。

            點評:現(xiàn)有的 Flutter 模塊集成流程分為六步:1 模塊分支代碼合并 -> 2 模塊生成新Tag版本 -> 3 主工程修改模塊版本號 -> 4 主工程代碼合并 -> 5 主工程生成版本號 -> 6 摩天輪提交正式包打包,步驟繁瑣,需要在 Aone、MTL 等平臺來回切換,而且手工操作各種版本號,很容易引發(fā)線上質(zhì)量問題。

            2 挑戰(zhàn)

            為了解決這些問題,之前也有沉淀一些文檔和腳本,但是文檔有很多步驟、命令,弄錯任何一個就可能導致環(huán)境搭建出錯,另外文檔有時候也沒有及時更新。

            我們想如果能有一個桌面端 GUI 形式的研發(fā)工作臺,研發(fā)同學日常研發(fā)遇到的各種問題都可以在這上面解決,新來的同學也可以借助這個研發(fā)工作臺快速落地,那對研發(fā)的幸福感將是一個質(zhì)的提升。

            于是我們便決定打造一款桌面端的研發(fā)工作臺,在實現(xiàn)這個目標的過程中我們也遇到了很多挑戰(zhàn)。

            1)如何降低開發(fā)同學的接入和使用成本

            1. 接入和使用成本。研發(fā)工作臺本來作為一款工具軟件,它本身如果再操作復雜,需要看各種文檔,那就背離了工具軟件簡單易用的初衷,所以復雜操作一鍵化是做相關功能時必須做到的,例如軟件環(huán)境一鍵配置,工程環(huán)境一鍵配置,一鍵集成發(fā)布等,很多功能都是按照這個思路來做的。

            2. 兼容現(xiàn)有的研發(fā)環(huán)境和工程環(huán)境。除了新來的同學,大部分開發(fā)同學的電腦上已經(jīng)有了部分環(huán)境,如何與現(xiàn)有的環(huán)境共存,不改變開發(fā)同學現(xiàn)有的使用習慣,也是我們重點考慮的問題。

            2)如何保障架構(gòu)設計的合理性

            我們想把研發(fā)工作臺打造成一個人人都可以參與進來共建的開放平臺,因為個人的時間是有限的,工作臺本身作為一個工具集的聚合,需要更多的同學參與進來,更多的 idea 落地,所以如何做好倉庫權(quán)限控制以及設計一個好的插件化框架就顯得很重要。

            3)新技術(shù)的落地,相關問題需要自己探索解決。

            在桌面端研發(fā)工作臺的開發(fā)中,我們使用的是 Flutter Desktop 技術(shù)(至于原因,技術(shù)調(diào)研部分會講),國內(nèi)目前 Flutter Desktop 技術(shù)在生產(chǎn)環(huán)境落地的并不多,相關經(jīng)驗還比較缺乏,遇到一些問題的時候,需要自己去探索解決。

            接下來我們就來看一看我們?yōu)榱私鉀Q這些問題,在 iBox 上設計了哪些核心的功能,以及這些功能是如何解決這些問題的。

            三 技術(shù)全景

            1 技術(shù)調(diào)研

            業(yè)界的客戶端研發(fā)工作臺的發(fā)展現(xiàn)狀。如下所示:

            • 業(yè)界:EasyBox,MBox 等工具。這些工具的核心一方面在于解決 Native 環(huán)境搭建,開發(fā)效率低的問題。另一方面深度封裝 Git、Cocoapods,統(tǒng)一開發(fā)模式。

            • 淘特:也有一些零散的腳本工具。但是整體上沒有解決研發(fā)環(huán)境配置,開發(fā)調(diào)試,集成發(fā)布等問題。

            整體上看是一個客戶端研發(fā)工作臺落地的契機,業(yè)界有團隊在嘗試,淘特在 Flutter 研發(fā)鏈路也有痛點和需求。既然要進行桌面端開發(fā),選擇一個桌面端開發(fā)框架就成了首先要考慮的事情,當下比較流行的桌面端開發(fā)框架主要有以下兩種:

            • 面向前端的 Electron:使用 JavaScript、HTML 和 CSS 構(gòu)建桌面端應用程序。

            • 面向客戶端的 Flutter Desktop:使用 Flutter 構(gòu)建桌面端應用程序。

            通常我們在做技術(shù)選型的時候會從問題解決,團隊現(xiàn)狀,技術(shù)領域,業(yè)務趨勢等幾個方面層層遞進去思考。

            • 問題解決:Electron 和 Flutter Desktop 這兩套方案都能解決我們的問題,雖然性能上有差異,但是這個不是我們最關注的點。

            • 團隊現(xiàn)狀:客戶端同學對 Flutter 熟悉,客戶端同學的上手成本更低,不依賴其他端的人力。從這個角度來看,F(xiàn)lutter Desktop 會更好。

            • 技術(shù)領域:Electron 和 Flutter Desktop 都在向前發(fā)展,F(xiàn)lutter 團隊今年推出的 Flutter 2.10 將 Windows 平臺正式帶入穩(wěn)定版本的支持,今年也會陸續(xù)完成 Linux、MacOS 等平臺的穩(wěn)定版本的支持。

            • 業(yè)務趨勢:工作臺未來可能會向全平臺擴展。例如在桌面端是一個研發(fā)工作臺,在移動端(Android&iOS)iBox 是一個應用小工具集或者是一個類似于螞蟻伙伴的app,在 Web 端是一個數(shù)據(jù)看板。從這個角度講,F(xiàn)lutter Desktop 會更好。另外我們還想在工作臺上做 UI 等組件的展示,如果基于 Flutter 來做,那么就能做到所見即所得,這會是一個非常好的體驗,

            基于以上思考,我們最終選擇了 Flutter Desktop。有了開發(fā)框架,我們接著來看看 iBox 的架構(gòu)設計。

            2 功能設計

            iBox 的核心定位

            編輯搜圖

            iBox 是一款基于 Flutter Desktop 技術(shù)棧研發(fā)的一站式、多樣化、可定制的研發(fā)工作臺。提供從研發(fā)環(huán)境到集成發(fā)布全流程的研發(fā)支持。核心功能包含工作臺、研發(fā)環(huán)境、工程管理、引擎管理、社區(qū)生態(tài)、變更單管理與工具箱等。

            iBox 在功能設計上分為工作臺、研發(fā)、發(fā)布、工具箱四大板塊。其中研發(fā)、發(fā)布、工具箱又各自包含了很多子模塊功能。

            我們著重介紹一下工作臺、研發(fā)環(huán)境與工程管理、社區(qū)生態(tài)、變更單管理等核心功能,讓大家對 iBox 的整體功能有一個基本認識。

            工作臺

            提供了最近變更單,常用平臺快捷入口等功能,讓常用功能一鍵直達。另外工作臺還預留了技術(shù)展示 Banner 位的功能,可以展示一些團隊內(nèi)外的優(yōu)秀技術(shù)產(chǎn)出。后續(xù)還考慮將值班提醒,集成提醒,發(fā)布提醒做在工作臺上。

            編輯搜圖

            研發(fā)環(huán)境與工程管理

            研發(fā)環(huán)境 + 工程管理 解決的是如何快速進入本地開發(fā)的問題,如果是新人進入團隊開發(fā),從拿到電腦到進入開發(fā),一般需要經(jīng)歷研發(fā)環(huán)境配置和工程環(huán)境配置這兩個流程。

            在這個過程中需要去各個地方翻閱文檔,按照文檔進行操作,在操作的過程中,還經(jīng)常伴隨著文檔更新不及時,操作報錯,出了錯誤又得去 Google 或者問身邊的同事,整個過程費時又費力。

            而 iBox 的研發(fā)環(huán)境和工程管理者兩個功能模塊則通過操作一鍵化來解決上述的問題。

            首先是研發(fā)環(huán)境提供了 Flutter、Android、iOS 研發(fā)環(huán)境的檢查和一鍵配置的功能,讓不熟悉某個端的同學更加便捷的配置自己的研發(fā)環(huán)境,如下所示:

            編輯搜圖

            然后是工程管理提供了混合工程下 Flutter、Android、iOS 等殼工程環(huán)境環(huán)境檢測,一鍵環(huán)境配置等功能,解決了環(huán)境配置復雜難以上手的問題,如下所示:

            編輯搜圖

            工程環(huán)境的復雜性在于它涉及 Flutter、Android、iOS 三個端的編譯,編譯的過程還會因為本地環(huán)境的差異而有所不同,各種編譯報錯,使得開發(fā)同學窮于應付。iBox 將從環(huán)境到工程的各種錯誤類型進行了梳理,并將錯誤信息展示出來,如下所示:

            編輯搜圖

            不僅讓開發(fā)同學知道自己的工程環(huán)境有什么問題,還提供了對工程環(huán)境問題的一鍵修復,一鍵修復功能會先刪除緩存(flutter clean,刪除lock文件等),然后按照以下流程重新跑整個工程,確??梢孕迯凸こ汰h(huán)境,如下所示:

            編輯搜圖

            研發(fā)環(huán)境和工程管理這兩個功能模塊相互配合,真正解決了開發(fā)同學環(huán)境配置難的問題,同時它還打破了 Android 與 iOS 之間的門檻,讓不熟悉另外一個端的同學也能進行這個端的調(diào)試和打包。

            社區(qū)生態(tài)

            集團內(nèi)外針對 Flutter 都貢獻了不少功能組件,但是并沒有一個統(tǒng)一的地方展示這些組件,導致開發(fā)同學在需要用的時候,需要去 pub 庫里各種搜索。

            而 iBox 的社區(qū)生態(tài)功能提供了 Flutter 社區(qū)(集團內(nèi)外)引擎、UI 組件、路由、動態(tài)化等各個方面的技術(shù)沉淀的展示,特別是 UI 組件,由于 iBox 本身就是基于 Flutter 開發(fā)的,那么這些 UI 組件的 Dart 代碼可以直接在 iBox 上運行展示和交互,這種所見即所得的體驗是非常棒的,如下所示:

            編輯搜圖

            變更單管理

            在以前的開發(fā)流程中,F(xiàn)lutter 的研發(fā)流程是比較繁瑣的,而且這些流程需要開發(fā)自己手工操作,如下所示:

            • 開始開發(fā)

              • 創(chuàng)建Android摩天輪變更單

              • 創(chuàng)建iOS摩天輪變更單

              • 拉取變更分支

              • 修改Flutter主工程的模塊依賴代碼

              • 關聯(lián)Aone需求

            • 開發(fā)中

              • Android打包

              • iOS打包

              • 提交模塊代碼CR

              • 本地源碼依賴修改

            • 完成開發(fā)

              • 模塊分支代碼合并

              • 模塊生成新Tag版本

              • 主工程修改模塊版本號

              • 主工程代碼合并

              • 主工程生成版本號

              • 摩天輪提交正式包打包

            而 iBox 的變更單功能,可以幫助 Flutter 研發(fā)同學快捷的完成研發(fā)流程的各種操作,如下所示:

            編輯搜圖

            • 開始開發(fā):iBox 可以關聯(lián) Aone 需求一鍵創(chuàng)建變更單,同時創(chuàng)建新的變更分支,準備好當前變更所需的工程環(huán)境。

            • 開發(fā)中:一鍵打 Android & iOS 雙端包,一鍵提交變更倉庫的 CR。

            • 完成開發(fā):一鍵提交集成,提交的過程中會自動完成上述的集成步驟。

            這些一鍵式的操作不僅很好的提升了 Flutter 研發(fā)的效率,也規(guī)范了Flutter 的分支管理、集成方式,避免個人隨意操作帶來的工程問題。

            以上便是 iBox 一期規(guī)劃和完成的功能,它從根本上解決了上面提到的團隊研發(fā)鏈路存在的種種問題,同時也感謝閑魚同學在集成發(fā)布這塊為我們提供的飛魚工作臺相關實踐參考。

            3 架構(gòu)設計

            iBox 在架構(gòu)設計上主要關注以下幾個問題:

            • 問題1:iBox 作為一款具備一定規(guī)模的 GUI 軟件,如何方便且安全的組織各個功能模塊的代碼。

            • 問題2:iBox 既然要面向共建,如何保證 iBox 自身的開發(fā)體驗。

            • 問題3:iBox 如何在保證共建開放的同時保證軟件整體的質(zhì)量和性能。

            通過對以上幾個問題的思考,我們對 iBox 采取了縱向分層,橫向模塊化的設計,具體說來:

            • 問題1:不同的功能進行模塊化設計,模塊源碼彼此獨立。這樣可以精細控制源碼倉庫的權(quán)限,不同模塊之間的修改不會相互影響。

            • 問題2:基于 git repo 進行多倉庫管理。既可以使用 git 操作單個的倉庫,也可以使用 git repo 對多個倉庫進行代碼同步,代碼提交,代碼 Review 等操作,保障了 iBox 多倉庫協(xié)同的開發(fā)體驗。

            • 問題3:

              • 約定每個模塊的基本架構(gòu)設計。包括源碼組織方式、狀態(tài)管理方案等方面內(nèi)容,并通過靜態(tài)掃描來保障這些約定的落地。

              • 限制三方庫的引用以及指定三方庫的版本(不使用^號來指定版本,例如:url_launcher: ^6.0.20)。^號指定的版本會導致后兩位版本會自動升級(flutter upgrade 和 重新生成 pubspec.lock 文件的時候),導致打包的時候使用了一些意料之外的版本,引發(fā)質(zhì)量問題(參考最近的 url_launcher 的 url_launcher_macos 自動升級導致鏈接打不開的問題 issue1 issue2 )。

            整體架構(gòu)大圖如下所示:

            編輯搜圖

            從上面的架構(gòu)圖可以看出輔助功能作為基礎模塊,為其他核心功能提供基礎能力。接下來我們按照從工程到模塊的順序分別講一下具體的設計方案:

            • 首先是整體工程的設計。

            • 然后是具體模塊的設計。

            工程結(jié)構(gòu)

            在整體工程上采用多倉庫設計,之所以使用這樣的設計,是因為 iBox 會涉及跨團隊開發(fā),多倉庫可以讓各個模塊的源碼彼此獨立,不同模塊之間不會相互干擾。

            iBox 基于 git-repo 實現(xiàn)了多倉庫的管理,倉庫結(jié)構(gòu)如下所示:

            編輯搜圖

            ibox 作為主工程,ibox_common 作為基礎模塊,其他模塊都依賴于 ibox_common。開發(fā) iBox 的同學只需要幾行簡單的命令,就可以同步 iBox 的全部源碼工程。

            然后在自己的模塊進行開發(fā)和代碼提交即可,彼此之間互不干擾。聊完了整體工程的設計,我們再來看看各個模塊的設計。

            模塊設計

            每個模塊的核心功能在于處理UI交互與邏輯交互,不同于傳統(tǒng)客戶端的命令式 UI 框架,F(xiàn)lutter 采用的是聲明式 UI 框架,驅(qū)動 UI 發(fā)生變化的是狀態(tài)(State),如下所示:

            編輯搜圖


            圖片引用自 Start thinking declaratively


            Flutter 里的狀態(tài)指的是在 Widget 之間或者內(nèi)部存儲和傳遞的數(shù)據(jù)或者信息,它可以分為短時狀態(tài)和應用狀態(tài)兩種。

            • 短時狀態(tài)(exphmeral state):也稱為用戶UI狀態(tài)或者局部狀態(tài),是一個完全獨立在 Widget 里的狀態(tài)。Widget 樹里的其他部分不需要訪問這種狀態(tài),它也不需要使用狀態(tài)架構(gòu)架構(gòu)(ScopedModel,Redux)去管理這種狀態(tài),它只需要一個 StatefulWidget 就可以了。

            • 應用狀態(tài)(app state):它是一個應用之間多個部分共享的一個非短時狀態(tài),并且用戶在會話期間,保留這個狀態(tài)。

            所以狀態(tài)管理是編寫 UI 和邏輯核心要面對的問題,它也會影響我們組織源碼的方式,在 Flutter 狀態(tài)管理的官方文檔中,提供了 14 種狀態(tài)管理方案,我們著重討論官方比較推薦的前四種,至于其他的方案,感興趣的可以去查閱官方文檔。

            • setState

            • InheritedWidget

            • Provider

            • Riverpod

            我們先來看原生的兩種狀態(tài)管理方式:

            • setState:通常用于處理 Widget 內(nèi)部的短時狀態(tài)。

            • InheritedWidget:setState 只能處理 Widget 內(nèi)部的短時狀態(tài),如果需要處理應用狀態(tài),在 Widget 樹之間進行通信,則需要用到 InheritedWidget,InheritedWidget 可以為其子孫節(jié)點提供數(shù)據(jù)和服務。

            setState 在應用場景上比較受限,InheritedWidget 對于開發(fā)者來說過于底層,使用起來比較復雜。既然官方的方案都有限制,我們再來看看社區(qū)提供的提供的比較推薦的方案。

            • Provider:它對 InheritedWidget 組件進行了封裝,使其更加易用,更易復用。

            • Riverpod:基于 Provider 改進而來,它是一個響應式的狀態(tài)管理和依賴注入框架,編譯安全,支持 DevTools 調(diào)試,本身不依賴于 Flutter。

            事實上,Provider 和 Riverpod 的作者都是 Remi Rousselet,Riverpod 這個名字是 Provider 的字母重新排序后得到的,它的推出主要是為了解決 Provider 的一些功能缺陷,如下所示:

            編輯搜圖

            基于以上的比較,我們最終選擇了 Riverpod 這一套方案,并由此設計了模塊的源碼結(jié)構(gòu),如下所示:


            編輯搜圖


            iBox 模塊源碼結(jié)構(gòu)
            |-----------------------------------------------------------
            |--- provider                             基于 Riverpod 實現(xiàn)的 State 管理方式(官方推薦)
            |----- xxx.provider.dart                  provider
            |--- service                              接口請求、數(shù)據(jù)處理相關實現(xiàn)
            |----- xxx.service.dart                   service|--- ui                                   頁面與組件
            |----- xxx.screen.dart                    頁面
            

            一個常見的編寫 UI 邏輯的流程如下所示:

            1. 在 ui 部分編寫頁面和組件。

            2. 在 service 里編寫和數(shù)據(jù)相關的邏輯。

            3. 在 provider 里編寫相關 provider 類,它可以調(diào)用 service 里的功能。

            4. 在 ui 或者其他任何需要的位置引用 provider,操作相關邏輯。

            這種方式實現(xiàn)了 UI 與邏輯的解耦和分離,UI 部分可以自由迭代,邏輯部分也實現(xiàn)了復用。

            以上便是 iBox 的整體架構(gòu)設計,相當于是一個簡化版的插件化方案,如何后續(xù)有更豐富的插件生態(tài)進來,我們會考慮上架一個類似于 VSCode 的插件市場,不過目前對于我們來說,已經(jīng)夠用了。

            插件化的設計使得可以自由組裝各個模塊,不同團隊需要的模塊功能不一樣,我們推出了 app variant(變體)的功能。不同的 app variant(變體)擁有不同的 tab 欄配置,打包的時候就可以針對不團的團隊打出不同功能的包。

            4 上線效果

            iBox 在研發(fā)鏈路核心痛點上使用前后對比


            編輯搜圖


            iBox 用戶在使用一段時間以后,也給了不少不錯的反饋。

            “一鍵安裝還是非常好用的,幫開發(fā)節(jié)省了不少時間。以前各個地方下載,安裝配置,還要解決版本沖突的問題,浪費不少時間。”

            “這次版本集成全走的iBox, 用著很爽?!?

            “大幅簡化了 Flutter 環(huán)境配置、集成繁瑣等問題?!?

            此外,iBox 還處在一個剛起步的階段,我們希望把它作為一款產(chǎn)品去迭代和運營。為此我們也為 iBox 設計了不同視角下的運維指標,如下所示:

            全局視角:整體數(shù)據(jù)

            • 全站 PV

            • 全站 UV

            • 覆蓋的團隊數(shù)

            • 各個團隊的用戶覆蓋率

            • 訪問量前10的用戶

            • 訪問量前10的頁面

            用戶視角:不同團隊/個人偏好的功能

            • 團隊 -> 功能模塊 訪問次數(shù)

            • 個人 -> 功能模塊 訪問次數(shù)

            業(yè)務視角:做的比較好,受歡迎的功能

            • 最熱功能模塊排名

            運維數(shù)據(jù)體系需要長期建設,它對我們后續(xù)的功能迭代和體驗優(yōu)化有著重要的指導意義,開發(fā)同學也是用戶,只憑著拍腦袋想出來的功能,不一定能獲得大家的認可。

            四 技術(shù)總結(jié)

            在做 iBox 之前,對于 Flutter 做過一些原理上的探究,之前整理編寫了《從架構(gòu)到源碼:一文了解Flutter渲染機制》一文,但是沒有好的機會應用在生產(chǎn)實踐上。這次的 iBox 開發(fā)之旅讓我收獲頗多,借著這個機會,我們就來聊一聊 Flutter Desktop 技術(shù)在生產(chǎn)實踐上的應用。

            1 Flutter Desktop 的發(fā)展歷程

            從2018年2月15日Flutter 團隊發(fā)起的 flutter-desktop-embedding 項目到現(xiàn)在,已經(jīng)四年過去了,中間的過程也是起起伏伏,從最初的不支持生產(chǎn)環(huán)境,到如今 Flutter 2.10 發(fā)布,正式宣布支持 Windows 平臺生產(chǎn)環(huán)境 app 的開發(fā),F(xiàn)lutter Desktop 的發(fā)展歷程如下所示:

            • 2018.02.15, 在 flutter-desktop-embedding 項目里提交第一個 initial commit。

            • 2019.12.05,支持了 MacOS 平臺。

            • 2020.07.08,Linux 平臺進入 alpha 階段。

            • 2020.09.24,Windows 平臺進入 alpha 階段。

            • 2021.03.05,F(xiàn)lutter 2 正式發(fā)布,F(xiàn)lutter 對桌面端的支持進入穩(wěn)定版本的前期準備階段。

            • 2022.02.15,F(xiàn)lutter 2.10 發(fā)布,Windows 平臺率先進入穩(wěn)定版本,可用于生產(chǎn)級 app 的研發(fā),其他平臺也在積極準備中。

            在 2022 年,F(xiàn)lutter 團隊計劃按照 Windows、Linux、MacOS 的順序逐個推進,將對主流桌面端平臺的支持帶入到 stable channel,最終實現(xiàn) Flutter "write once, run anywhere" 的愿景。

            2 Flutter Desktop 的社區(qū)生態(tài)

            和對 Android 和 iOS 的支持一樣,F(xiàn)lutter 也實現(xiàn)了基于 Windows 等平臺的 Embedder,Embedder 的上層是 C++ Engine 和 Dart Framework,它自己負責翻譯和發(fā)送 Windows 等平臺的消息。整體架構(gòu)如下所示:


            編輯搜圖



            圖片引用自 Announcing Flutter for Windows


            點評:Linux、MacOS 等其他桌面端平臺也是類似的實現(xiàn)結(jié)構(gòu),更深入的細節(jié)可以參見 platform 的實現(xiàn)。

            移動端應用和桌面端的應用相比既有相同之處,例如:

            • GPU 圖形加速

            • 渲染系統(tǒng)

            • 動畫

            • 主題

            • 文本輸入

            • 國際化

            • UI 組件

            這也使得大部分現(xiàn)有的 Flutter 社區(qū)組件都可以在桌面端使用,但兩者也有不同之處,例如:

            • 更大的屏幕尺寸

            • 支持鼠標/鍵盤輸入

            • 輸入法

            • 導航方式

            • 可訪問性

            • 系統(tǒng)獨有的視覺樣式

            • 與底層系統(tǒng)的交互

            基于這些不同,F(xiàn)lutter 針對桌面端平臺也提供了針對性的支持,如下所示:


            編輯搜圖



            圖片引用自 Announcing Flutter for Windows


            在 iBox 的開發(fā)過程中,我們也使用了不少原生能力,這里針對 Flutter Desktop 常用的一些社區(qū)組件做個總結(jié),如下所示:


            編輯搜圖


            現(xiàn)有的社區(qū)組件基本能滿足我們的開發(fā)需求。

            3 Flutter Desktop 的應用場景

            iBox 是對 Flutter Desktop 技術(shù)的一次有意義的探索,它為我們的產(chǎn)品帶來了更多的可能性,擴展了產(chǎn)品觸達的邊界。

            那么,F(xiàn)lutter Desktop 適合哪些應用場景呢?

            • 企業(yè)內(nèi)部使用的工具類軟件,尤其是在團隊人員不足的時候,想快速落地一些工具和功能。

            • 企業(yè)的ToB應用,例如收銀臺,餓了么商家端等。

            • 團隊自身已經(jīng)有基于 Flutter 開發(fā)的移動端應用,想把部分功能擴展到桌面端。

            任何技術(shù)都有長短,F(xiàn)lutter Desktop 也有不適合的應用場景,如下所示:

            • 對桌面端原生能力依賴較大的應用,因為針對桌面端的社區(qū)生態(tài)支持還還不如移動端這么完善,遇到缺乏的能力,需要自己去從零開始搭建。

            當然技術(shù)也是不斷發(fā)展的,當前存在的問題,也許在將來就被解決了。筆者對 Flutter Desktop 技術(shù)的發(fā)展還是很有信心的。

            五 結(jié)語

            Flutter 一份代碼,在兼顧性能的同時上可以多端運行,是它的優(yōu)勢所在,解放了端上的生產(chǎn)力。尤其是對于 iOS 和 Android 同學比例嚴重失調(diào)的團隊來說,這無疑是一個福音。

            但是如果不注重 Flutter 開發(fā)周邊配套工具的建設,從最開始的環(huán)境搭建、開發(fā)調(diào)試、再到集成發(fā)布沒有好的工具去支撐,就很容易就演變成了 “Flutter 從入門到放棄”。這是因為業(yè)務團隊和技術(shù)團隊的訴求是不一樣的,技術(shù)團隊覺得解決 Flutter 各種問題的過程就是一個學習的過程,但是業(yè)務團隊業(yè)務壓力大,他們的第一訴求是快速開發(fā),快速上線,如果周邊配套工具缺失,他們很有可能就會選擇放棄這個方案,這對于 Flutter 的推廣是十分不利的。

            我們希望剛接觸 Flutter 的開發(fā)同學,他們的使用體驗是平滑的,能一鍵完成的就一鍵完成,例如我們提出的“一小時完成 Flutter 環(huán)境搭建”、“一鍵配置/修復工程環(huán)境” 等等,這些理念也與 Flutter 團隊最近發(fā)布的年度規(guī)劃中的“提升開發(fā)者體驗”不謀而合。

            今年 2月10號,F(xiàn)lutter 團隊發(fā)布了他們 2022 年的年度戰(zhàn)略(Flutter 2022 Strategy)和路線 (Flutter 2022 Roadmap)。如下所示:


            編輯搜圖


            可以看到未來一年,F(xiàn)lutter 團隊將開發(fā)者體驗提到了非常重要的位置,他們將從 Flutter 的各個層面去改善開發(fā)者體驗,例如:

            • 提升 DevTools 的易用性。

            • 讓 API 的使用體驗更加平滑,逐步棄用和刪除舊的 API。

            • 修復 Hot Reload 有些時候不生效的問題。

            • 讓入門 Flutter 體驗更加平滑,降低入門門檻。

            上述提到的一些理念,例如 “讓入門 Flutter 體驗更加平滑,降低入門門檻”,和我們做 iBox 的初衷不謀而合。另外在 iBox 后續(xù)的規(guī)劃中,我們除了降低開發(fā)同學的 Flutter 入門門檻,還希望降低新團隊接入 Flutter 的成本。

            現(xiàn)有的 Flutter 接入方案以混合工程方案 add Flutter to existing app 為主,這套官方提供的方案有著不小的接入、重構(gòu)以及維護的成本,而且這是一個重復踩坑的過程,很多相同的問題會被不同的團隊再次遇到,如果 iBox 可以提供一鍵接入的方案,那么將大大降低 Flutter 的接入和填坑成本,助力 Flutter 的推廣。

            Flutter 團隊在年度戰(zhàn)略(Flutter 2022 Strategy)中提到 “以用戶(指 Flutter 開發(fā)者)為中心,其他一切都會隨之而來”。

            We believe in "focus on the user and all else will follow". This manifests in our emphasis on developer experience. 引用自 Flutter 2022 Strategy

            相信在新的一年,F(xiàn)lutter 的研發(fā)體驗會越來越好,iBox 也能為 Flutter 的推廣盡一份綿薄之力。


            ALL in one:如何搭建端到端可觀測體系