使用 Hilt 注入上下文:此字段泄漏上下文对象
Inject context with Hilt: this field leaks a context object
我正在使用 Hilt 将上下文和其他依赖项注入我的 HomeViewModel class;一切正常,但我收到此警告。
如何防止泄漏?
这是我的 HomeFragment(我在其中注入并使用 HomeViewModel class):
@AndroidEntryPoint
class HomeFragment : Fragment() {
private val viewModel: HomeViewModel by viewModels()
....
}
这是警告:
class HomeViewModel @ViewModelInject constructor(
@ApplicationContext val context: Context,
private val locationAPI: LocationAPI,
private val imagesAPI: ImagesAPI
) :
ViewModel() {
...
}
我正在使用:
//Hilt DI
implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"
谢谢!
-- 根据建议,在第一个给出的答案之后进行编辑:
Home Fragment 现在是:
@HiltViewModel
class DetailsViewModel @Inject constructor(
@ApplicationContext val context: Context,
private val locationDetailsAPI: LocationAPI) :
ViewModel() {
...
}
依赖更新为:
//Hilt DI
implementation "com.google.dagger:hilt-android:2.31-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha03"
我仍然遇到这个泄漏错误。
有什么想法吗?
我没有收到此警告,我以同样的方式注入上下文。
尝试将 hilt 更新到 2.31.2-alpha,将 hilt-androidx 更新到 1.0.0-alpha03
有一些重大变化。您需要使用@HiltViewModel 注释您的视图模型,使用@Inject 而不是@ViewModelInject。您需要用 SingletonComponent 替换对 ApplicationComponent 的任何引用。
您的 Kotlin 插件版本是 1.4.30-release-Studio4.1-1?
如果是,请降级 kotlin 插件版本。
在1.4.30-release-Studio4.1-1版本中,
如果视图模型将上下文作为实例变量,则会导致警告。
我在更新 Hilt 依赖项后遇到了同样的问题。
构造函数前用@HiltViewModel
和@Inject
是对的
关于 Context 导致的泄漏,只需将其从 ViewModel 构造函数中删除,并将 Context 作为函数的方法参数传递,如下所示:
@HiltViewModel
class HomeViewModel @Inject constructor(
private val locationDetailsAPI: LocationAPI,
private val imagesAPI: ImagesAPI
) : ViewModel() {
fun getImages(context: Context) {
// do something
}
}
在我遇到那个警告之后
我决定分析内存以确保该方法会导致内存泄漏,但我的发现非常有趣
是的,没有泄漏这只是一个警告所以不要再关心它了,快乐编码;)
改为注入应用程序:
@Inject constructor(private val application: Application)
然后你可以像这样获取应用上下文:
application.applicationContext
这里应该是安全的,上下文构造函数中并没有真正的泄漏,只是 lint 检查不知道那是应用程序上下文,而不是其他上下文。而且我认为我认为取消该警告也是安全的。
要使用 Memory Profiler 检查内存使用情况,请阅读此文档:https://developer.android.com/studio/profile/memory-profiler
我正在使用 Hilt 将上下文和其他依赖项注入我的 HomeViewModel class;一切正常,但我收到此警告。 如何防止泄漏?
这是我的 HomeFragment(我在其中注入并使用 HomeViewModel class):
@AndroidEntryPoint
class HomeFragment : Fragment() {
private val viewModel: HomeViewModel by viewModels()
....
}
这是警告:
class HomeViewModel @ViewModelInject constructor(
@ApplicationContext val context: Context,
private val locationAPI: LocationAPI,
private val imagesAPI: ImagesAPI
) :
ViewModel() {
...
}
我正在使用:
//Hilt DI
implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"
谢谢!
-- 根据建议,在第一个给出的答案之后进行编辑:
Home Fragment 现在是:
@HiltViewModel
class DetailsViewModel @Inject constructor(
@ApplicationContext val context: Context,
private val locationDetailsAPI: LocationAPI) :
ViewModel() {
...
}
依赖更新为:
//Hilt DI
implementation "com.google.dagger:hilt-android:2.31-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha03"
我仍然遇到这个泄漏错误。
有什么想法吗?
我没有收到此警告,我以同样的方式注入上下文。
尝试将 hilt 更新到 2.31.2-alpha,将 hilt-androidx 更新到 1.0.0-alpha03
有一些重大变化。您需要使用@HiltViewModel 注释您的视图模型,使用@Inject 而不是@ViewModelInject。您需要用 SingletonComponent 替换对 ApplicationComponent 的任何引用。
您的 Kotlin 插件版本是 1.4.30-release-Studio4.1-1?
如果是,请降级 kotlin 插件版本。
在1.4.30-release-Studio4.1-1版本中,
如果视图模型将上下文作为实例变量,则会导致警告。
我在更新 Hilt 依赖项后遇到了同样的问题。
构造函数前用@HiltViewModel
和@Inject
是对的
关于 Context 导致的泄漏,只需将其从 ViewModel 构造函数中删除,并将 Context 作为函数的方法参数传递,如下所示:
@HiltViewModel
class HomeViewModel @Inject constructor(
private val locationDetailsAPI: LocationAPI,
private val imagesAPI: ImagesAPI
) : ViewModel() {
fun getImages(context: Context) {
// do something
}
}
在我遇到那个警告之后
我决定分析内存以确保该方法会导致内存泄漏,但我的发现非常有趣
是的,没有泄漏这只是一个警告所以不要再关心它了,快乐编码;)
改为注入应用程序:
@Inject constructor(private val application: Application)
然后你可以像这样获取应用上下文:
application.applicationContext
这里应该是安全的,上下文构造函数中并没有真正的泄漏,只是 lint 检查不知道那是应用程序上下文,而不是其他上下文。而且我认为我认为取消该警告也是安全的。 要使用 Memory Profiler 检查内存使用情况,请阅读此文档:https://developer.android.com/studio/profile/memory-profiler