【问题标题】:Observe LiveData instance in fragment and activity在片段和活动中观察 LiveData 实例
【发布时间】: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&lt;User&gt; 的实例,以便我可以在活动和片段中观察它。我怎样才能做到这一点?

【问题讨论】:

  • 您可以在 Activity 和 Fragment 之间共享 ViewModel....将父 Activity 实例传递给您的 Fragment 中的ViewModelProviders.of()(如果使用 Koin,最好使用 sharedViewModel!)
  • 我想我已经这样做了,我传递给 ViewModelProviders.of()this 实例就是活动本身
  • 将用户数据从 FragmentViewModel 保存到数据库。为您的活动定义另一个视图模型并订阅您的活动以观察此数据库中的变化。我认为这将更清晰地实施和理解@NelsonAlmendra

标签: android android-fragments mvvm android-livedata android-viewmodel


【解决方案1】:

在 MyViewModel 类中创建

    val userLiveData =MutableLiveData<User>()

和吸气剂

    fun getUserLiveData(id: String): MutableLiveData<User> {
            return userLiveData
    }

    fun getUser(id: String){
    val disposableUser = repository.getUser(id)
    .subscribe({
        userLivedata.postValue(it)
    })

}

并在活动或片段中调用

   myViewModel.getUserLiveData.observe(this, Observer { it ->
      //TODO
    })
   myViewModel.getUser(...)

现在在 ViewModel 中你有对象 User (userLiveData.getValue())

【讨论】:

    【解决方案2】:

    Activity中的写入方法doSomethingWithUser(user: User)

    在你的实时数据中

    myViewModel.getUser(editText.text.toString()).observe(this, Observer { it ->
                (requireActivity() as MainActivity).doSomethingWithUser(it)
            })
    

    【讨论】:

      【解决方案3】:

      在片段中(作为最佳实践)应该使用

      viewModel.userLiveData.observe(viewLifecycleOwner, Observer {
          //your code here
      })
      

      在活动中使用

      viewModel.userLiveData.observe(this, Observer {
              //your code here
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-21
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多