lateinit属性homeViewModel尚未初始化 [英] lateinit property homeViewModel has not been initialized

查看:238
本文介绍了lateinit属性homeViewModel尚未初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到问题,我在 fragment_home.xml 中添加了三个textView(textView,textView2,textView3)和imageView,当我尝试在Android Studio中的模拟器上运行应用程序时,出现错误 lateinit属性homeViewModel尚未初始化.

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 I get the error lateinit property homeViewModel has not been initialized.

homeFragment.kt

homeFragment.kt

class homeFragment : Fragment() {

    private lateinit var homeViewModel: homeViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        homeViewModel =
            ViewModelProviders.of(this).get(homeViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        val textView: TextView = root.findViewById(R.id.text_home)
        homeViewModel.text.observe(this, Observer {
            textView.text = it
        })
        return root
    }
}

错误日志

6728-6728/com.radex.mysummercarmanual E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.radex.mysummercarmanual, PID: 6728
    kotlin.UninitializedPropertyAccessException: lateinit property homeViewModel has not been initialized
        at com.radex.mysummercarmanual.ui.home.homeFragment.onCreateView(homeFragment.kt:23)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2372)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2466)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
        at android.app.Activity.performStart(Activity.java:7157)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2937)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

推荐答案

  • 尝试在onActivityCreated()
  • 中初始化viewModel
  • 不要观察或初始化onCreateView()
  • 中的ViewModel
  • 将类名从homeFragment重命名为HomeFragment,从homeViewModel重命名为HomeViewModel
  • 您无需在Kotlin中执行findViewMyId.您可以直接访问查看ID.
  • 改变的想法在下面

    • 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

      class HomeFragment : Fragment() {
      
      private lateinit var homeViewModel: HomeViewModel
      
      override fun onCreateView(
          inflater: LayoutInflater,
          container: ViewGroup?,
          savedInstanceState: Bundle?
      ): View? {
          val root = inflater.inflate(R.layout.fragment_home, container, false)
          return root
      }
      
      
      override fun onActivityCreated(savedInstanceState: Bundle?) {
          super.onActivityCreated(savedInstanceState)
          homeViewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
          homeViewModel.text.observe(this, Observer {
              text_home.text = it
          })
      }
      }
      

    • 这篇关于lateinit属性homeViewModel尚未初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆