Jetpack Compose,不止是一個UI框架!



Jetpack Compose是用於構建原生Android UI的現代工具包。 Jetpack Compose使用更少的代碼,強大的工具和直觀的Kotlin API,簡化並加速了Android上的UI開發。這是Android Developers 官網對它的描述。

本文不是教你Jetpack Compose 的一些基本使用方法,而是爲啥我們需要Jetpack Compose 的一些簡潔,讓我們對Jetpack Compose 有更深層次的瞭解。如果你想看Jetpack Compose 的快速上手和基本使用,請看我前面的文章Android Jetpack Compose 最全上手指南

1. 爲什麼我們需要一個新的UI 工具?

在Android中,UI工具包的歷史可追溯到至少10年前。自那時以來,情況發生了很大變化,例如我們使用的設備,用戶的期望,以及開發人員對他們所使用的開發工具和語言的期望。

以上只是我們需要新UI工具的一個原因,另外一個重要的原因是View.java這個類實在是太大了,有太多的代碼,它大到你甚至無法在Githubs上查看該文件,因爲它實際上包含了30000行代碼,這很瘋狂,而我們所使用的幾乎每一個Android UI 組件都需要繼承於View。

GogleAndroid團隊的Anna-Chiara表示,他們對已經實現的一些API感到遺憾,因爲他們也無法在不破壞功能的情況下收回、修復或擴展這些API,因此現在是一個嶄新起點的好時機。

這就是爲什麼Jetpack Compose 讓我們看到了曙光。

2. Jetpack Compose的着重點

包括一下幾個方面:

    1. 加速開發
    1. 強大的UI工具
    1. 直觀的Kotlin API
2.1 加速開發

如果你是一個初級開發工程師,你總是希望有更多的時間來寫業務邏輯,而不是花時間在一些如:動畫、顏色變化等事情上,看看下面這個View:

這個Material Edit-text 似乎看起來很簡單,但是其實背後有許多東西需要關注,比如:動畫、顏色改變、狀態管理等等。

而Jetpack Compose 爲我們提供了很多開箱即用的Material 組件,如果的APP是使用的material設計的話,那麼使用Jetpack Compose 能讓你節省不少精力。

2.2 強大的UI工具

沒有正確工具的UI工具包是無用的,因此從過去10年的經驗中能學到不少,Jetpack Compose 團隊開始和JetBrains 合作,以提供開發者強大的工具包,在Android Studio 上大規模的支持Compose 能力。

看一看在Android Studio上的表現:‘

上圖是使用Jetpack Compose 開發UI時,在Android Studio 上的預覽,你可以看到,在左邊編碼時,右邊你能同時展現UI即時預覽,比如在明/暗模式下的狀態切換,都能在右邊及時展示出來。

它與我們現在使用的Android Studio 中的text/Design相似,但是它更加先進,使用很簡單,這個功能只能在Android Studio4.0以上預覽版,開發compose 時使用。

2.3 直觀的Kotlin API

對於開發者而言,Jetpack Compose 的用途不僅僅是Android UI,因此用Kotlin來編寫他們並開源。當然,所有Android代碼都是開源的,但特別強調的是Compose代碼,它每天在這裏更新(https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/ui
)。因此,您可以查看和使用代碼,同時也可以在此處提供反饋。

由於Compose仍在開發之中,因此每個開發人員的反饋都很重要。

3. API 設計

十多年來,Android團隊在創建API和審查API方面擁有豐富的經驗,但有一個收穫-他們使用Java作爲編程語言。但有一個問題-他們使用的是Java作爲開發語言。

Jetpack Compose是第一個使用Kotlin正在開發中的大型項目,因此Android團隊正在探索Kotlin API指南的新世界,以創建一組特定於Compose API的指南,該工作仍在進行中,仍然有很長的路要走。

4. Compose API 的原則

4.1 一切都是函數

正如我前面的文章所說,Compose是一個聲明式UI系統,其中,我們用一組函數來聲明UI,並且一個Compose函數可以嵌套另一個Compose函數,並以樹的結構來構造所需要的UI。

在Compose中,我們稱該樹爲UI 圖,當UI需要改變的時候會刷新此UI圖,比如Compose函數中有if語句,那麼Kotlin編譯器就需要注意了。

4.2 頂層函數(Top-level function)

在Compose的世界中,沒有類的概念,全都是函數,並且都是頂層函數,因此不會有任何繼承和層次機構問題。

@Composable
fun checkbox ( ... )

@Composable
fun TextView ( ... )

@Composable
fun Edittext ( ... )

@Composable
fun Image ( ... )

在此過程中,Compose函數始終根據接收到的輸入生成相同的UI,因此,放棄類結構不會有任何害處。從類結構構建UI過渡到頂層函數構建UI對開發者和Android 團隊都是一個巨大的轉變,頂層函數還在討論之中,還沒有發佈release 版。

4.3 組合優於繼承

Jetpack Compose首選組合而不是繼承。 Compose會基於其他部分構建UI,但不會繼承行爲。

如果你經常關注Android或者對Android有所瞭解,你就會知道,Android中的幾乎所有組件都繼承於View類(直接或間接繼承)。比如EidtText 繼承於TextView,而同時TextView又繼承於其他一些View,這樣的繼承機構最終會指向跟View即View.java。並且View.java又非常多的功能。

而Compose團隊則將整個系統從繼承轉移到了頂層函數。TextviewEditText複選框和所有UI組件都是它們自己的Compose函數,而它們構成了要創建UI的其他函數,代替了從另一個類繼承。

4.4. 信任單一來源

信任單一來源是構建整個Jetpack Compose 一項非常重要的特性。如果您習慣了現有的UI工具包,那麼您可能會知道執行點擊的工作原理。如下代碼所示:

@Override
public boolean performClick(){
  setChecked(!mChecked);
  final boolean handled = super.performClick();
  ...
}

首先,它改變view的狀態,然後執行動作,這會導致許多bug,例如複選框,因爲它首先從已選中狀態變爲未選中,反之亦然,然後由於某種原因,如果操作失敗,開發人員必須手動分配先前的狀態。

而在Compose中呢,功能正好相反。在此,複選框等功能具有兩個參數。一個是在UI中顯示狀態,另一個是lambda函數,用於觀察UI應相應更改的狀態變化。

@Composable
fun Checkbox(checked : Boolean,
            onCheckedChange : ((Boolean) -> Unit)),
            ....)

5. 深入瞭解Compose

如上圖所示,Compose在運行時分爲四個部分。讓我們一一看一下。

5.1 Core

顧名思義,這是Compose的核心,如果您不想深入學習,可以跳過它。

基本上,核心包含四個構建模塊:

  • 繪製(Draw)
  • 佈局(Layout)
  • 輸入(Input)
  • 語義(Semantics)

1、Draw — Draw 給了你訪問Canvas的能力,因此你可以繪製你要的任何自定義View

2、Layout — 通過佈局,我們可以測量事物並相應地放置視圖。

3、Input — 開發人員可以通過輸入訪問事件並執行手勢

4、Semantics — 我們可以提供有關樹的語義信息。

5.2. Foundation

Foundation的核心是收集上面提到的所有內容,並共同創建一個抽象層,以使開發人員更輕鬆調用。

5.3 Material

在這一層,所有的Material組件將會被提供,並且我們可以通過提供的這些組件來構建複雜的UI。

這是Compose團隊所做的出色工作中最精彩的部分,在這裏,所有提供的View都有Material支持,因此,使用Compose來構建APP, 默認就Material風格的,這使得開發者少了很多工作。

6. 插槽API

插槽API的出現是爲了給開發人員留出了很多空間,以便他們可以執行所需的任何自定義操作,Android團隊試圖猜測開發人員可能會想到的許多自定義設置,但他們無法一直想象開發人員的想法,例如使用帶drawable的TextView。

因此,Compose團隊爲組件留出了空間,以便開發人員可以執行所需的任何操作,例如使用按鈕。你可以保留文本帶有圖標的文本所需的任何內容,如下所示

以上就是本文的全部內容,感謝你的閱讀,如果覺得不錯,請點贊👍、轉發✈️、收藏📁 三連支持一波。

每天都有乾貨文章持續更新,可以微信搜索「 技術最TOP 」第一時間閱讀,回覆【思維導圖】【面試】【簡歷】有我準備一些Android進階路線、面試指導和簡歷模板送給你

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