【问题标题】:What is the correct usage of Flow in Room?Flow in Room 的正确用法是什么?
【发布时间】:2022-09-24 21:48:13
【问题描述】:

我正在使用Room,并且我编写了Dao 类,如下所示。

@Dao
interface ProjectDao {
    @Query(\"SELECT * FROM project\")
    fun getAllProjects(): Flow<List<Project>>

    ...etc
}

而这个FlowViewModel中通过asLiveData()转换为LiveData,如下使用。

视图模型

@HiltViewModel
class MainViewModel @Inject constructor(
    private val projectRepo: ProjectRepository
) : ViewModel() {
    val allProjects = projectRepo.allProjects.asLiveData()
    ...
}

活动

mainViewModel.allProjects.observe(this) { projects ->
    adapter.submitList(projects)
    ...
}

当数据发生变化时,RecyclerView 会被Observer 自动更新。这是我知道的一个正常的例子。

但是,在我Flow中的项目数据中,从列表中获取所选位置的数据最正确的方法是什么? 我已经编写了从已转换为LiveData 的数据中返回值的代码,但我认为可能有比这个解决方案更好的代码。

private fun getProject(position: Int): Project {
    return mainViewModel.allProjects.value[position]
}

请给我建议

    标签: android android-room android-livedata android-architecture-components android-viewmodel


    【解决方案1】:

    房间有内置的流量支持。

    @Dao
    interface ProjectDao {
        @Query("SELECT * FROM project")
        fun getAllProjects(): Flow<List<Project>>
    
        //lets say you are saving the project from any place one by one.
        @Insert()
        fun saveProject(project :Project)
    }
    

    如果您从任何地方调用 saveProject(project),您的 ui 将自动更新。您不必拨打任何不必要的电话来更新您的用户界面。当项目列表发生任何变化时,流程将使用新数据集更新 ui。

    要获取特定位置的数据,可以从适配器列表中获取。无需打房间电话。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2016-06-24
      • 2021-12-20
      • 2013-03-09
      相关资源
      最近更新 更多