这是我的
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()
}
}
这是我使用 viewModel 的片段类
AllFilesFragment.kt
。
@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
我在使用 Hilt 时发生了这种情况,那是因为我忘记在片段类顶部添加
@AndroidEntryPoint
注释。
片段和宿主 Activity 都应使用此注释进行注释。
我在应用程序的 build.gradle 中使用
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
后解决了这个问题。我已经添加了kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
。顺便说一句,我仍然不明白两个之间的区别。如果有人知道的话。请给我解释一下。
这是由于 AndroidX Lifecycle、AndroidX Core、AndroidX Activity 和 AndroidX Fragment 之间的版本不匹配导致的。
只有当
getDefaultViewModelProviderFactory
可以被覆盖时,Hilt 才起作用。
仅当该方法确实存在时才是正确的,如果您的依赖项已过时则不会。即,您的
androidx.fragment
低于 1.2.0,并且您的 androidx.activity
低于 1.1.0。
使用这个就会起作用:
implementation "androidx.appcompat:appcompat:1.4.1"
implementation "androidx.core:core-ktx:1.7.0"
implementation "androidx.activity:activity-ktx:1.4.0"
implementation "androidx.fragment:fragment-ktx:1.4.1"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1"
但目前,这就是它对我有用的原因:
buildscript {
ext {
dagger_version = '2.41'
}
dependencies {
classpath "com.google.dagger:hilt-android-gradle-plugin:$dagger_version"
}
和
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'kotlin-kapt'
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:hilt-android:$dagger_version"
kapt "com.google.dagger:hilt-android-compiler:$dagger_version"
kaptTest "com.google.dagger:hilt-android-compiler:$dagger_version"
kaptAndroidTest "com.google.dagger:hilt-android-compiler:$dagger_version"
kapt 'androidx.hilt:hilt-compiler:1.0.0'
@ViewModelInject 在较新的剑柄版本中已弃用
使用
HiltViewModel
@HiltViewModel
class AllFilesListViewModel @Inject constructor(
val pdfItemRepository: PdfItemRepository)
) : ViewModel() {
}
当我使用 Jetpack Compose、Hilt 和 Compose Navigation 时,我的方法是获取文档中的所有依赖项,并确保它们的所有版本都是最新的。关键是当你创建ViewModel时,你不应该使用
= viewModel()
,因为你已经使用了Compose Navigation,应该使用= hiltViewModel()
来代替。
Google 备忘单链接
这个答案适用于使用 Jetpack Compose 和导航 (NavGraph) 的人 根据文档中的Hilt和Navigation,我们必须使用
hiltViewModel
而不是viewModel
示例:
dependencies {
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
}
// import androidx.hilt.navigation.compose.hiltViewModel
@Composable
fun MyApp() {
NavHost(navController, startDestination = startRoute) {
composable("example") { backStackEntry ->
// Creates a ViewModel from the current BackStackEntry
// Available in the androidx.hilt:hilt-navigation-compose artifact
val viewModel = hiltViewModel<MyViewModel>()
MyScreen(viewModel)
}
/* ... */
}
}
SavedStateHandle
传递给视图模型的主构造函数来修复它。
class AuthViewModel @ViewModelInject constructor(@Assisted private val savedState: SavedStateHandle) : ViewModel()
更新 5/03/2023
为了使用 Hilt 注入 ViewModel,请使用:
@HiltViewModel
class AuthViewModel @Inject constructor() : ViewModel()
@AndroidEntryPoint
类名称顶部。像这样:
@AndroidEntryPoint
class YourClassNameFragment: Fragment() {
....
}
Build
文件夹和
rebuild
项目,这将迫使编译器在后台重新创建匕首
dependency graph
。就我而言,我的活动
annotated
仍然面临同样的问题。我已删除我的
@AndroidEntryPoint
文件夹和
build
项目,它正在按预期工作。在alpha03中,现在使用新的@HiltViewModel和普通的@Inject,如下所示。
rebuild
我今天也遇到了这个问题,我尝试了所有可能的修复建议,但无法消除错误。我只是在这里发布我的解决方案,以防将来有人遇到同样的问题。
注意:由于 Hilt 的代码生成需要访问所有使用 Hilt 的 Gradle 模块,因此编译 Application 类的 Gradle 模块还需要在其传递依赖项中包含所有 Hilt 模块和构造函数注入的类。
当我导入生成 DI 图所需的所有模块时,此崩溃消失了。
对我来说解决了当
我正在使用 Java,答案是:
= viewModel()