JetpackCompose Navigation導(dǎo)航實(shí)現(xiàn)流程
Navigation 快速上手
下面案例簡(jiǎn)要展示使用 Compose 版本的 Navigation 庫(kù)來(lái)實(shí)現(xiàn)兩個(gè)頁(yè)面之間的跳轉(zhuǎn)
這是完整的結(jié)構(gòu)(忽略掉紅線劃過(guò)的那個(gè)包)
編寫(xiě)欲跳轉(zhuǎn)的兩個(gè)頁(yè)面
編寫(xiě) Demo1 頁(yè)面
子頁(yè)面使用多個(gè) composable
組件相組合的方法一一裝配起來(lái)
Demo1main
渲染整個(gè)頁(yè)面,他接受一個(gè) NavController
對(duì)象,用于操縱導(dǎo)航相關(guān)的方法
可以注意到 Button 里面的點(diǎn)擊事件還沒(méi)寫(xiě),后續(xù)我們寫(xiě)好路由后再回來(lái)編寫(xiě)跳轉(zhuǎn)邏輯
@Composable fun Demo1main(navController: NavController) { body(navController) } @Composable private fun body(navController: NavController) { Column( modifier = Modifier .fillMaxSize() ) { Button(onClick = { // 跳轉(zhuǎn)邏輯 }) { Text( text = "前往demo2", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center ) } } }
編寫(xiě) Demo2 頁(yè)面
依葫蘆畫(huà)瓢
@Composable fun Demo2main(navController: NavController) { body(navController) } @Composable private fun body(navController: NavController) { Column( modifier = Modifier .fillMaxSize() ) { Button(onClick = { // 這里也寫(xiě)跳轉(zhuǎn)邏輯! }) { Text( text = "前往demo1", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center ) } } }
路由表配置
編寫(xiě)單例類(lèi) RouteConfig 用來(lái)存儲(chǔ)路由名稱(等同于 vue-router 中我們?cè)O(shè)置的 path)
后續(xù)為便于理解,統(tǒng)稱為 path
object RouteConfig { // 主頁(yè)面 const val ROUTE_MAIN = "main" // 兩個(gè)跳轉(zhuǎn)頁(yè)面 const val ROUTE_DEMO1 = "demo1" const val ROUTE_DEMO2 = "demo2" }
總路由
創(chuàng)建文件 MainNav 并在里面實(shí)現(xiàn)路由導(dǎo)航的總邏輯
由于我們剛剛?cè)腴T(mén),路由表可以很簡(jiǎn)單,按照以下結(jié)構(gòu)即可
- rememberNavController 存儲(chǔ)所有 navcontroller 狀態(tài)
- NavHost 一個(gè)容器,便于內(nèi)部頁(yè)面的切換,在里面注冊(cè)所有頁(yè)面
@Composable fun AppNav() { // 存儲(chǔ)navigation狀態(tài) val navController = rememberNavController() // navhost容器 // startDestination表示起始頁(yè)的path,這里我們指定demo1作為起始頁(yè) NavHost(navController = navController, startDestination = RouteConfig.ROUTE_DEMO1) { // 依次傳入path并注冊(cè)三個(gè)頁(yè)面 composable(RouteConfig.ROUTE_MAIN) { MainActivity() } composable(RouteConfig.ROUTE_DEMO1) { Demo1main(navController) } composable(RouteConfig.ROUTE_DEMO2) { Demo2main(navController) } } }
主頁(yè)面調(diào)用總路由
對(duì)于 kotlin 而言,非常簡(jiǎn)單,直接調(diào)用定義好的總路由方法即可
因?yàn)榭偮酚赡J(rèn)起始頁(yè)為 demo1,故渲染 mainactivity 后就會(huì)立即載入 demo1 頁(yè)面!
class MainActivity() : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { DemoComposeTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background ) { // 一鍵調(diào)用,方便快捷 AppNav() } } } } }
跳轉(zhuǎn)邏輯完善
嘿!還記得我們之前置空的按鈕跳轉(zhuǎn)邏輯嗎?
我們已經(jīng)配置完了所有路由,為此,僅需將以下代碼添加到按鈕點(diǎn)擊事件即可跳轉(zhuǎn)到指定頁(yè)面了!
// 寫(xiě)于demo1頁(yè)面,點(diǎn)擊按鈕后跳轉(zhuǎn)到demo2頁(yè)面 navController.navigate(RouteConfig.ROUTE_DEMO2)
為便于大家理解,現(xiàn)給出 demo1.kt 目前的完整代碼
@Composable fun Demo1main(navController: NavController) { body(navController) } @Composable private fun body(navController: NavController) { Column( modifier = Modifier .fillMaxSize() ) { Button(onClick = { navController.navigate(RouteConfig.ROUTE_DEMO2) }) { Text( text = "前往demo2", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center ) } } }
demo2 的跳轉(zhuǎn)邏輯只需要修改對(duì)應(yīng)的 path 即可
目前僅學(xué)到了最簡(jiǎn)單的 navigate 跳轉(zhuǎn),后續(xù)還有帶參跳轉(zhuǎn),請(qǐng)關(guān)注進(jìn)階版本!
到此這篇關(guān)于JetpackCompose Navigation導(dǎo)航實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)JetpackCompose Navigation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用Room操作數(shù)據(jù)庫(kù)流程詳解
谷歌推薦使用Room操作數(shù)據(jù)庫(kù),Room在 SQLite 上提供了一個(gè)抽象層,在充分利用 SQLite強(qiáng)大功能的同時(shí),能夠流暢地訪問(wèn)數(shù)據(jù)庫(kù)2022-11-11AndroidStudio項(xiàng)目打包成jar的簡(jiǎn)單方法
JAR(Java Archive,Java 歸檔文件)是與平臺(tái)無(wú)關(guān)的文件格式,它允許將許多文件組合成一個(gè)壓縮文件,在eclipse中我們知道如何將一個(gè)項(xiàng)目導(dǎo)出為jar包,供其它項(xiàng)目使用呢?下面通過(guò)本文給大家介紹ndroidStudio項(xiàng)目打包成jar的簡(jiǎn)單方法,需要的朋友參考下吧2017-11-11Android用代碼獲取手機(jī)root之后的最高權(quán)限
機(jī)得root之后通過(guò)代碼可以獲得最高權(quán)限如果沒(méi)有root的話請(qǐng)不要往下看,毫無(wú)意義,root之后的朋友可以參考下本文或許有意想不到的收獲2013-03-03Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問(wèn)題的解決方法
這篇文章主要介紹了Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問(wèn)題的解決方法,涉及Android針對(duì)activity啟動(dòng)設(shè)置的技巧,需要的朋友可以參考下2015-12-12輕松實(shí)現(xiàn)功能強(qiáng)大的Android刮獎(jiǎng)效果控件(ScratchView)
這篇文章主要為大家詳細(xì)介紹了ScratchView如何一步步打造萬(wàn)能的Android刮獎(jiǎng)效果控件,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android開(kāi)發(fā)仿bilibili刷新按鈕的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 仿bilibili刷新按鈕的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-10-10Android 圖片保存到相冊(cè)不顯示的解決方案(兼容Android 10及更高版本)
這篇文章主要介紹了Android 圖片保存到系統(tǒng)相冊(cè)不顯示的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-04-04Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu
這篇文章主要為大家詳細(xì)介紹了Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07