【发布时间】:2019-08-04 00:14:18
【问题描述】:
我有一个简单的场景,我在片段中做某事,当我收到 LiveData 时,我想在 Activity 中做某事。
视图模型:
class MyViewModel(application: Application) : AndroidViewModel(application) {
...
fun getUser(id: String): LiveData<User> {
return repository.getUser(id)
}
}
片段:
class MyFragment : Fragment() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.run {
myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
} ?: throw Exception("Invalid Activity")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
button.setOnClickListener {
showProgressBar()
myViewModel.getUser(editText.text.toString()).observe(this, Observer { it ->
//TODO
})
}
}
}
活动:
class MainActivity : AppCompatActivity() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
//Here I would like to observe the user instance returned from the getUser() method
}
}
所以我遇到的问题是我想在MyViewModel 中有一个LiveData<User> 的实例,以便我可以在活动和片段中观察它。我怎样才能做到这一点?
【问题讨论】:
-
您可以在 Activity 和 Fragment 之间共享 ViewModel....将父 Activity 实例传递给您的 Fragment 中的
ViewModelProviders.of()(如果使用 Koin,最好使用sharedViewModel!) -
我想我已经这样做了,我传递给
ViewModelProviders.of()的this实例就是活动本身 -
将用户数据从 FragmentViewModel 保存到数据库。为您的活动定义另一个视图模型并订阅您的活动以观察此数据库中的变化。我认为这将更清晰地实施和理解@NelsonAlmendra
标签: android android-fragments mvvm android-livedata android-viewmodel