Skip to content Skip to sidebar Skip to footer

Lateinit Property Homeviewmodel Has Not Been Initialized

I have a problem, I added three textView (textView, textView2, textView3) and imageView to fragment_home.xml and when I try to run the application on the emulator in Android Studio

Solution 1:

  • Try initialise your viewModel inside onActivityCreated()
  • Don't observe or initiate you ViewModel inside onCreateView()
  • Rename your class name from homeFragment to HomeFragment and homeViewModel to HomeViewModel
  • You don't need to do findViewMyId in Kotlin. you can access view directly ID.
  • The change Idea is bellow

    classHomeFragment : Fragment() {
    
    privatelateinitvar homeViewModel: HomeViewModel
    
    overridefunonCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        return root
    }
    
    
    overridefunonActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        homeViewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
        homeViewModel.text.observe(this, Observer {
            text_home.text = it
        })
    }
    }
    

Solution 2:

When you initialize homeViewModel, you reference an uninitialized one so it gives you the error.

ViewModelProviders.of(this).get(***homeViewModel***::class.java)

I think the class name of your ViewModel should be HomeViewModel, so try this one:

privatelateinitvar homeViewModel: HomeViewModel

...

homeViewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)

Solution 3:

According to your code, as you're inside fragment do not initializeViewModel inside onCreateView(), simply means let the view create first then initilalize viewModel. To initialize viewModel you have to override onActivityCreated() method and initialize viewModel inside it. Your code will be like this:

overridefunonActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState) 
    homeViewModel = ViewModelProviders.of(activity!!)[HomeViewModel::class.java]
    homeViewModel.text.observe(this, Observer {
        text_home.text = it
    })
}

And notice here i pass activity!! rather than this, cause you just can't get the activity context or getActivity() directly whenever you're inside the fragment just by calling this. You have to tell manually. So your viewModel instantiation will be like this:

homeViewModel = ViewModelProviders.of(activity!!)[HomeViewModel::class.java]

Or You could use if block, like this:

overridefunonActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    if(!::homeViewModel.isInitialized){ 
    homeViewModel = ViewModelProviders.of(activity!!)[HomeViewModel::class.java]
    homeViewModel.text.observe(this, Observer {
        text_home.text = it
    })
 }
}

Post a Comment for "Lateinit Property Homeviewmodel Has Not Been Initialized"