Jetpack Compose Navigation 的使用
Compose 版本:1.0.0-beta08
Navigation 版本:2.4.0-alpha02
添加依赖
implementation("androidx.navigation:navigation-compose:2.4.0-alpha02")
代码示例
实现点击列表中的一项内容,调整至详情页面
- 新闻列表
data class News(
val id: Int,
val title: String,
val summary: String
)
@ExperimentalMaterialApi
@Composable
fun NewsList(toDetail: (Int) -> Unit) {
val mockData = arrayListOf<News>()
for (i in 0..20) {
mockData.add(News(i, "新闻标题 $i", "新闻摘要 $i"))
}
LazyColumn {
items(mockData) {
Card(
modifier = Modifier.padding(6.dp),
onClick = {
toDetail(it.id)
}
) {
Column(
modifier = Modifier
.fillMaxWidth()
.height(50.dp)
.padding(3.dp)
) {
Text(text = it.title, style = MaterialTheme.typography.h6)
Text(text = it.summary, style = MaterialTheme.typography.body2)
}
}
}
}
}
- 新闻详情
@Composable
fun NewsDetail(id: Int) {
Box(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.background),
contentAlignment = Alignment.Center
) {
Text(text = "当前查看的内容 id 为:$id", style = MaterialTheme.typography.subtitle1)
}
}
- NavGraph.kt
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navArgument
import cn.wthee.compose.navigation.ui.NewsDetail
import cn.wthee.compose.navigation.ui.NewsList
/**
* 跳转地址
*/
object NavRoute {
const val HOME = "home"
const val DETAIL = "detail"
const val ID = "id"
}
@ExperimentalMaterialApi
@Composable
fun NavGraph(navHostController: NavHostController, actions: NavActions) {
NavHost(navController = navHostController, startDestination = NavRoute.HOME){
//首页
composable(NavRoute.HOME){
NewsList(actions.toDetail)
}
//详情
composable(
"${NavRoute.DETAIL}/{${NavRoute.ID}}",
arguments = listOf(navArgument(NavRoute.ID) {
type = NavType.IntType
})
) {
val arguments = requireNotNull(it.arguments)
val id = arguments.getInt(NavRoute.ID)
NewsDetail(id = id)
}
}
}
class NavActions(navHostController: NavHostController) {
val toDetail: (Int) -> Unit = { id: Int ->
navHostController.navigate("${NavRoute.DETAIL}/${id}")
}
}
- MainActivity
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.ui.graphics.Color
import androidx.navigation.compose.rememberNavController
import cn.wthee.compose.navigation.ui.theme.SamplesTheme
class MainActivity : ComponentActivity() {
@ExperimentalMaterialApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
SamplesTheme {
val navHostController = rememberNavController()
Surface(color = Color.Gray) {
NavGraph(
navHostController = navHostController,
actions = NavActions(navHostController)
)
}
}
}
}
}