如何将值从 activity 传递给 ViewModel?

How to pass value from activity to ViewModel?

如何将值从 Activity 传递到视图模型?我试图在网上找到任何东西,但我失败了。我想要的是:我有两个 recyclerviews 合二为一 activity。如果用户单击 recyclerview 1 中的项目 A,我想将此项目的 ID 发送到视图模型,并通过此 ID 发送 return 某些内容。 dokladId 参数在 testToShow 变量中有错误。

有什么简单的处理方法?

这是我的视图模型:

@HiltViewModel
class SkladViewModel @Inject constructor(
    repository: SybaseRepository
): ViewModel(){
    val skladyPolozky = repository.getAllSkladFromPolozka().asLiveData()
    val dokladyPolozky = repository.getAllHlavickyToDoklad().asLiveData()
    val testToShow = repository.getSelectedDokladyBySklad(dokladId).asLiveData()
}

这是activity

@AndroidEntryPoint
class DokladActivity : AppCompatActivity(), SkladAdapter.OnItemClickListener, DokladAdapter.OnItemClickListener {
    private val skladViewModel: SkladViewModel by viewModels()

    //private val dokladViewModel: DokladViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityDokladBinding.inflate(layoutInflater)
        //setContentView(R.layout.activity_doklad)
        setContentView(binding.root)
        binding.btVybratDoklad.setOnClickListener{
            openActivity(binding.root)
        }
        val skladAdapter = SkladAdapter (this)
        val dokladAdapter = DokladAdapter(this)
        binding.apply {
            recyclerViewSklady.apply {
                adapter = skladAdapter
                layoutManager = LinearLayoutManager(this@DokladActivity)
            }
            skladViewModel.skladyPolozky.observe(this@DokladActivity) {
                skladAdapter.submitList(it)
                Log.d("Doklad", skladAdapter.currentList.toString())
            }
            recyclerViewDoklady.apply {
                adapter = dokladAdapter
                layoutManager = LinearLayoutManager(this@DokladActivity)
            }
            skladViewModel.dokladyPolozky.observe(this@DokladActivity){
                dokladAdapter.submitList(it)
                Log.d("Doklad", dokladAdapter.currentList.toString())
            }
        }
    }

    fun openActivity(view: View){
        val intent = Intent(this,PolozkaActivity::class.java )
        startActivity(intent)
    }

    override fun onItemClick(polozkaSklad: SkladTuple) {
        val action = polozkaSklad.reg
    }

    override fun onItemClick(polozkaHlavicka: DokladTuple) {
        val intent = Intent(this, PolozkaActivity::class.java)
        intent.putExtra("doklad", polozkaHlavicka.doklad)
        //intent.putExtra("polozkaHlavicka", polozkaHlavicka as Serializable)
        startActivity(intent)
    }
}

具有某些功能的存储库:

fun getSelectedDokladyBySklad(sklad: Int) : Flow<List<SkladDokladTuple>>{
        return sybaseDao.getAllDokladFromPolozkaBySklad(sklad)
    }

和 DAO:

@Query("SELECT distinct doklad FROM cis06zebrap where sklad=:skladId")
    fun getAllDokladFromPolozkaBySklad(skladId:Int?=null): Flow<List<SkladDokladTuple>>
@HiltViewModel
class SkladViewModel @Inject constructor(
    repository: SybaseRepository
): ViewModel(){
    val skladyPolozky = repository.getAllSkladFromPolozka().asLiveData()
    val dokladyPolozky = repository.getAllHlavickyToDoklad().asLiveData()
    val testToShow = repository.getSelectedDokladyBySklad(dokladId).asLiveData()


   fun someNameYouFindUseful(id: String) {
      // do something with the id
      ...
      // notify the UI
      someLiveDataYouShoudlBeObservingFromTheUI.value = SomeSealedClassWrappingTheStates.SomeStateYouFindDescriptive

   } 
}

然后在你的 Activity/Fragment 你会做:

  viewModel.someNameYouFindUseful("the Id")

因为您可能在那里有一个 viewModel 参考。

要完成缺失的部分,请查看the Google official documentation about ViewModels,包括如何公开“状态”并对其做出反应。