admin 管理员组

文章数量: 1103785

安卓软件开发:使用Jetpack Compose实现高级NimNavBottomApp

随着 Jetpack Compose 的流行,越来越多的开发者开始转向这种全新的声明式 UI 框架。作为一名聋人独立开发者,我一直在探索新的技术和工具,提高自己的技能和工作效率。在这篇文章中,我分享使用 Jetpack Compose 和 Material 3 实现一个高级的 NimNavBottomApp 的开发过程,为大家提供开发灵感和实践经验。

一、项目背景

展示 Jetpack Compose 如何简化 UI 的编码,如何使用 Material 3 提供的组件实现现代化的 Android 应用设计。初级开发可以看怎么通过实现跳转底部导航栏对应tiem对应的内容,也有详细介绍了中高级开发者提供了实用技巧,比如如何处理通知徽章(Badges)和导航状态的管理。这个Demo,我实现了一个常见的底部导航栏App,包括多个页面切换、选中状态的高亮显示、徽章通知的显示等功能。

二、项目开发

2.1 介绍Badges UI组件

底部导航栏的每个菜单项展示图标和标签,还可以显示通知徽章。徽章可以提醒用户有未读的消息or待处理的任务。

2.2 创建底部导航栏项类(BottomNavItem)

管理底部导航栏的Demo,创建了一个 sealed class 定义每个导航项。每个导航项包括图标、标签和路由名称,核心代码如下

代码语言:java复制
sealed class BottomNavItem(val title: String, val icon: ImageVector, val screenRoute: String) {
    data object Home : BottomNavItem("主页", Icons.Filled.Home, "home")
    data object My : BottomNavItem("我的", Icons.Filled.Person, "my")
}

2.3 创建导航容器类(NavigationHost)

需要指定导航的起始页面(startDestination),且通过 NavHost 传递给 NavController 实现页面的导航。

代码语言:java复制
@Composable
fun NavigationHost(navController: NavHostController, modifier: Modifier = Modifier) {
    NavHost(navController, startDestination = BottomNavItem.Home.screenRoute, modifier = modifier) {
        // 定义导航项
        composable(BottomNavItem.Home.screenRoute) { HomeScreen() }
        composable(BottomNavItem.My.screenRoute) { MyScreen() }
    }
}

例如,添加更多页面

你需要添加一个新的页面,例如 SettingsScreen,只需在 NavHost 中增加一行 composable 函数:

代码语言:java复制
        composable("settings") { SettingsScreen() }  // 新增的页面

2.4 使用 Scaffold 实现整体布局

代码语言:java复制
@Composable
fun BottomNavigationBar(navController: NavHostController, notifications: Map<String, Int>) {
    val items = listOf(
        BottomNavItem.Home,
        BottomNavItem.My   
    )

    // 获取当前导航目的地
    val navBackStackEntry = navController.currentBackStackEntryAsState()
    val currentRoute = navBackStackEntry.value?.destination?.route

    NavigationBar {
        items.forEach { item ->
            NavigationBarItem(
                icon = {
                    // 为每个 NavigationBarItem 添加徽章
                    BadgedBox(
                        badge = {
                            val count = notifications[item.screenRoute] ?: 0
                            if (count > 0) {
                                Badge {
                                    Text(text = if (count > 99) "99+" else count.toString())
                                }
                            }
                        }
                    ) {
                        Icon(item.icon, contentDescription = item.title)
                    }
                },
                label = { Text(item.title) },
                selected = currentRoute == item.screenRoute,  // 高亮当前选中的项
                onClick = {
                    if (currentRoute != item.screenRoute) {
                        navController.navigate(item.screenRoute) {
                            launchSingleTop = true
                            restoreState = true
                            popUpTo(navController.graph.startDestinationId) {
                                saveState = true
                            }
                        }
                    }
                },
                colors = NavigationBarItemDefaults.colors(
                    selectedIconColor = Color.White,
                    unselectedIconColor = Color.Gray,
                    selectedTextColor = Color.White,
                    unselectedTextColor = Color.Gray
                )
            )
        }
    }
}

2.5 测试 UI

代码语言:java复制
@Preview(showBackground = true)
@Composable
fun PreviewBottomNavigationBar() {
    MaterialTheme {
        val navController = rememberNavController()
        val notifications = mapOf(
            BottomNavItem.Home.screenRoute to 5,
            BottomNavItem.My.screenRoute to 110
        )

        BottomNavigationBar(navController, notifications)
    }
}

2.6 视频演示

初级开发者看这个视频了解如何通过底部导航栏进行页面跳转。

中高级开发者看这个视频了解如何通过底部导航栏实现徽章的动态更新。

三、技术难点

3.1 状态管理与导航同步

在多页面应用中,状态管理和导航同步一直是个难题,如何让导航状态与页面展示保持一致,确保底部导航栏能够正确高亮选中的页面,这是需要特别注意的地方。通过 currentBackStackEntryAsState() 监听导航堆栈的变化,确保底部导航栏的选中状态始终与当前显示的页面保持同步。

3.2 徽章的动态更新

需要根据用户的操作或者后端的反馈,动态更新每个导航项的通知徽章。为此,通过一个Map存储每个页面的通知数量,根据页面的变化动态显示或隐藏徽章。

四、学习笔记

在这个Demo开发过程中,我掌握了如何在 Jetpack Compose 中处理复杂的状态管理,虽然学习成本较高,但掌握了 Compose 的核心思想,很方便开发。

特别是在处理 Badge、Scaffold 等 Material 3 组件时,我发现它们的高度定制化和易用性,极大减少了样式定制的时间成本。深刻体会到 Jetpack Compose 有未来。

五、总结

通过这个项目,展示了如何使用 Jetpack Compose 和 Material 3 实现一个带有高级功能的底部导航应用。无论是徽章通知的处理,还是底部导航栏与页面内容的同步显示,Jetpack Compose 都提供了简洁高效的解决方案。

有任何问题欢迎提问,感谢大家阅读 )

本文标签: 安卓软件开发使用Jetpack Compose实现高级NimNavBottomApp