Notes
🧩 Syntax:
//Add Dagger
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
id 'dagger.hilt.android.plugin'
}
dependencies {
// RETROFIT
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
implementation("com.squareup.okhttp3:okhttp-tls:3.11.0")
// RETROFIT
// COROUTINES
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1")
// COROUTINES
// LIFECYCLE
implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
// LIFECYCLE
// DAGGER
implementation("com.google.dagger:dagger:2.50")
implementation("com.google.dagger:hilt-android:2.50")
implementation("com.google.dagger:hilt-compiler:2.50")
kapt("com.google.dagger:dagger-compiler:2.50")
// WARNING! - We must use kapt because ksp not work properly
// DAGGER
}
//...and in main build.gradle
buildscript {
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21")
classpath("com.google.dagger:hilt-android-gradle-plugin:2.50")
}
}
plugins {
id("com.android.application") version "8.2.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.10" apply false
id("com.google.devtools.ksp") version "1.9.21-1.0.16" apply false
}
//Add Dagger
//Add viewbinding
android {
buildFeatures {
viewBinding = true
}
}
//Add viewbinding
//Define app as HiltApp
@HiltAndroidApp
class MyApplication : Application()
//Define app as HiltApp
//Create viewmodel
@HiltViewModel
class ClazzViewModel @Inject constructor(
private val clazzInjected: ClazzInjected
) : ViewModel() {}
//Create viewmodel
//Add view model and binding
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel by viewModels<ClazzViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
//Add view model and binding
//Create network model
@Module
@InstallIn(SingletonComponent::class)
class NetworkModule {
@Singleton
@Provides
//Eventually with interceptor
fun provideService(okHttpClient: OkHttpClient): Service {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
//.addConverterFactory(GsonConverterFactory.create(defaultGson))
.build()
.create(BeerService::class.java)
}
@Singleton
@Provides
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder().apply {
connectTimeout(30, TimeUnit.SECONDS)
readTimeout(30, TimeUnit.SECONDS)
writeTimeout(30, TimeUnit.SECONDS)
hostnameVerifier { _, _ -> true }
}.build()
}
}
//Create network model
//Create database
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Provides
@Singleton
fun provideAppDatabase(@ApplicationContext context: Context): BeerDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "database")
.fallbackToDestructiveMigration().build()
}
}
/**/
@Database(
entities = [
Clazz::class,
],
version = 1, exportSchema = false,
)
abstract class BeerDatabase : RoomDatabase() {
abstract fun clazzDao(): ClazzDao
}
/**/
@Dao
interface ClazzDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun addList(list: List<Clazz>)
@Query("DELETE from clazz")
suspend fun deleteAll()
@Query("SELECT * FROM clazz")
suspend fun getAll(): List<Clazz>
}
//Create database