返回首页

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 函数