命中另一个DI?

满足Hilt-JetPack中的依赖注入(DI),但事实并非如此,因为Hilt只是Dagger2的包装。对于小型项目,它将能够作为一种更便捷的工具站起来,并与JetPack中的其他产品很好地集成在一起。



我就不一一介绍了如何添加到项目中,一切都很好的描述文章



做什么的?



Dagger2是一个相当复杂的DI,您可以很容易混淆其内容和放置位置。提出了无限数量的组件并增加了抽象数量。项目越大,混乱就越多。



而且,如果您想使用Dagger2,但花费很少的精力,那么就发明了Hilt。



为我们简化的是:



  • 现成的组件(从名称中可以清楚地看到它们指的是什么)

    • 应用组件
    • ActivityRetainedComponent
    • 活动组件
    • 片段组件
    • ViewComponent
    • ViewWithFragmentComponent
    • 服务组件
  • 在模块中,指定要添加的组件
  • 通过@AndroidEntryPoint Hilt,编译器生成用于组件创建和存储的整个模板(例如,ActivityRetainedComponent将在屏幕旋转后保存实体,ActivityComponent将重新创建)。


这段代码看起来很优雅(将为我们生成整个样板)



@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
    @Inject lateinit var testService: TestService
}


特征:



需要申请



您需要声明Application并标记@HiltAndroidApp,否则,Hilt将无法工作。



@HiltAndroidApp
class App : Application() { }


层次依赖



Hilt , Activity @AndroidEntryPoint



View @WithFragmentBindings Fragment @AndroidEntryPoint, Activity Fragment





Dagger2, , @InstallIn. , .



@InstallIn(ApplicationComponent::class)
@Module
class NetworkModule {
    @Singleton
    @Provides
    fun provideHttpService(): HttpService {
        return object : HttpService {
            init {
                Log.e("Tester", "HttpService initialized")
            }
            override fun request() {
                Log.e("Tester", "HttpService::request")
            }
        }
    }
}


Hilt, @InstallIn, , .



Component Subcomponent



, Dagger2, Hilt . :



DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)




, . ( ), Dagger2.



@AndroidEntryPoint



  • Activity ComponentActivity AppCompatActivity
  • Fragment androidx.Fragment
  • Retain




Hilt :



  • Dagger Component-
  • Application, Activity, Fragment, View ., @AndroidEntryPoint
  • Dagger


ActivityRetainedComponent



ViewModel arch :



this.viewModelProvider =
        new ViewModelProvider(
            activity,
            new ViewModelProvider.Factory() {
              @NonNull
              @Override
              @SuppressWarnings("unchecked")
              public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
                ActivityRetainedComponent component =
                    ((GeneratedComponentManager<LifecycleComponentBuilderEntryPoint>)
                            activity.getApplication())
                        .generatedComponent()
                        .retainedComponentBuilder()
                        .build();
                return (T) new ActivityRetainedComponentViewModel(component);
              }
            });




:



  • Dagger2
  • ( )
  • boilerpate .
  • Dagger2 ( , ..)


:



  • , , Dagger2
  • ,
  • Dagger2
  • , , Fragment Activity c @AndroidEntryPoint


:






All Articles