ViewModel for Fragment instead accessing Activity ViewModel?

后端 未结 4 1939
醉话见心
醉话见心 2021-01-30 05:35

The problem is quite straightforward. The question is in context of using ViewModels, LiveData and other related Lifecycle aware arch approaches.
I have an Activity with Na

相关标签:
4条回答
  • 2021-01-30 06:16

    This is updated version of answer given by Jeel Vankhede. And also Kotlin implementation of the same.

    Since ViewModelProviders is deprecated now we have to use ViewModelProvider.

    Here is how you do it in Activity:

    ViewModelProvider(this).get(MyActivityViewModel::class.java)
    

    Here is how you do in Fragment:

    ViewModelProvider(requireActivity()).get(MyActivityViewModel::class.java)
    
    0 讨论(0)
  • 2021-01-30 06:21

    First there is no harm in having multiple ViewModel's for a single View.

    I would think about my ViewModel's like what kind of data is getting and manipulating, and group them in a way, that seems natural.

    For your case, if the fragments and the activity's logic is very similar, I think you can go with a single ViewModel, but I would avoid that.

    What I would do is break the activity's ViewModel into smaller parts and reuse the proper ViewModel's in my Fragments, so that I wouldn't have a God ViewModel, nor roughly the same code in different ViewModel's.

    0 讨论(0)
  • 2021-01-30 06:24

    What i would suggest you can do is handle two ViewModel for your entire use case.

    Make one ViewModel

    Let's say MyActivityViewModel to handle all logic related for activity level. So, if any fragment logic is directly related to your activity then share your ViewModel like below :

    ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.
    

    &

    ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.
    

    This will share common ViewModel between your activity and fragment.


    Another ViewModel would go for FirstFragment in your case if you have to share logic between your ChildFragment :

    Here you can share ViewModel let's say FragmentViewModel like below:

    ViewModelProviders.of(this).get(FragmentViewModel.class); // Like this in FirstFragment which is having view pager.
    

    &

    ViewModelProviders.of(getParentFragment()).get(FragmentViewModel.class); // Like this in View pager fragments, getParentFragment() is First fragment in our case.
    

    Although, we can still use our activity level MyActivityViewModel in our child fragments from FirstFragment like :

    ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);
    
    0 讨论(0)
  • 2021-01-30 06:28

    To solve the problem of FirstFragment sharing its view model with its child fragments, you can use this code to access the FirstFragmentViewModel from any of the child fragments:

        // in ChildFragment1
        val firstFragmentViewModel: FirstFragmentViewModel by viewModels(
            { requireParentFragment() }
        )
    
    
    0 讨论(0)
提交回复
热议问题