Lateinit Property Homeviewmodel Has Not Been Initialized
Solution 1:
- Try initialise your viewModel inside
onActivityCreated()
- Don't observe or initiate you ViewModel inside
onCreateView()
- Rename your class name from
homeFragment
toHomeFragment
andhomeViewModel
toHomeViewModel
- 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 initialize
ViewModel 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"