在两个不同的导航图之间传递数据

问题描述 投票:0回答:0

我的应用程序中有两个不同的导航图。 第一个有 3 个片段:包含已创建项目列表的片段、我创建新项目的片段和具有第二个导航图的支持片段。 第二个导航图具有底部导航和包含有关已创建项目信息的其他片段。当用户选择已创建项目列表中的一项时,它会激活。 为了存储有关项目的信息,我使用房间数据库。

我真的不明白如何将有关所选项目的数据传递给第二个导航图。

我想用导航图参数传递所选项目,但由于我想传递此数据的片段在另一个导航图中,我认为我不能使用它。 我试图在我的数据库中查询以通过 id 查找项目,但我真的不知道如何在我的代码中实现它。

这是我的道:

@Dao
interface ProjectsDao {
    @Insert
    suspend fun addProjects(projects: Projects)
    @Delete
    suspend fun deleteProject(projects: Projects)

    @Query("DELETE FROM projects")
    suspend fun deleteAllProjects()

    @Query("SELECT * FROM projects WHERE projects.id = :id")
    fun findProjectById(id: Int): LiveData<Projects>

    @Update
    suspend fun updateProject(projects: Projects)
    @Query("SELECT * FROM projects")

    fun readAllProjects(): LiveData<List<Projects>>
}

这是我的视图模型:

class DataViewModel(application:Application): AndroidViewModel(application) {
     val readAllProjects: LiveData<List<Projects>>
    private val repository: ProjectsRepository

    init{
        val projectsDao = ProjectsDatabase.getDatabase(application).projectsDao()
        repository = ProjectsRepository(projectsDao)
        readAllProjects = repository.readAllProjects
    }

    fun addProjects(projects: Projects){
        viewModelScope.launch(Dispatchers.IO) {
        repository.addProjects(projects)
        }
    }

    fun updateProject(projects: Projects){
        viewModelScope.launch(Dispatchers.IO){
            repository.updateProject(projects)
        }
    }
    fun deleteProject(projects: Projects){
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteProject(projects)
        }
    }

    fun deleteAllProjects(){
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteAllProjects()
        }
    }

    fun findProjectById(id: Int){
        viewModelScope.launch(Dispatchers.IO) {
            repository.findProjectById(id)
        }
    }
}

这是我尝试将所选项目的 id 从

MainFragment
通过适配器传递到导航图中的下一个片段
SupportFragment
。但是
SupportFragment
只有FragmentContainerView 和底部导航。所以项目数据实际上应该传递给
ProjectDetailsFragment
.

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = projectsList[position]
        holder.binding.projectNameTxt.text = currentItem.pr_name

        setListeners(currentItem, holder)
        //holder.binding.rawLayout.setOnClickListener {
        //    val action = MainFragmentDirections.actionMainFragmentToSupportFragment(currentItem)
        //    holder.itemView.findNavController().navigate(action)
        //}
        //holder.binding.deleteProjectID.setOnClickListener{
        //    listener.deleteProject(currentItem)
        //}

    }

    private fun setListeners(currentItem: Projects, holder: MainAdapter.MyViewHolder) {
        holder.binding.rawLayout.setOnClickListener {
            val intent = Intent(holder.itemView.context, SupportFragment::class.java)
            intent.putExtra("id", currentItem.id)
            holder.itemView.context.startActivity(intent)
            //val action = MainFragmentDirections.actionMainFragmentToSupportFragment(intent)
            //holder.itemView.findNavController().navigate(action)
        }
        holder.binding.deleteProjectID.setOnClickListener{
            listener.deleteProject(currentItem)
        }
    }
android kotlin android-fragments android-room
© www.soinside.com 2019 - 2024. All rights reserved.