Dagger-Hilt @AndroidEntryPoint 不适用于 BottomSheetDialogFragment()

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

但是当我尝试构建我的项目时,它给了我这个错误:

\n
Execution 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 运行的输出

\n

https://gist.github.com/javlonrahimov/95de968645cace1dfb6e425381f8014b

\n

如果我删除 BottomSheetFragmen() 上方的 @AndroidEntryPoint,它将构建并安装应用程序。但是当我尝试打开 BottomSheet 时,当我将存储库注入 ViewModel 时,应用程序崩溃了:

\n
java.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

这是我的 BottomSheetDialogFragment

\n

Jav*_*lon 2

经过长时间的研究,我无法解决@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。