navigation patterns
4
总安装量
0
周安装量
#49240
全站排名
安装命令
npx skills add https://github.com/fwrite0920/android-skills --skill 'Navigation Patterns'
Skill 文档
Navigation Patterns (å¯¼èªæ¨¡å¼)
Instructions
- ç¡®è®¤éæ±å±äºå¯¼è§ä¸ Back Stack 管ç
- ä¾ç §ä¸æ¹ç« è顺åºå¥ç¨
- 䏿¬¡åªå¤çä¸ä¸ªå¯¼èªé¢åï¼Deep Linkã跨模åãBack Stackï¼
- 宿åå¯¹ç § Quick Checklist
When to Use
- Scenario Aï¼æ°é¡¹ç®å¯¼èªè®¾è®¡
- Scenario Bï¼æ§é¡¹ç®æ©å ä¸å¯¼èªæ¡¥æ¥
Example Prompts
- “请åè Type-Safe Argsï¼æ´æ°æç NavHost åæ³”
- “ä¾ç § Deep Links ç« èï¼å¸®æå å ¥ App Links”
- “è¯·ç¨ Multi-Module Navigation 设计跨模åå¯¼èªæ¥å£”
Workflow
- å å建 Compose Navigation åºç¡è·¯ç±
- åå å ¥ Deep Links ä¸è·¨æ¨¡å导èª
- æåç¨ Back Stack 管çä¸ Quick Checklist éªæ¶
Practical Notes (2026)
- é»è®¤éç¨ type-safe argsï¼é¿å åç¬¦ä¸²è·¯ç±æ£è½
- Deep Link å¿ é¡»æéªè¯ä¸å彿µè¯æµç¨
- Back Stack è§åç»ä¸åï¼é¿å 忍¡åèªè®¢é»è¾
Minimal Template
ç®æ :
è·¯ç±èå´:
Deep Link:
Back Stack è§å:
éªæ¶: Quick Checklist
Compose Navigation Basics
Type-Safe Args (Navigation 2.8+)
// å®ä¹è·¯ç±
@Serializable
data class DetailRoute(val productId: String)
@Serializable
object HomeRoute
// NavHost
NavHost(navController, startDestination = HomeRoute) {
composable<HomeRoute> {
HomeScreen(onProductClick = { id ->
navController.navigate(DetailRoute(id))
})
}
composable<DetailRoute> { backStackEntry ->
val route = backStackEntry.toRoute<DetailRoute>()
DetailScreen(productId = route.productId)
}
}
Nested Graphs
NavHost(navController, startDestination = "main") {
navigation(startDestination = "home", route = "main") {
composable("home") { HomeScreen() }
composable("profile") { ProfileScreen() }
}
navigation(startDestination = "login", route = "auth") {
composable("login") { LoginScreen() }
composable("register") { RegisterScreen() }
}
}
Deep Links
App Links 设置
<!-- AndroidManifest.xml -->
<activity android:name=".MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/product" />
</intent-filter>
</activity>
assetlinks.json (Host éªè¯)
// https://example.com/.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["..."]
}
}]
Navigation éæ
composable(
route = "product/{id}",
deepLinks = listOf(
navDeepLink { uriPattern = "https://example.com/product/{id}" }
)
) { backStackEntry ->
val id = backStackEntry.arguments?.getString("id")
ProductScreen(id)
}
Multi-Module Navigation
API Module Pattern
// :feature:product:api
interface ProductNavigator {
fun navigateToProduct(productId: String)
fun navigateToProductList()
}
// :feature:product:impl
class ProductNavigatorImpl @Inject constructor(
private val navController: NavController
) : ProductNavigator {
override fun navigateToProduct(productId: String) {
navController.navigate("product/$productId")
}
}
// å
¶ä»æ¨¡å使ç¨
class HomeViewModel @Inject constructor(
private val productNavigator: ProductNavigator
) {
fun onProductClick(id: String) {
productNavigator.navigateToProduct(id)
}
}
Navigation Events (Single Event)
// ViewModel
sealed class NavigationEvent {
data class ToDetail(val id: String) : NavigationEvent()
object Back : NavigationEvent()
}
private val _navigationEvent = Channel<NavigationEvent>()
val navigationEvent = _navigationEvent.receiveAsFlow()
// Composable
LaunchedEffect(Unit) {
viewModel.navigationEvent.collect { event ->
when (event) {
is NavigationEvent.ToDetail -> navController.navigate("detail/${event.id}")
NavigationEvent.Back -> navController.popBackStack()
}
}
}
Complex Back Stack Management
Auth Flow (Clear Stack)
fun navigateToHome() {
navController.navigate("home") {
popUpTo("auth") { inclusive = true } // æ¸
é¤ auth æµç¨
launchSingleTop = true
}
}
Bottom Nav with Separate Stacks
@Composable
fun MainScreen() {
val navController = rememberNavController()
Scaffold(
bottomBar = {
NavigationBar {
items.forEach { item ->
NavigationBarItem(
selected = currentRoute == item.route,
onClick = {
navController.navigate(item.route) {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
}
)
}
}
}
) { /* NavHost */ }
}
Quick Checklist
- ä½¿ç¨ Type-Safe Args (Navigation 2.8+)
- Deep Links é ç½® assetlinks.json
- 跨模åä½¿ç¨ Navigator interface
- Navigation Events ä½ä¸º Single Event å¤ç
- Bottom Nav æ£ç¡®ä¿å/æ¢å¤ State