هل تريد DI آخر؟

Meet Hilt - Dependency Injection (DI) في JetPack ، لكن هذا ليس صحيحًا لأن Hilt هو مجرد غلاف حول Dagger2. بالنسبة للمشروعات الصغيرة ، ستكون قادرة على الوقوف كأداة أكثر ملاءمة وتتكامل بشكل جيد مع بقية المنتجات في JetPack.



لن أصف كيفية الإضافة إلى المشروع ، كل شيء موصوف جيدًا في المقالة



لاجل ماذا؟



Dagger2 عبارة عن DI معقد إلى حد ما ، يمكنك بسهولة الخلط بين ماذا وأين تضعه. الخروج بعدد لا حصر له من المكونات وزيادة عدد التجريدات. وكلما زاد حجم المشروع ، زاد الالتباس.



وإذا كنت تريد استخدام Dagger2 ، ولكن بأقل جهد ، فقد تم اختراع Hilt من أجل ذلك.



ما تم تبسيطه بالنسبة لنا:



  • مكونات جاهزة (من الأسماء يتضح ما تشير إليه)

    • ApplicationComponent
    • ActivityRetainedComponent
    • عنصر النشاط
    • جزء مكون
    • عرض مكون
    • ViewWithFragmentComponent
    • مكون الخدمة
  • في الوحدة النمطية تحدد المكون الذي تريد إضافته
  • من خلالAndroidEntryPoint Hilt ، يقوم المحول البرمجي بإنشاء لوحة bolierplate بالكامل لإنشاء المكونات وتخزينها (على سبيل المثال ، سيحفظ ActivityRetainedComponent الكيان بعد تدوير الشاشة ، وسيعاد إنشاء ActivityComponent).


يبدو هذا الرمز أنيقًا جدًا (سيتم إنشاء النموذج المعياري بالكامل لنا)



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


ميزات:



التطبيق مطلوب



تحتاج إلى إعلان التطبيق ووضع علامة على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