作者 / 開發(fā)者關(guān)系工程師 Don Turner
在應(yīng)用中的不同屏幕之間導(dǎo)航理應(yīng)簡單明了。然而,構(gòu)建穩(wěn)健、可擴(kuò)展且賞心悅目的導(dǎo)航體驗(yàn)卻并非易事。多年來,Jetpack Navigation 庫一直是開發(fā)者的重要工具,但隨著 Android 界面格局的演變,尤其是 Jetpack Compose 的興起,我們意識到是時(shí)候探索一種全新的解決方案了。
我們將在本文為您介紹新推出的 Jetpack Navigation 3,這是一個(gè)專為 Compose 打造的全新導(dǎo)航庫。為簡潔起見,我們將其簡稱為 Nav3。這個(gè)庫采用了聲明式編程模型和 Compose 狀態(tài)作為其基本構(gòu)建模塊。
為什么要推出新的導(dǎo)航庫?
之前的 Jetpack Navigation 庫 (有時(shí)也稱為 Nav2,因?yàn)樗堑诙€(gè)主版本) 最初是在 2018 年發(fā)布的,彼時(shí)還沒有 AndroidX 和 Compose 這兩個(gè)框架。雖然 Nav2 已經(jīng)很好地實(shí)現(xiàn)了最初目標(biāo),但我們了解到,在與現(xiàn)代 Compose 開發(fā)模式結(jié)合使用時(shí),Nav2 存在一些限制。
其中一個(gè)關(guān)鍵的限制是僅支持間接觀察返回堆棧狀態(tài)。這意味著可能存在兩個(gè)事實(shí)來源,從而導(dǎo)致應(yīng)用狀態(tài)出現(xiàn)不一致的情況。此外,Nav2 的 NavHost 被設(shè)計(jì)為僅顯示一個(gè)目標(biāo)位置 (即返回堆棧中的最頂層目標(biāo)位置) 以填充可用空間。這使得實(shí)現(xiàn)同時(shí)顯示多個(gè)內(nèi)容窗格的自適應(yīng)布局 (例如大屏幕上的列表-詳情布局) 變得困難。
創(chuàng)立原則
Nav3 基于以下原則構(gòu)建而成,旨在提供更大的靈活性并提高開發(fā)者掌控力:
您掌控返回堆棧: 作為開發(fā)者,您將擁有并控制返回堆棧,而不是將控制權(quán)交給庫。這是一個(gè)簡單的列表,由 Compose 狀態(tài)支持。具體而言,Nav3 期望您的返回堆棧為 SnapshotStateList,其中 T 可以是您選擇的任何類型。您可以通過添加或刪除項(xiàng)目 (T) 來進(jìn)行導(dǎo)航,狀態(tài)的變化會被 Nav3 的界面觀測到,并自動反映在其界面上。
告別繁瑣: 我們深知您不喜歡導(dǎo)航庫具有無法訪問的內(nèi)部組件和狀態(tài)的 "黑匣子" 式設(shè)計(jì)。Nav3 的設(shè)計(jì)秉承開放性和可擴(kuò)展性原則,為您提供構(gòu)建模塊和實(shí)用的默認(rèn)設(shè)置。如果您想要自定義導(dǎo)航行為,可以深入到更低的層級,創(chuàng)建您自己的組件和自定義設(shè)置。
選擇您的構(gòu)建模塊: Nav3 并沒有將所有行為嵌入到庫中,而是提供了更小巧的組件,您可以組合這些組件來創(chuàng)建更復(fù)雜的功能。我們還準(zhǔn)備了操作指南,其中介紹了如何組合組件來解決常見的導(dǎo)航挑戰(zhàn)。
關(guān)鍵功能
動畫: 內(nèi)置的過渡動畫可用于實(shí)現(xiàn)目標(biāo)位置的切換,包括預(yù)測性返回。此外,它還擁有支持自定義動畫行為的靈活 API,允許在應(yīng)用和單個(gè)屏幕級別覆寫動畫。
自適應(yīng)布局: 通過使用靈活布局 API (名為 Scenes),您可在同一布局中渲染多個(gè)目標(biāo)位置 (例如,大屏設(shè)備上的列表-詳情布局)。您可借此輕松地在單窗格和多窗格布局之間切換。
狀態(tài)范圍限定: 能夠?qū)顟B(tài)限定在返回堆棧中的目標(biāo)位置范圍內(nèi),同時(shí)還可通過專用 Jetpack lifecycle 庫提供可選的 ViewModel 支持。
模塊化: API 設(shè)計(jì)允許將導(dǎo)航代碼拆分到多個(gè)模塊中。這縮短了構(gòu)建時(shí)間并使各個(gè)功能模塊之間的職責(zé)劃分更加清晰。
基本代碼示例
為了幫助您了解 Nav3 的工作原理,我們準(zhǔn)備了簡短的代碼示例。
// Define the routes in your app and any arguments. dataobjectHome dataclassProduct(valid: String) // Create a back stack, specifying the route the app should start with. valbackStack = remember { mutableStateListOf(Home) } // A NavDisplay displays your back stack. Whenever the back stack changes, the display updates. NavDisplay( backStack = backStack, // Specify what should happen when the user goes back onBack = { backStack.removeLastOrNull() }, // An entry provider converts a route into a NavEntry which contains the content for that route. entryProvider = { route -> when(route) { isHome -> NavEntry(route) { Column { Text("Welcome to Nav3") Button(onClick = { // To navigate to a new route, just add that route to the back stack backStack.add(Product("123")) }) { Text("Click to navigate") } } } isProduct -> NavEntry(route) { Text("Product${route.id}") } else-> NavEntry(Unit) { Text("Unknown route:$route") } } } )
開始使用并分享反饋
首先,您可以查看開發(fā)者文檔以及操作指南,其中提供了以下示例:
常見導(dǎo)航界面,例如導(dǎo)航邊欄或?qū)Ш綑?/p>
條件導(dǎo)航,例如登錄流程
使用 Scenes 的自定義布局
我們計(jì)劃在未來為更復(fù)雜的用例提供代碼示例、技術(shù)文檔和文章。
Nav3 目前處于 Alpha 階段,這意味著我們可能會根據(jù)反饋修改 API。
Nav3 為在 Compose 應(yīng)用中構(gòu)建現(xiàn)代導(dǎo)航提供了靈活而強(qiáng)大的基礎(chǔ)。我們非常期待看到您借此打造的精彩作品。
您可以在 io.google 上查看所有 Google I/O 2025 的精彩更新。
-
Android
+關(guān)注
關(guān)注
12文章
3980瀏覽量
132611 -
模型
+關(guān)注
關(guān)注
1文章
3616瀏覽量
51489 -
開發(fā)者
+關(guān)注
關(guān)注
1文章
688瀏覽量
17867
原文標(biāo)題:Jetpack Navigation 3 | 專為 Compose 打造的全新導(dǎo)航庫
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
iphone5發(fā)布會直播預(yù)告_iphone5發(fā)布會現(xiàn)場
疑似喬布斯iphone5發(fā)布會彩排視頻
[視頻] 蘋果iPhone7發(fā)布會完整視頻回顧_中文字幕
小米6發(fā)布會幾點(diǎn)開始? 小米6發(fā)布會直播網(wǎng)址介紹
蘋果AirPods 3將如期在明年3月發(fā)布
蘋果AirPods 3采用入耳式設(shè)計(jì),將在明年3月發(fā)布
iqoo8發(fā)布會如約而至 iqoo8發(fā)布會有哪些看點(diǎn)
蘋果13發(fā)布會2021發(fā)布會時(shí)間
蘋果13發(fā)布會什么時(shí)候 蘋果13發(fā)布會預(yù)告
小米12發(fā)布時(shí)間和價(jià)格
華為nova10發(fā)布會:nova10系列全新支持WiFi 6增強(qiáng)技術(shù)

AITO問界M7發(fā)布PetalMaps打造全新智慧導(dǎo)航體驗(yàn)

華為nova10發(fā)布會 華為nova10美學(xué)設(shè)計(jì)全新升級

評論