Jav*_*lon 5 android gradle dagger-hilt bottomsheetdialogfragment
我在 BottomSheetDialogFragmet() 中使用 ViewModel,所以我必须用 @AndroidEntryPoint 标记我的 BottomSheet。
\n@AndroidEntryPoint\nclass SearchAddressDialog : BottomSheetDialogFragment() {\n\n private val viewModel: MyAddressesViewModel by viewModels()\n \n ......\n}\n
Run Code Online (Sandbox Code Playgroud)\n但是当我尝试构建我的项目时,它给了我这个错误:
\nExecution failed for task \':app:kaptDebugKotlin\'.\n> A failure occurred while executing \norg.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction\n> java.lang.reflect.InvocationTargetException (no error message)\n\n* Try:\nRun with --stacktrace option to get the stack trace. Run with --info or --debug option \nto get more log output. Run with --scan to get full insights.\n
Run Code Online (Sandbox Code Playgroud)\n这是我使用 --stacktrace 运行的输出
\nhttps://gist.github.com/javlonrahimov/95de968645cace1dfb6e425381f8014b
\n如果我删除 BottomSheetFragmen() 上方的 @AndroidEntryPoint,它将构建并安装应用程序。但是当我尝试打开 BottomSheet 时,当我将存储库注入 ViewModel 时,应用程序崩溃了:
\njava.lang.RuntimeException: Cannot create an instance of class uz.unical.other.ui.my_addresses.view_model.MyAddressesViewModel\n at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)\n at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)\n at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)\n at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)\n at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\n at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)\n at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)\n at uz.unical.other.ui.my_addresses.dialogs.SearchAddressDialog.getViewModel(SearchAddressDialog.kt:26)\n at uz.unical.other.ui.my_addresses.dialogs.SearchAddressDialog.onResume(SearchAddressDialog.kt:86)\n at androidx.fragment.app.Fragment.performResume(Fragment.java:3039)\n at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:607)\n at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:306)\n at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)\n at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)\n at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)\n at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)\n at android.os.Handler.handleCallback(Handler.java:938)\n at android.os.Handler.dispatchMessage(Handler.java:99)\n at android.os.Looper.loop(Looper.java:246)\n at android.app.ActivityThread.main(ActivityThread.java:8528)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\n Caused by: java.lang.InstantiationException: java.lang.Class<uz.unical.other.ui.my_addresses.view_model.MyAddressesViewModel> has no zero argument constructor\n at java.lang.Class.newInstance(Native Method)\n at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)\n at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)\xc2\xa0\n at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)\xc2\xa0\n at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)\xc2\xa0\n at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\xc2\xa0\n at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)\xc2\xa0\n at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)\xc2\xa0\n at uz.unical.other.ui.my_addresses.dialogs.SearchAddressDialog.getViewModel(SearchAddressDialog.kt:26)\xc2\xa0\n at uz.unical.other.ui.my_addresses.dialogs.SearchAddressDialog.onResume(SearchAddressDialog.kt:86)\xc2\xa0\n at androidx.fragment.app.Fragment.performResume(Fragment.java:3039)\xc2\xa0\n at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:607)\xc2\xa0\n at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:306)\xc2\xa0\n at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)\xc2\xa0\n at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)\xc2\xa0\n at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)\xc2\xa0\n at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)\xc2\xa0\n at android.os.Handler.handleCallback(Handler.java:938)\xc2\xa0\n at android.os.Handler.dispatchMessage(Handler.java:99)\xc2\xa0\n at android.os.Looper.loop(Looper.java:246)\xc2\xa0\n at android.app.ActivityThread.main(ActivityThread.java:8528)\xc2\xa0\n at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\xc2\xa0\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n@AndroidEntryPoint在其他普通片段上工作没有错误。
\n更新:
\n这是我的视图模型:
\n@HiltViewModel\nclass MyAddressesViewModel @Inject constructor(\n private val repository: AddressRepository,\n private val geocoderRepository: GeocoderRepository\n) : ViewModel() {}\n
Run Code Online (Sandbox Code Playgroud)\n更新 2:\n现在我正在注释 BottomSheetDialogFragment(),它在构建时给我错误。
\n如果我改变这个
\n@AndroidEntryPoint\nclass SearchAddressDialog : BottomSheetDialogFragment(){\n
Run Code Online (Sandbox Code Playgroud)\n对此
\n@AndroidEntryPoint\nclass SearchAddressDialog : Fragment() {\n
Run Code Online (Sandbox Code Playgroud)\n它工作得很好。
\n我真的可以用 @AndroidEntryPoint 注释 BottomSheetDialogFragment() 吗?
\n更新3:
\n\n经过长时间的研究,我无法解决@AndroidEntryPoint问题。我想出了这个:我只是将 ViewModel 传递给其构造函数中的 BottomSheetDialogFragment:
class SearchAddressDialog(
private val viewModel: MyAddressesViewModel
) : BottomSheetDialogFragment() {
........
}
Run Code Online (Sandbox Code Playgroud)
我这样打开对话框:
val dialog = SearchAddressDialog(viewModel)
dialog.show(childFragmentManager, SearchAddressDialog.TAG)
Run Code Online (Sandbox Code Playgroud)
我已经使用了当前片段的ViewModel。
归档时间: |
|
查看次数: |
4966 次 |
最近记录: |