努力获得相同的ViewModel实例

时间:2018-06-03 08:18:46

标签: android kotlin android-viewmodel

我不确定我是否在Android中正确理解ViewModelProvider架构。我认为ViewModel生命周期与活动相关联,因此我们期望相同的实例,如果我们将活动或片段上下文传递给class MainViewModel : ViewModel() { var teamName: String = "Warriors"; } 并不重要?

无论如何,这是我的ViewModel:

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

        viewModel.teamName = "Cavaliers";
        Log.d("YouQi", "activity viewModel.teamName: ${viewModel.teamName}");

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow()
        }
    }
}

这是我的活动:

class MainFragment : androidx.fragment.app.Fragment() {
    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        Log.d("YouQi", "fragment viewModel.teamName: ${viewModel.teamName}");
    }

}

最后这是我的片段:

2018-06-03 16:06:24.591 31124-31124/com.axzae.zapkotlin D/YouQi: activity viewModel.teamName: Cavaliers
2018-06-03 16:06:24.652 31124-31124/com.axzae.zapkotlin D/YouQi: fragment viewModel.teamName: Warriors

我在Logcat中得到以下输出:

{{1}}

它显示价值没有更新给骑士队。我错误地使用ViewModel并且应该使用Dagger来实现单例吗?

2 个答案:

答案 0 :(得分:3)

您使用的是ViewModelProvider - 来自活动还是来自片段。请尝试使用ViewModelProviders.of(getActivity())作为片段。

这实际上非常方便 - 您可以分别保留与片段相关的模型和更一般的活动绑定模型。

答案 1 :(得分:1)

不,您不需要使用依赖注入来实现ViewModel中的单例。您可以将活动上下文传递给ViewModel,如下所示:

viewModel = ViewModelProviders.of(activity).get(MainViewModel::class.java)// by this you will get the same value of teamName as your activity