如何使用视图模型将数据从 DialogFragment 发送到 Fragment

How to send data from DialogFragment to Fragment using viewmodel

我正在尝试使用 ViewModel 将数据从 DialogFragment 发送到 Fragment,但似乎片段和 Dialog 片段都引用了不同的 ViewModel 实例。所以我无法访问数据。有什么办法可以解决这个问题吗?谢谢

这是我的片段

@AndroidEntryPoint
class FragmentToReceiveData:BaseFragment(R.layout.fragment_1){
   private val viewModel: AddScheduleViewModel by viewModels()
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      Log.d(TAG, "onViewCreated: $viewModel")   // will print ...MyViewModel@62274cc  

      viewModel.dataFromDialog.observe(viewLifecycleOwner){
         //nothing happens
      } 
   }
   .
   .
   .
   private fun openDialog(){
    val action=FragmentToReceiveDataDirections.actionFragmentToReceiveDataToExampleDialog()
    findNavController().navigate(action)
    //exampleDialog.show(requireActivity().supportFragmentManager, "alarmDialog") //same issue      
   }
   
}

这是视图模型:

class MyViewModel @ViewModelInject constructor(){
   var dataFromDialog=MutableLiveData<SomeClass>()
   
   fun saveDataFromDialog(data:SomeClass){
     dataFromDialog.value=data      
   }
 }

这是我的 DialogFragment

@AndroidEntryPoint
class ExampleDialog:DialogFragment() {
  val viewModel:MyViewModel by viewModels()
  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    Log.d(TAG, "onCreateDialog: $viewModel")   // will print ...MyViewModel@125436
    .
    .
    .
    viewMode.saveDataFromDialog(data)
  }
}

P.S:我使用的是单一 activity 架构,所以我不确定 activityViewModels() 是否是个好主意

为了在片段之间共享 ViewModel,您可以使用 activityViewModels()。例如,

class SharedViewModel : ViewModel() {
    ...
}

class MasterFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ...
    }
}

class DetailFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ...
    }
}

请在此处的 android 文档中阅读更多内容:https://developer.android.com/topic/libraries/architecture/viewmodel#sharing