首页 > 解决方案 > 在片段内获取共享视图模型时出错

问题描述

这是我的视图模型类

class SharedViewModel(val repo :repository) :ViewModel(){
    var category : MutableLiveData<MutableList<Category>> = MutableLiveData()
    var models : MutableLiveData<MutableList<Models>> = MutableLiveData()
    init {
        getCategories()
    }
    private fun getCategories()
    {
         category =repo.getCategories()
    }
    fun getModels(collection: String)
    {
       models = repo.getModels(collection)
    }
}

我正在活动中创建视图模型,然后在片段中共享视图模型一切正常,突然间它破坏了活动类 MainActivity 的代码:AppCompatActivity() {

lateinit var activitySharedViewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val repository = repository()
    val viewModelProviderFactory = ViewModelProviderFactory(repository)
     activitySharedViewModel =  ViewModelProvider(this, viewModelProviderFactory).get(SharedViewModel::class.java)



}

}

这是片段的代码

class CategoryFragment : Fragment() {

lateinit var categoryAdapter : CategoryAdapter
lateinit var  sharedViewModels : SharedViewModel
lateinit var binding : FragmentCategoryBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    binding = DataBindingUtil.inflate(inflater,R.layout.fragment_category, container, false)
    categoryAdapter= CategoryAdapter()
   sharedViewModels = (activity as MainActivity).activitySharedViewModel

    categoryAdapter.setOnItemClickListener {
        val bundle = Bundle().apply {
            putString("model",it.CategoryName)
        }
        findNavController().navigate(R.id.action_categoryFragment_to_modelListFragment,bundle)
    }
    binding.rvCategory.adapter= categoryAdapter

   sharedViewModels.category.observe(viewLifecycleOwner, { response ->

        Log.e("list", response.toString())
        categoryAdapter.differ.submitList(response.toList())
    })

    return binding.root
}


}

这是我得到的错误

   2020-11-26 16:09:31.015 13509-13509/com.infinity.modelviewerapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.infinity.modelviewerapp, PID: 13509
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.infinity.modelviewerapp/com.infinity.modelviewerapp.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:52)
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:34)
        at com.infinity.modelviewerapp.ui.ModelViewFragment.getArgs(Unknown Source:4)
        at com.infinity.modelviewerapp.ui.ModelViewFragment.onCreateView(ModelViewFragment.kt:33)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2950)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:277)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2094)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3122)
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3049)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2975)
        at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:276)
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:141)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:313)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:292)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
        at com.infinity.modelviewerapp.MainActivity.onCreate(MainActivity.kt:15)
        at android.app.Activity.performCreate(Activity.java:7183)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
2020-11-26 16:09:31.027 13509-13509/com.infinity.modelviewerapp E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: java.lang.IllegalArgumentException: Required argument "model" is missing and does not have an android:defaultValue
        at com.infinity.modelviewerapp.ui.ModelListFragmentArgs$Companion.fromBundle(ModelListFragmentArgs.kt:29)
        at com.infinity.modelviewerapp.ui.ModelListFragmentArgs.fromBundle(Unknown Source:2)
            ... 42 more

标签: androidkotlinmvvmviewmodelandroid-jetpack-navigation

解决方案


实现 'androidx.fragment:fragment-ktx:1.3.0-beta01' 导致了这个问题


推荐阅读