當我嘗試使用模擬器啟動應用程式時出錯。嘗試在第 40 和 41 行查找 AlbumListFragment 錯誤。我不明白我做錯了什么。已多次執行此代碼而沒有錯誤。
我還在片段布局中使用 android:text="@{viewModel.response}" 。我不認為資料系結是問題。
有人看到我做錯了嗎?
2022-04-03 18:25:22.687 4959-4959/com.example.mvvmretrofit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mvvmretrofit, PID: 4959
java.lang.RuntimeException: Cannot create an instance of class com.example.retrotest.ui.AlbumsViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:230)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:169)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139)
at com.example.retrotest.ui.AlbumListFragment$onCreateView$viewModel$2.invoke(AlbumListFragment.kt:41)
at com.example.retrotest.ui.AlbumListFragment$onCreateView$viewModel$2.invoke(AlbumListFragment.kt:40)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.example.retrotest.ui.AlbumListFragment.onCreateView$lambda-0(AlbumListFragment.kt:40)
at com.example.retrotest.ui.AlbumListFragment.onCreateView(AlbumListFragment.kt:43)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2995)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:523)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2777)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3020)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:551)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2784)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:262)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:478)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)
at android.app.Activity.performStart(Activity.java:8018)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NoSuchMethodException: com.example.retrotest.ui.AlbumsViewModel.<init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2332)
at java.lang.Class.getConstructor(Class.java:1728)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:228)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:169)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139)
at com.example.retrotest.ui.AlbumListFragment$onCreateView$viewModel$2.invoke(AlbumListFragment.kt:41)
at com.example.retrotest.ui.AlbumListFragment$onCreateView$viewModel$2.invoke(AlbumListFragment.kt:40)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.example.retrotest.ui.AlbumListFragment.onCreateView$lambda-0(AlbumListFragment.kt:40)
at com.example.retrotest.ui.AlbumListFragment.onCreateView(AlbumListFragment.kt:43)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2995)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:523)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2777)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3020)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:551)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2784)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:262)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:478)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)
at android.app.Activity.performStart(Activity.java:8018)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2022-04-03 18:25:23.849 4959-4975/com.example.mvvmretrofit W/System: A resource failed to call close.
專輯串列片段:
class AlbumListFragment : Fragment() {
private val viewModel: AlbumsViewModel by lazy {
ViewModelProvider(this)[AlbumsViewModel::class.java]
}
/**
* Inflates the layout with Data Binding, sets its lifecycle owner to the OverviewFragment
* to enable Data Binding to observe LiveData, and sets up the RecyclerView with an adapter.
*/
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentAlbumListBinding.inflate(inflater)
binding.viewModel = viewModel
// Allows Data Binding to Observe LiveData with the lifecycle of this Fragment
binding.lifecycleOwner = this
// Giving the binding access to the OverviewViewModel
binding.viewModel = viewModel
setHasOptionsMenu(true)
return binding.root
}
/**
* Inflates the overflow menu that contains filtering options.
*/
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.overflow_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
}
}
相冊ViewModel.kt:
class AlbumsViewModel(val application: MyApplication) : AndroidViewModel(application) {
private val _response = MutableLiveData<String>()
val response: LiveData<String>
get() = _response
/**
* Call getMarsRealEstateProperties() on init so we can display status immediately.
*/
init {
getAlbumProperties()
}
/**
* Sets the value of the status LiveData to the Mars API status.
*/
private fun getAlbumProperties() {
AlbumApi.retrofitService.getAllAlbums().enqueue(object: Callback<List<Album>> {
override fun onResponse(call: Call<List<Album>>, response: Response<List<Album>>) {
_response.value = "Success: ${response.body()?.size} Album properties retrieved"
}
override fun onFailure(call: Call<List<Album>>, t: Throwable) {
_response.value = "Failure: " t.message
}
})
_response.value = "Set the Album API Response here!"
}
}
uj5u.com熱心網友回復:
真正的錯誤是下面列出的錯誤
Caused by: java.lang.NoSuchMethodException: com.example.retrotest.ui.AlbumsViewModel.<init> [class android.app.Application]
這個錯誤是因為你的 ViewModel 有一個非標準的建構式(使用你的自定義MyApplication
而不是默認Application
引數)并且提供者工廠找不到它正在尋找的建構式。
你需要改變
AlbumsViewModel(val application: MyApplication)
到
AlbumsViewModel(val application: Application)
讓它作業。
如果您確實需要MyApplication
ViewModel somwewhere 中的實體,您始終可以通過從基類中強制轉換來獲取它,如下所示:
val myapp = getApplication<MyApplication>()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460281.html