2024年已经过半了,我作为聋人独立开发者,我经常会时不时反思:自己这半年到底进步了多少?在这篇文章里,我分享一个用 Jetpack Compose、Material3和 Kotlin 语言实现使用Jetpack Compose和Room开发NimWishApp的案例。无论你有没有开发经验,相信这篇文章对你会非常有所帮助。
我在昨天写了一篇技术文章,主题是《安卓软件开发:使用Jetpack Compose和Room开发NimWishApp-上篇》,链接查看:https://cloud.tencent.com/developer/article/2454957
一、项目背景
NimWishApp展示了如何利用Room数据库实现愿望数据的持久化,包括数据的保存、读取、更新和删除。
二、项目开发
2.5 页面导航的实现(Navigation)
代码语言:java复制@Composable
fun Navigation(viewModel: WishViewModel = viewModel(), navController: NavHostController = rememberNavController()) {
NavHost(navController = navController, startDestination = "home_screen") {
composable("home_screen") { HomeView(navController, viewModel) }
composable("add/{id}", arguments = listOf(navArgument("id") { type = NavType.LongType })) { entry ->
AddEditDetailView(id = entry.arguments!!.getLong("id"), viewModel = viewModel, navController = navController)
}
}
}
2.5.1 解释代码
主要有两个页面:主界面的HomeView和编辑愿望的AddEditDetailView。通过NavController管理页面之间的切换,简化了导航逻辑。
2.6 数据层的设计
实现用户心愿数据的持久化存储,使用了Room数据库,核心代码:
代码语言:java复制@Entity(tableName="wish-table")
data class Wish(
@PrimaryKey(autoGenerate = true)
val id: Long = 0L,
@ColumnInfo(name="wish-title")
val title: String="",
@ColumnInfo(name="wish-desc")
val description:String=""
)
2.6.1 解释代码
Wish 是愿望数据的实体模型,包含ID、标题和描述字段。这些数据被存储在Room数据库中,方便后续进行数据的增删改查操作。
2.7 DAO接口
代码语言:java复制@Dao
abstract class WishDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
abstract suspend fun addAWish(wishEntity: Wish)
@Query("Select * from `wish-table`")
abstract fun getAllWishes(): Flow<List<Wish>>
@Update
abstract suspend fun updateAWish(wishEntity: Wish)
@Delete
abstract suspend fun deleteAWish(wishEntity: Wish)
@Query("Select * from `wish-table` where id=:id")
abstract fun getAWishById(id:Long): Flow<Wish>
}
2.7.1 解释代码
WishDao 定义了和数据库交互的核心方法,包括插入、查询、更新和删除。方法通过 Flow 实现,动态监听数据的变化,实现数据的自动刷新。
2.8 Room数据库
为了方便操作,创建一个数据库类。
代码语言:java复制@Database(
entities = [Wish::class],
version = 1,
exportSchema = false
)
abstract class WishDatabase : RoomDatabase() {
abstract fun wishDao(): WishDao
}
2.9 Repository层
让 ViewModel 和 DAO 解耦,创建了 WishRepository 封装数据库操作。
代码语言:java复制class WishRepository(private val wishDao: WishDao) {
suspend fun addAWish(wish:Wish){
wishDao.addAWish(wish)
}
fun getWishes(): Flow<List<Wish>> = wishDao.getAllWishes()
fun getAWishById(id:Long) :Flow<Wish> {
return wishDao.getAWishById(id)
}
suspend fun updateAWish(wish:Wish){
wishDao.updateAWish(wish)
}
suspend fun deleteAWish(wish: Wish){
wishDao.deleteAWish(wish)
}
}
通过 WishRepository,可以方便地在 ViewModel 中调用数据库操作,无需要直接和数据库进行交互。提高了代码的可读性,好处是可以使demo的结构很清晰。
2.9 视频演示
三、技术难点
3.1 SwipeToDismiss组件
为了让用户通过滑动手势删除Wish Demo,使用了 SwipeToDismiss 组件。结合 DismissState,可以自定义滑动的方向、删除的阈值和删除后的动画效果。
四、学习笔记
4.1 Jetpack Compose 和 Room 数据库的结合
通过使用 Flow,轻松地监听 Room 数据库中的变化,利用 Compose 的 collectAsState 实现数据的自动刷新。
4.2 Material 3 的主题和组件
结合 Jetpack Compose 的 MaterialTheme 实现了灵活的主题管理.
代码语言:java复制Text(
text = "Nim Title",
color = MaterialTheme.colorScheme.onBackground,
style = MaterialTheme.typography.h4,
fontWeight = FontWeight.Bold
)
4.3 SwipeToDismiss 实现滑动删除
通过 SwipeToDismiss,为WishList中的每个Demo添加滑动删除的功能。在用户滑动时,可以显示删除图标,通过 DismissState 判断用户是否滑动超过了设定的阈值,否则触发了的删除操作。
代码语言:java复制SwipeToDismiss(
state = dismissState,
background = { ... },
dismissContent = { WishItem(wish = wish) { ... } }
)
五、总结
在本次Demo中,我从0-1开发Jetpack Compose和Room数据库结合,实现了从UI到数据持久化的完整App开发过程。Room负责持久化数据存储,两者结合可以高效地构建现现代化Android App。
有任何问题欢迎提问,感谢大家阅读 )