Невозможно создать экземпляр модели просмотра после использования Hilt в Android

Вот мой AllFilesListViewModel класс.

class AllFilesListViewModel @ViewModelInject constructor(
    private val pdfItemRepository: PdfItemRepository):ViewModel() {

}

Вот PdfItemRepository класс.

@Singleton
class PdfItemRepository @Inject constructor(private val pdfItemDao: PdfItemDao){

}

Для pdfItemDao. Я создал модуль с именем DatabaseModule. Ниже приведен код -

@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()
    }
}

Вот класс фрагмента AllFilesFragment.kt, в котором я использую 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
    }
}

Вот 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.V

person Rajesh kumar    schedule 19.06.2020    source источник


Ответы (8)


Это было решено после того, как я использовал kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01' в build.gradle приложения. Я уже добавил kapt "com.google.dagger:hilt-android-compiler:2.28-alpha". Я все еще не понимал разницы между двумя BTW. Если кто знает. Пожалуйста, объясните мне это.

person Rajesh kumar    schedule 20.06.2020
comment
Для поддержки @ViewModelInject вы также должны включить депо генерации кода. Дополнительные сведения см. В официальных документах. - person theapache64; 31.07.2020
comment
Это решило мою проблему. Подумать только, я потерял так много времени из-за того, что не стал внимательно изучать документы. @Rajesh, я думаю, что ссылка в комментарии theapache64 может дать некоторое объяснение. - person Eaweb; 17.08.2020

это происходит со мной при использовании Hilt, и для меня причиной проблемы было то, что я забыл добавить @AndroidEntryPoint поверх класса фрагмента

person Mohammed Fathi    schedule 23.09.2020

Это вызвано несоответствием версий жизненного цикла AndroidX, AndroidX Core, AndroidX Activity и AndroidX Fragment.

Рукоять работает, только если getDefaultViewModelProviderFactory можно переопределить.

Это верно только в том случае, если этот метод действительно существует, чего нет, если ваши зависимости устарели. А именно, ваш androidx.fragment ниже 1.2.0, а ваш androidx.activity ниже 1.1.0.

Используйте это, и это сработает:

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"

Но в настоящее время это то, что заставляет меня работать:

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'

Вместе с

 apply plugin: 'dagger.hilt.android.plugin'

А также

    classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
    
person EpicPandaForce    schedule 19.06.2020
comment
Я обновил зависимость. Но все равно не работает. - person Rajesh kumar; 20.06.2020
comment
Также, когда я открыл файлы, созданные Hilt. Существует переопределенный getDefaultViewModelFactory. - person Rajesh kumar; 20.06.2020

@ViewModelInject устарел в новой версии рукояти.

Справочник

Используйте 1_

@HiltViewModel
class AllFilesListViewModel @Inject constructor(
    val pdfItemRepository: PdfItemRepository)
) : ViewModel() {

}
person Vatsal kesarwani    schedule 31.05.2021

Я сталкивался с этой проблемой раньше и исправил ее, передав SavedStateHandle в главный конструктор модели представления.

class AuthViewModel @ViewModelInject constructor(@Assisted private val savedState: SavedStateHandle) : ViewModel()
person Amjad Alwareh    schedule 27.06.2020

Для тех, кто проверил все вышеперечисленные решения и все еще не работает, последняя проверка - удалить папку Build и rebuild проект, это заставит компилятор заново создать кинжал dependency graph под капотом.

В моем случае у меня annotated мои действия, а @AndroidEntryPoint все еще сталкивается с той же проблемой. Я удалил свою build папку и rebuild проект, и он работает должным образом.

person Fazal Hussain    schedule 21.04.2021

В alpha03 используйте новую модель @HiltViewModel и обычный @Inject, как показано ниже.

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {

    // Some code
}
person AndresElCaraDeMemela    schedule 22.06.2021

Я тоже столкнулся с этой проблемой сегодня, я попробовал все возможные исправления, но удалить ошибку не удалось. Я просто публикую здесь свое решение на случай, если у кого-то в будущем возникнет такая же проблема.

В моем случае у меня есть многомодульный проект с «модулем пользовательского интерфейса», «модулем ViewModel» и «модулем вариантов использования». Ошибка с моей стороны заключалась в том, что я не импортировал все модули в модуле gradle приложения, я импортировал только модуль пользовательского интерфейса. Я нашел эту заметку на сайте разработчиков Android относительно реализации рукояти:

Примечание. Поскольку для генерации кода Hilt требуется доступ ко всем модулям Gradle, которые используют Hilt, модуль Gradle, который компилирует ваш класс Application, также должен иметь все ваши модули Hilt и классы, внедренные конструктором, в своих транзитивных зависимостях.

Когда я импортировал все модули, необходимые для создания графика DI, этот сбой исчез.

person Luis Pascual    schedule 25.06.2021