Setup sử dụng Hilt (DI) trong project android

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.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...