Aquí está mi clase AllFilesListViewModel .
class AllFilesListViewModel @ViewModelInject constructor( private val pdfItemRepository: PdfItemRepository):ViewModel() { } Aquí está la clase PdfItemRepository .
@Singleton class PdfItemRepository @Inject constructor(private val pdfItemDao: PdfItemDao){ } Para pdfItemDao . Creé un módulo llamado DatabaseModule . A continuación se muestra el código -
@Module @InstallIn(ApplicationComponent::class) object DatabaseModule { @Provides fun provideDatabase(@ApplicationContext context: Context):AppDatabase{ return AppDatabase.getDataBase(context) } @Provides fun providePdfItemDao(database:AppDatabase):PdfItemDao{ return database.pdfItemDao() } } Aquí está la clase de fragmento AllFilesFragment.kt donde estoy usando viewModel.
@AndroidEntryPoint class AllFilesFragment:Fragment(){ private lateinit var binding:AllFilesFragmentBinding private val viewModel by viewModels<AllFilesListViewModel>() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = AllFilesFragmentBinding.inflate(inflater,container,false) context?: return binding.root initThings() subscribeUi() return binding.root } } Aquí está el archivo logcat .
06-19 19:22:20.203 23753-23753/com.emptysheet.pdfreader_autoscroll E/AndroidRuntime: FATAL EXCEPTION: main Process: com.emptysheet.pdfreader_autoscroll, PID: 23753 java.lang.RuntimeException: Cannot create an instance of class com.emptysheet.pdfreader_autoscroll.homeScreen.viewModel.AllFilesListViewModel at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278) at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106) at androidx.hilt.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:69) at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41) at com.emptysheet.pdfreader_autoscroll.homeScreen.AllFilesFragment.getViewModel(AllFilesFragment.kt) at com.emptysheet.pdfreader_autoscroll.homeScreen.AllFilesFragment.subscribeUi(AllFilesFragment.kt:72) at com.emptysheet.pdfreader_autoscroll.homeScreen.AllFilesFragment.onCreateView(AllFilesFragment.kt:64) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356) at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434) at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:442) at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947) at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818) at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:297) at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:341) at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276) at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67) at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556) at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860) at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:148) at com.google.android.material.appbar.VEsto se debe a una discrepancia de versión entre AndroidX Lifecycle, AndroidX Core, AndroidX Activity y AndroidX Fragment.
Hilt solo funciona si se puede anular getDefaultViewModelProviderFactory .
Esto solo es cierto si ese método realmente existe, lo que no ocurre si sus dependencias están desactualizadas. Es decir, su androidx.fragment es inferior a 1.2.0 y su actividad de androidx.activity es inferior a 1.1.0.
Usa esto y funcionará:
implementation "androidx.appcompat:appcompat:1.1.0" implementation "androidx.fragment:fragment-ktx:1.2.5" implementation "androidx.core:core-ktx:1.3.0" implementation "androidx.activity:activity:1.1.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"Pero actualmente, esto es lo que hace que funcione para mí:
implementation 'com.google.dagger:dagger:2.28' kapt 'com.google.dagger:dagger-compiler:2.28' // hilt implementation 'com.google.dagger:hilt-android:2.28-alpha' kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha' kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha' kaptTest 'com.google.dagger:hilt-android-compiler:2.28-alpha' implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01' kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'Junto con
apply plugin: 'dagger.hilt.android.plugin'Y
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'Esto se resolvió después de usar kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01' en build.gradle de la aplicación. Ya había agregado kapt "com.google.dagger:hilt-android-compiler:2.28-alpha" . Todavía no entendía la diferencia entre dos BTW. Si alguien sabe Por favor, explícamelo.
Enfrenté este problema antes y lo solucioné pasando SavedStateHandle al constructor principal del modelo de vista.
class AuthViewModel @ViewModelInject constructor(@Assisted private val savedState: SavedStateHandle) : ViewModel()Esto me sucede cuando uso Hilt, y la causa del problema fue que olvidé agregar la anotación @AndroidEntryPoint encima de la clase de fragmento. Tanto el fragmento como la actividad del anfitrión deben anotarse con esta anotación.
Para aquellos que verificaron todas las soluciones anteriores y aún no funcionan, la verificación final es eliminar la carpeta Build y rebuild el proyecto, esto obligará al compilador a volver a crear el dependency graph de la daga debajo del capó.
En mi caso, he annotated mi actividad con @AndroidEntryPoint y todavía tengo el mismo problema. Eliminé mi carpeta de build y rebuild el proyecto y funciona como se esperaba.
@ViewModelInject está obsoleto en la versión de empuñadura más nueva
Usar HiltViewModel
@HiltViewModel class AllFilesListViewModel @Inject constructor( val pdfItemRepository: PdfItemRepository) ) : ViewModel() { }En alpha03, use el nuevo @HiltViewModel y el @Inject normal ahora como se muestra a continuación.
@HiltViewModel class MyViewModel @Inject constructor( private val repository: Repository, private val savedStateHandle: SavedStateHandle ) : ViewModel(), LifecycleObserver { // Some code }También me he enfrentado a este problema hoy, probé todas las posibles soluciones sugeridas, pero fue imposible eliminar el error. Solo publico mi solución aquí en caso de que alguien tenga el mismo problema en el futuro.
En mi caso, tengo un proyecto de varios módulos, con 'módulo UI', 'módulo ViewModel' y 'módulo de casos de uso'. El error de mi parte fue que no estaba importando todos los módulos en el módulo gradle de la aplicación, solo estaba importando el módulo UI. Encontré esta nota en el sitio web de desarrolladores de Android con respecto a la implementación de la empuñadura:
Nota: Debido a que la generación de código de Hilt necesita acceso a todos los módulos de Gradle que usan Hilt, el módulo de Gradle que compila su clase de aplicación también necesita tener todos sus módulos de Hilt y clases inyectadas por el constructor en sus dependencias transitivas.
Cuando importé todos los módulos que se necesitaban para generar el gráfico DI, este bloqueo desapareció.
Cuando uso Jetpack Compose, Hilt y Compose Navigation, mi enfoque es obtener todas las dependencias en los documentos y asegurarme de que todas sus versiones estén actualizadas. La clave es cuando crea ViewModel, no debe usar = viewModel() porque tiene que usar Compose Navigation, = hiltViewModel() debe usarse en su lugar.