LoginSignup
0
2

More than 5 years have passed since last update.

koin + ViewModelでDialogFragmentから値を受け取る

Posted at

背景

Share data between fragments
をkoin + DialogFragmentに適用したらこんな感じ?

実装

MainActivity.kt
class MainActivity : AppCompatActivity() {
  private val model by viewModel<MainViewModel>()
  private val sharedViewModel by viewModel<MainDialogFragment.SharedViewModel>() // 2

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    binding.button.setOnClickListener {
      MainDialogFragment().show(this.supportFragmentManager, MainDialogFragment.TAG)
    }
    this.sharedViewModel.selected.observe(this, Observer { selected -> // 4
      this.model.string.postValue(selected)
    })
  }
}
MainDialogFragment.kt
class MainDialogFragment : DialogFragment() {
  private val sharedViewModel by sharedViewModel<SharedViewModel>() // 3

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    val binding = DataBindingUtil.inflate<FragmentMainDialogBinding>(inflater, R.layout.fragment_main_dialog, container, false)
    binding.buttonDone.setOnClickListener {
      this.sharedViewModel.selected.postValue(binding.editText.text.toString()) // 5
      this.dismiss()
    }
    return binding.root
  }

  class SharedViewModel : ViewModel() { // 1
    val selected = MutableLiveData<String>()
  }
}
  1. SharedViewModelはDialogFragmentの持ち物とする
  2. Activity(DialogFragmentを表示する)側:ViewModelをinject
  3. DialogFragment側:sharedViewModelでActivityと共有されたViewModelをinject
  4. Activity側:DialogFragmentでの変更を待ち受ける
  5. DialogFragment側:postValueで変更を伝える
0
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2