安卓软件开发:使用Jetpack Compose和Room开发NimWishApp-下篇

2024-10-04 16:49:53 浏览数 (4)

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。

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

0 人点赞