前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安卓软件开发:使用Jetpack Compose和Room开发NimWishApp-下篇

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

原创
作者头像
Nimyears
发布2024-10-04 16:49:53
1340
发布2024-10-04 16:49:53
举报
文章被收录于专栏:JetpackCompose M3

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。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目背景
  • 二、项目开发
    • 2.5 页面导航的实现(Navigation)
      • 2.5.1 解释代码
        • 2.6.1 解释代码
          • 2.7 DAO接口
            • 2.7.1 解释代码
              • 2.8 Room数据库
                • 2.9 Repository层
                • 三、技术难点
                  • 3.1 SwipeToDismiss组件
                  • 四、学习笔记
                    • 4.1 Jetpack Compose 和 Room 数据库的结合
                      • 4.2 Material 3 的主题和组件
                        • 4.3 SwipeToDismiss 实现滑动删除
                        • 五、总结
                        相关产品与服务
                        数据保险箱
                        数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档