用 Hilt 注入上下文:这个字段会泄露一个上下文对象

Tar*_*nga 13 android kotlin dagger-hilt

我正在使用 Hilt 将上下文和其他依赖项注入到我的 HomeViewModel 类中;一切正常,但我收到此警告。我怎样才能防止泄漏?

这是我的 HomeFragment(我在其中注入并使用 HomeViewModel 类):

@AndroidEntryPoint
class HomeFragment : Fragment() {

private val viewModel: HomeViewModel by viewModels()

....

}
Run Code Online (Sandbox Code Playgroud)

这是警告:

刀柄注入视图模型

class HomeViewModel @ViewModelInject constructor(
    @ApplicationContext val context: Context,
    private val locationAPI: LocationAPI,
    private val imagesAPI: ImagesAPI
) :
    ViewModel() {
...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

//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"
Run Code Online (Sandbox Code Playgroud)

谢谢!

- 根据建议,在第一个给出的答案之后进行编辑:

家庭片段现在是:

在此处输入图片说明

@HiltViewModel
class DetailsViewModel @Inject constructor(
    @ApplicationContext val context: Context,
    private val locationDetailsAPI: LocationAPI) :
    ViewModel() {
...

}
Run Code Online (Sandbox Code Playgroud)

依赖更新为:

//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"
Run Code Online (Sandbox Code Playgroud)

而且我仍然收到此泄漏错误。

有什么想法吗?

Mos*_*ter 22

在我面对这个警告之后

在此输入图像描述

我决定分析内存以确保该方法会导致内存泄漏,但我发现非常有趣

在此输入图像描述

是的,没有泄漏,这只是一个警告,所以不要再关心它了,快乐编码;)

  • 我得出了相同的结论(我不能肯定地说,但由于应用程序上下文总是比活动上下文存在,所以不应该有泄漏) (2认同)

Une*_*nes 9

改为注入应用程序:

@Inject constructor(private val application: Application)
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样获取应用程序上下文:

application.applicationContext
Run Code Online (Sandbox Code Playgroud)


mik*_*ack 6

我没有收到此警告,并且我以相同的方式注入上下文。

尝试将 hilt 更新到 2.31.2-alpha,将 hilt-androidx 更新到 1.0.0-alpha03

有一些重大变化。您需要使用@HiltViewModel注释您的视图模型,使用@Inject而不是@ViewModelInject。您需要将所有对 ApplicationComponent 的引用替换为 SingletonComponent。

  • 您好,我已经更新了依赖项并更改了代码,但我仍然收到警告。我缺少什么想法吗? (3认同)

小智 5

我认为这是某种错误的警告,因为 Android studio 无法推断出您正在注入应用程序级别上下文。

请参阅警告消息详细信息:

ViewModel 类永远不应该指向视图或非应用 程序上下文。

现在尝试将构造函数参数名称从 更改为contextapplicationContext警告消失了。

class HomeViewModel @ViewModelInject constructor(
    @ApplicationContext val applicationContext: Context,
    private val locationAPI: LocationAPI,
    private val imagesAPI: ImagesAPI
) :
    ViewModel() {
...
}
Run Code Online (Sandbox Code Playgroud)

将上下文重命名为 applicationContext