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.