kotlin 学习笔记 路由
使用 navigation 3
data class Product(val id: String)
data object Home
@Composable
fun TwoApp() {
val backStack = remember { mutableStateListOf<Any>(Home) }
NavDisplay(
backStack = backStack, onBack = { backStack.removeLastOrNull() },
entryProvider = { key ->
when (key) {
Home -> NavEntry(key) {
Column() {
Text("Home")
Button(onClick = { backStack.add(Product("1")) }) { Text("Product 1") }
}
}
is Product -> NavEntry(key) {
Column() {
Text("Product ${key.id}")
Button(onClick = { backStack.add(Product("${key.id.toInt() + 1}")) }) {
Text(
"Product ${key.id.toInt() + 1}"
)
}
Button(onClick = { backStack.add(Home) }) { Text("Home") }
}
}
else -> NavEntry(Unit) {
Text("Unknown")
}
}
}
)
}
NavDisplay 是显示页面的组件
backStack 是页面栈,变化的时候需要页面重组
entryProvider 是 key -> NavEntry{UI} 的函数
entryProvider = entryProvider {
entry<Home> {
HomePage { backStack.add(Product("1")) }
}
entry<Product> { key ->
val id = key.id.toInt()
ProductPage(
key,
{ backStack.add(Home) },
{ backStack.add(Product("${id + 1}")) },
{ backStack.add(Product("${id - 1}")) })
}
}
和这个等价
entryProvider 参数是 builder: EntryProviderScope<T>.() -> Unit
也就是说 {}是一个函数,里面调用了几次 entry() 函数
val entryProvider = entryProvider {
homeEntry(
postsRepository = appContainer.postsRepository,
isExpandedScreen = { currentIsExpandedScreen },
openDrawer = openDrawer,
navigateToPost = { navigator.navigate(PostKey(it), popUpTo = PopUpTo(HomeKey)) },
)
}
里面调用了 homeEntry 函数
fun EntryProviderScope<NavKey>.homeEntry(
postsRepository: PostsRepository,
isExpandedScreen: () -> Boolean,
openDrawer: () -> Unit,
navigateToPost: (String) -> Unit,
) {
它是 EntryProviderScope 的扩展函数,因为 entryProvider 的参数就是 EntryProviderScope 的扩展函数 ,在 EntryProviderScope 的作用域可以 调用 entry 函数