Dagger là một thư viện không dễ hiểu khi nhìn sơ qua đối với hầu hết các nhà phát triển.
Gần đây Google đã ra mắt Hilt giúp giảm độ phức tạp của Dagger giúp các nhà phát triển tiếp cận dễ dàng hơn.
Hilt đang có version là : 2.28-alpha
Trong bài viết này mình sẽ thử setup để demo cách sử dụng Hilt:
- Khởi tạo Hilt
- Cài đặt Module
- Hilt ViewModel
Đầu tiên, thêm hilt-android-gradle-plugin
plugin vào project’s root build.gradle
file:
buildscript { ... dependencies { ... classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha' } }
Sau đó, thêm các plugin vào app/build.gradle
file:
// Hilt dependencies implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
1. Application Class
Điều đầu tiên bạn sẽ làm là thêm @HiltAndroidApp
vào class Application của ứng dụng để khởi tạo Hilt quá đơn giản luôn.
@HiltAndroidApp class MyApplication : Application() { override fun onCreate() { super.onCreate() } }
2. Hilt Modules
Để loại bỏ AppComponent của Dagger tất cả các module của Hilt sử dụng @InstallIn(Applicationcomponent::class)
@InstallIn(ApplicationComponent::class) @Module object NetworkModule { @Provides @Singleton fun provideGson(): Gson { return GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create() } @Provides @Singleton fun provideHttpClient(): OkHttpClient { val okHttpClientBuilder = OkHttpClient.Builder() return okHttpClientBuilder.build() } @Provides @Singleton fun provideRetrofit(factory: Gson, client: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create(factory)) .client(client) .build() } @Provides @Singleton fun provideApi(retrofit: Retrofit): ApiInterface { return retrofit.create(ApiInterface::class.java) } }
3. Activities & Fragments
Hilt cung cấp @AndroidEntryPoint
annotation sử dụng cho activities và fragments. Không phải khai báo nhiều như bên Dagger nữa code cũng dễ xem hơn.
//activity @AndroidEntryPoint class MainActivity : AppCompatActivity() { } ////fragment @AndroidEntryPoint class MainFragment : Fragment() { ... }
Đơn giản vậy thôi bây giờ Dagger modules ActivityBuilderModule
,FragmentBuilderModule
and AndroidInjectionModule
Dagger không cần thiết nữa, code trở nên gọn hơn rất nhiều.
4. ViewModel
Hilt hiện tại cũng đã support ViewModel, thêm Hilt viewmodel vàoapp/build.gradle
file:
//Hilt ViewModel implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02' kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
Và để sử dụng ở UserViewModel sẽ khai báo @ViewModelInject
class UserViewModel @ViewModelInject constructor( private val repo: UserRepository, @Assisted private val savedStateHandle: SavedStateHandle ) : ViewModel(), LifecycleObserver { }
Trường hợp sử dụng SavedStateHandle
thì buộc phải khai báo @Assisted
Để sử dụng UserViewModel chúng ta sẽ làm như sau:
@AndroidEntryPoint class MainActivity : AppCompatActivity() { private val userViewModel : UserViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //userViewmodel available userViewModel.fetchData() userViewModel.data.observe(this, Observer { Log.d( "userViewModel","userViewModel.data$it") }) } }
Như vậy là chúng ta đã setup và sử dụng thành công Hilt Module và Viewmodel rồi, về cơ bản thì cũng khá dễ để tiếp cận.
Full source code sample Github:
- Sử dụng Room DB
- Sử dụng Retrofit + ViewModel
Ngoài ra bạn có thể tìm hiểu thêm các phần nâng cao hơn tại đây.
- Dependency injection with Hilt
- Migrating your Dagger app to Hilt
- Migrating to Hilt
- Hilt and Jetpack integrations
- Dependency Injection on Android with Hilt