Trio:Airbnb的AndroidJetpackCompose屏幕架構框架

夢回故裏歸科技 2024-05-07 21:07:36

隨著 Android 開發技術的不斷演進,Airbnb 的 Android 團隊開發了一種名爲 Trio 的框架,旨在簡化和優化基于 Jetpack Compose 的屏幕架構。Trio 建立在 Airbnb 開源的狀態管理庫 Mavericks 之上,提供了一種全新的方式來構建 Android 應用的屏幕組件。

Trio 簡介

Trio 是一個高度模塊化和可組合的框架,它通過將 UI、狀態管理和導航邏輯分離,使得 Android 應用的開發更加高效和可維護。Trio 的核心概念包括:

Trio 類:定義了構成屏幕的三大要素——參數(Args)、屬性(Props)、狀態(State)和視圖模型(ViewModel)。UI 類:負責渲染屏幕內容,並與視圖模型交互以響應用戶事件。視圖模型(ViewModel):負責管理屏幕的狀態,並通過狀態流(State Flow)與 UI 類同步。class CounterScreen : Trio< CounterArgs, CounterProps, CounterState, CounterViewModel, CounterUI>class CounterScreen( initializer: Initializer<CounterArgs, CounterState>)class CounterScreen( initializer: Initializer<CounterArgs, CounterState>) : Trio< CounterArgs, CounterProps, CounterState, CounterViewModel, CounterUI>(initializer) { override fun createInitialState(CounterArgs, CounterProps) { return CounterState(args.count) }}

導航與狀態管理

Trio 通過將導航狀態存儲在視圖模型的狀態中,實現了導航和狀態管理的統一。這種方法簡化了複雜的異步操作後的導航邏輯,並確保了視圖模型狀態與導航狀態的同步。

class CounterViewModel : TrioViewModel { fun saveAndExit() = viewModelScope.launch { val success = performSaveRequest() setState { copy( trioStack = trioStack.dropLast(1), success = success ) } }}class ViewModelInitializer<S : MavericksState>( val initialState: S, internal val activityFlow: Flow<Activity?>, ...)class CounterViewModel( initializer: ViewModelInitializer) : TrioViewModel { fun saveAndOpenNextPage() = viewModelScope.launch { performSaveRequest() awaitActivity().startActivity() }}

模塊化與代碼複用

Trio 的設計支持大型應用的模塊化開發。每個功能模塊都有自己的路由(Router),這些路由與 Dagger 多綁定相結合,使得代碼複用和模塊化變得簡單。

片段互操作

Trio 屏幕與現有的 Fragment 屏幕互操作非常重要,而 Trios 和 Fragments 需要輕松共存。

互操作性方法是雙重的。首先,如果 Fragment 和 Trio 在創建時不需要動態共享信息(即,它們只接受初始參數並返回結果),那麽在 Fragment 和 Trio 之間轉換時,最容易啓動新活動。這兩種體系結構類型都可以在具有參數的新活動中輕松啓動,並且可以選擇在完成後返回結果,因此以這種方式在它們之間導航非常容易。

如果 Trio 和 Fragment 屏幕需要在屏幕都處于活動狀態時在它們之間共享數據,或者它們需要共享太大而無法與 Arguments 一起傳遞的複雜數據,則 Trio 可以嵌套在“互操作片段”中,並且兩個片段可以顯示在同一活動中。Fragment 可以通過共享的 ViewModel 進行通信,類似于 Fragment 通常與 Mavericks 共享 ViewModel 的方式。

Trio 的核心特性

類型安全的通信

Trio 通過 Props 實現了類型安全的跨模塊通信。Props 是一組可以在 Trio 之間傳遞的數據和回調函數,它們在編譯時就能確保類型正確性。

屏幕流管理

Trio 提供了一個標准的“屏幕流”實現,用于管理一系列相關屏幕的狀態和導航。這種設計使得處理複雜的屏幕堆棧和共享狀態變得更加容易。

開發工具支持

爲了提高開發效率,Airbnb 開發了一個 Android Studio 插件,用于生成 Trio 的模板代碼,包括路由、模擬和測試代碼。

Trio 在 Airbnb 的應用

Trio 自 2021 年末開始設計,並在 2022 年中開始在 Airbnb 的生産環境中使用。截至 2024 年 3 月,已經有超過 230 個 Trio 屏幕在 Airbnb 獲得顯著的生産流量。開發者普遍反饋積極,認爲 Trio 提高了開發速度,減少了代碼複雜性,並促進了最佳實踐的采用。

結論與展望

Trio 作爲 Airbnb 對 Android Jetpack Compose 屏幕架構的一種探索,已經在實踐中證明了其價值。它不僅提高了開發效率,還增強了代碼的可維護性和可讀性。展望未來,Airbnb 將繼續優化 Trio,並期待在 Compose 框架提供共享元素過渡等 API 後,進一步擴展其功能。

0 阅读:0

夢回故裏歸科技

簡介:感謝大家的關注