作者 / 開(kāi)發(fā)者關(guān)系工程師 Don Turner
在應(yīng)用中的不同屏幕之間導(dǎo)航理應(yīng)簡(jiǎn)單明了。然而,構(gòu)建穩(wěn)健、可擴(kuò)展且賞心悅目的導(dǎo)航體驗(yàn)卻并非易事。多年來(lái),Jetpack Navigation 庫(kù)一直是開(kāi)發(fā)者的重要工具,但隨著 Android 界面格局的演變,尤其是 Jetpack Compose 的興起,我們意識(shí)到是時(shí)候探索一種全新的解決方案了。
我們將在本文為您介紹新推出的 Jetpack Navigation 3,這是一個(gè)專(zhuān)為 Compose 打造的全新導(dǎo)航庫(kù)。為簡(jiǎn)潔起見(jiàn),我們將其簡(jiǎn)稱(chēng)為 Nav3。這個(gè)庫(kù)采用了聲明式編程模型和 Compose 狀態(tài)作為其基本構(gòu)建模塊。
為什么要推出新的導(dǎo)航庫(kù)?
之前的 Jetpack Navigation 庫(kù) (有時(shí)也稱(chēng)為 Nav2,因?yàn)樗堑诙€(gè)主版本) 最初是在 2018 年發(fā)布的,彼時(shí)還沒(méi)有 AndroidX 和 Compose 這兩個(gè)框架。雖然 Nav2 已經(jīng)很好地實(shí)現(xiàn)了最初目標(biāo),但我們了解到,在與現(xiàn)代 Compose 開(kāi)發(fā)模式結(jié)合使用時(shí),Nav2 存在一些限制。
其中一個(gè)關(guān)鍵的限制是僅支持間接觀察返回堆棧狀態(tài)。這意味著可能存在兩個(gè)事實(shí)來(lái)源,從而導(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)建而成,旨在提供更大的靈活性并提高開(kāi)發(fā)者掌控力:
您掌控返回堆棧: 作為開(kāi)發(fā)者,您將擁有并控制返回堆棧,而不是將控制權(quán)交給庫(kù)。這是一個(gè)簡(jiǎn)單的列表,由 Compose 狀態(tài)支持。具體而言,Nav3 期望您的返回堆棧為 SnapshotStateList,其中 T 可以是您選擇的任何類(lèi)型。您可以通過(guò)添加或刪除項(xiàng)目 (T) 來(lái)進(jìn)行導(dǎo)航,狀態(tài)的變化會(huì)被 Nav3 的界面觀測(cè)到,并自動(dòng)反映在其界面上。
告別繁瑣: 我們深知您不喜歡導(dǎo)航庫(kù)具有無(wú)法訪(fǎng)問(wèn)的內(nèi)部組件和狀態(tài)的 "黑匣子" 式設(shè)計(jì)。Nav3 的設(shè)計(jì)秉承開(kāi)放性和可擴(kuò)展性原則,為您提供構(gòu)建模塊和實(shí)用的默認(rèn)設(shè)置。如果您想要自定義導(dǎo)航行為,可以深入到更低的層級(jí),創(chuàng)建您自己的組件和自定義設(shè)置。
選擇您的構(gòu)建模塊: Nav3 并沒(méi)有將所有行為嵌入到庫(kù)中,而是提供了更小巧的組件,您可以組合這些組件來(lái)創(chuàng)建更復(fù)雜的功能。我們還準(zhǔn)備了操作指南,其中介紹了如何組合組件來(lái)解決常見(jiàn)的導(dǎo)航挑戰(zhàn)。
關(guān)鍵功能
動(dòng)畫(huà): 內(nèi)置的過(guò)渡動(dòng)畫(huà)可用于實(shí)現(xiàn)目標(biāo)位置的切換,包括預(yù)測(cè)性返回。此外,它還擁有支持自定義動(dòng)畫(huà)行為的靈活 API,允許在應(yīng)用和單個(gè)屏幕級(jí)別覆寫(xiě)動(dòng)畫(huà)。
自適應(yīng)布局: 通過(guò)使用靈活布局 API (名為 Scenes),您可在同一布局中渲染多個(gè)目標(biāo)位置 (例如,大屏設(shè)備上的列表-詳情布局)。您可借此輕松地在單窗格和多窗格布局之間切換。
狀態(tài)范圍限定: 能夠?qū)顟B(tài)限定在返回堆棧中的目標(biāo)位置范圍內(nèi),同時(shí)還可通過(guò)專(zhuān)用 Jetpack lifecycle 庫(kù)提供可選的 ViewModel 支持。
模塊化: API 設(shè)計(jì)允許將導(dǎo)航代碼拆分到多個(gè)模塊中。這縮短了構(gòu)建時(shí)間并使各個(gè)功能模塊之間的職責(zé)劃分更加清晰。
基本代碼示例
為了幫助您了解 Nav3 的工作原理,我們準(zhǔn)備了簡(jiǎ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") } } } )
開(kāi)始使用并分享反饋
首先,您可以查看開(kāi)發(fā)者文檔以及操作指南,其中提供了以下示例:
常見(jiàn)導(dǎo)航界面,例如導(dǎo)航邊欄或?qū)Ш綑?/p>
條件導(dǎo)航,例如登錄流程
使用 Scenes 的自定義布局
我們計(jì)劃在未來(lái)為更復(fù)雜的用例提供代碼示例、技術(shù)文檔和文章。
Nav3 目前處于 Alpha 階段,這意味著我們可能會(huì)根據(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瀏覽量
132737 -
模型
+關(guān)注
關(guān)注
1文章
3619瀏覽量
51555 -
開(kāi)發(fā)者
+關(guān)注
關(guān)注
1文章
693瀏覽量
17883
原文標(biāo)題:Jetpack Navigation 3 | 專(zhuān)為 Compose 打造的全新導(dǎo)航庫(kù)
文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
iphone5發(fā)布會(huì)直播預(yù)告_iphone5發(fā)布會(huì)現(xiàn)場(chǎng)
疑似喬布斯iphone5發(fā)布會(huì)彩排視頻
[視頻] 蘋(píng)果iPhone7發(fā)布會(huì)完整視頻回顧_中文字幕
小米6發(fā)布會(huì)幾點(diǎn)開(kāi)始? 小米6發(fā)布會(huì)直播網(wǎng)址介紹
蘋(píng)果AirPods 3將如期在明年3月發(fā)布
蘋(píng)果AirPods 3采用入耳式設(shè)計(jì),將在明年3月發(fā)布
iqoo8發(fā)布會(huì)如約而至 iqoo8發(fā)布會(huì)有哪些看點(diǎn)
蘋(píng)果13發(fā)布會(huì)2021發(fā)布會(huì)時(shí)間
蘋(píng)果13發(fā)布會(huì)什么時(shí)候 蘋(píng)果13發(fā)布會(huì)預(yù)告
小米12發(fā)布時(shí)間和價(jià)格
華為nova10發(fā)布會(huì):nova10系列全新支持WiFi 6增強(qiáng)技術(shù)
AITO問(wèn)界M7發(fā)布PetalMaps打造全新智慧導(dǎo)航體驗(yàn)
華為nova10發(fā)布會(huì) 華為nova10美學(xué)設(shè)計(jì)全新升級(jí)

全新導(dǎo)航庫(kù)Jetpack Navigation 3發(fā)布
評(píng)論