Amplifying Flavor Customization with Kotlin Extensions: Crafting Tailored Experiences
<p>Kotlin stands out for its elegance, conciseness, and versatility. One of its most remarkable features is extensions, which empower developers to augment existing classes with new functionality without altering their source code.</p>
<p>Today I will show how we can use the Kotlin extension for different flavors, in our Android application. Here is an example of a simple compose app showing as “<strong>Android</strong>” when running</p>
<pre>
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.indexer.extenstionforeasy.ui.theme.ExtenstionForEasyTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ExtenstionForEasyTheme {
// A surface container using the 'background' color from the theme
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Greeting("Android")
}
}
}
}
}
@Composable
fun Greeting(
name: String,
modifier: Modifier = Modifier
) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
ExtenstionForEasyTheme {
Greeting("Android")
}
}</pre>
<p>Now I want to add flavor and based on the flavor I want to show “<strong>Champagne</strong>” and “<strong>Melot</strong>” so I added the flavor in the application gradle as below</p>
<pre>
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.indexer.extenstionforeasy'
compileSdk 34
defaultConfig {
applicationId "com.indexer.extenstionforeasy"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
flavorDimensions "wine"
productFlavors {
champagne {
dimension "wine"
applicationIdSuffix ".champagne"
}
melot {
dimension "wine"
applicationIdSuffix ".melot"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
champagne {
java {
srcDirs 'src/champange/java'
}
}
melot {
java {
srcDirs 'src/melot/java'
}
}
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.3.2'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.10.1'
implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0')
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.2'
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
}</pre>
<p>Now we have two new flavors champagne and merlot as you in below.</p>
<p> </p>
<p>Flavoring allows for the creation of distinct versions of an app tailored to different scenarios, such as countries, features, or environments.</p>
<p>While flavors bring numerous benefits, managing them without the aid of extensions can introduce challenges that impact code maintainability, readability, and overall development efficiency.</p>
<p><a href="https://medium.com/arpalar-tech/amplifying-flavor-customization-with-kotlin-extensions-crafting-tailored-experiences-f113933e174e">Click Here</a></p>