在 Dagger Hilt 查看模型 1.0.0-alpha01
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01"
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
我可以使用下面的
class MyViewModel @ViewModelInject constructor(
private val repository: Repository,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {
// Some codes...
}
但是,当我迁移到 Dagger Hilt View Model 1.0.0-alpha03 时
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
implementation 'com.google.dagger:hilt-android:2.31.2-alpha'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'
我收到警告
'Assisted' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'Assisted' is deprecated. Deprecated in Java
新的工作方式是什么?
在alpha03中,现在使用新的
@HiltViewModel
和普通的@Inject
,如下所示。
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {
// Some code
}
在匕首柄的上次更新中,他们做了一些更改,因此在您的情况下,您可以使用
@HiltViewModel
和 @Inject
将其与 ViewModel 一起使用。
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {
// Some codes...
}
此外,如果您使用的是
ApplicationComponent
,在最新的更新中它已更改为 SingletonComponent
。@Module
@InstallIn(SingletonComponent::class.java)
object hiltmodel....{}
@ViewModelInject 已弃用,并已被 @HiltViewModel 取代。
用 HiltViewModel 注解的 ViewModel 将可供 HiltViewModelFactory 创建。包含带有 Inject 注解的构造函数的 HiltViewModel 将在 Dagger 的 Hilt 注入的构造函数参数中定义其依赖项。 https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel
一个简单的 ViewModel 现在看起来像这样:
@HiltViewModel
class MainViewModel @Inject constructor(application: Application) :
AndroidViewModel(application) {
}
or
@HiltViewModel
class MainViewModel @Inject constructor() :
ViewModel() {
}
whatever your use case might be.
将 hilt 升级到 v2.31+ 后出现以下错误?:
2021-04-02 20:05:22.443 3718-3718/com.demo.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.demo.app, PID: 3718
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.demo.app/com.demo.app.ux.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.demo.app.ux.viewmodels.MainViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) .....
尝试了here中提到的大部分内容,还添加了一个带有模型视图提供程序API的单独模块,但是这些都不起作用,升级时错过的一件事就是更改类路径版本。
因此,为了完成这项工作,我们需要将类路径更新为 2.31 及以上版本,该版本存在于您的项目 gradle 中:
classpath "com.google.dagger:hilt-android-gradle-plugin:2.31-alpha"
2021 年 1 月之前的发布不支持最新的 @HiltViewModel 注释。
因此在项目级别gradle中的依赖项中将hilt版本替换为2.33-beta
buildscript{
ext.hiltVersion = "2.33-beta"
dependencies{
classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
}
}
并在视图模型类中而不是构造函数之前的 @viewmodelinject 中删除它并执行此操作
@HiltViewModel
class TasksViewModel @Inject constructor(val taskDao: TaskDao) : ViewModel() {...}
以防万一有人在 2024 年来到这里,ViewModel 可以直接在可组合函数内部传递,例如(SettingsViewModel 应注释为 @HiltViewModel):
val viewModel: SettingsViewModel = hiltViewModel()
将此类依赖项添加到您的 graddle 文件后:
implementation "androidx.hilt:hilt-navigation-compose:1.1.0"