jetpack...

hilt-模组管理器提供方注入

2023-02-13  本文已影响0人  黄蜜蜂

实体类的实例注入有两种注入的两种方式:

application和activity的代码跟第一种同理不用更改,User实体类可以去掉@Inject注解符号,跟往常的实体类写法一样即可,不过需要新建一个模组管理器AppModule,具体代码如下:

@InstallIn(SingletonComponent::class)
@Module
class AppModule {

    @Singleton
    @Provides
    fun provideUser(): User {
        return User()
    }
}

首先,@Module声明了模组管理器的类,然后@Provide声明了User实体的实例提供函数,然后重点来了,@InstallIn是指定要在其中安装入口点的组件的注解,其括号里面指定的是需要入口点组件的类,不同的组件类作用域不同,但是有一个必须遵照的规则,安装入口点的组件的作用域一定要与提供方(即User实体)的作用域一致。

这个规则该怎么理解,要从两方面,一个作用域的绑定关系,一个是如何通过组件绑定关系约束提供方的作用域,实际上就是对实体生命周期的控制。

下表列出了生成的每个组件的作用域注解:

image.png

而生成组件可以从android studio工程的External Libraries里面找到

image.png

可以看出来,AppModule绑定SingletonComponent组件的作用域是@Singleton,所以对应提供方的作用域也应该是@Singleton,这是规则限定的,除非提供方不指定作用域,如下图


image.png

<pre style="background:white">将提供方的@Singleton去注释掉,因为扩展包里SingletonComponent组件声明的作用域就是Singleton,那模组下的提供方只能是声明Singleton,除非提供方不指定作用域,使用默认的作用域,假如模组安装了ActivityComponent组件,那么User只能声明@ActivityScoped作用域了。

而作用域对应的生命周期,如下表:


image.png

从而这就通过组件在模组管理器上的安装不同组件,间接完成统一管理了各个实体的生命周期,即其活动范围,当然也还可以新建更多的模组区分管理多个实体,这样也更灵活了。

上一篇下一篇

猜你喜欢

热点阅读