Composable Functions: Building Blocks of Jetpack Compose

Yugandharkumar
4 min read3 days ago

--

Hello there! Imagine you’re building a house. You don’t start with the entire house in one go, right? You work on smaller, manageable blocks — like bricks for the walls, tiles for the floors, and frames for the windows. Once you piece them together, voila! You have a house. That’s exactly how Composable Functions in Jetpack Compose work — they’re the Lego bricks for your Android UI.

Let’s break this down into simple steps, sprinkle in some code, and use fun analogies along the way. 🎉

What Are Composable Functions?

Composable functions are special functions in Jetpack Compose, annotated with @Composable. Think of them as recipes for what your app’s UI should look like. Instead of dealing with XML layouts and a tangled web of code, you write these functions, which tell Jetpack Compose how to display elements on the screen.

Analogy: Imagine Composable functions as individual dishes at a dinner party. Each dish (function) can stand alone, but together they create a feast (your app’s UI).

Here’s a simple example:

import androidx.compose.material.Text
import androidx.compose.runtime.Composable

@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}

When called, Greeting("Alice") will display a text saying "Hello, Alice!" on the screen.

Why Use Composable Functions?

  1. Reusability: Just like your favorite Tupperware containers, you can reuse them anywhere!
  2. Simplicity: No more XML + Java/Kotlin mix-ups.
  3. Customizability: Add your flair to each function, like choosing toppings for your pizza.
  4. Scalability: Want to build a skyscraper UI? Start with one floor (Composable) at a time.

Building Your UI with Composable Functions

Now let’s get our hands dirty with some UI building!

Step 1: Start with a Foundation

Imagine you’re baking a cake. The first layer is the base. Similarly, we start with a basic function.

@Composable
fun MyFirstComposable() {
Text(text = "Welcome to Jetpack Compose!")
}

This is your plain sponge cake — simple and essential.

Step 2: Add Layers

Now, let’s add some frosting (or in this case, buttons and layouts).

import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun LayeredUI() {
Column(
modifier = Modifier.padding(16.dp)
) {
Text(text = "Click the button below:")
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { /* Do something */ }) {
Text(text = "Click Me!")
}
}
}

Analogy: Think of the Column as a cake stand that holds everything vertically, Spacer as a separator, and Button as a delicious frosting layer.

Step 3: Add Interactivity

Now, we’ll add some sprinkles — interactivity! Let’s introduce a counter that increments when the button is clicked.

import androidx.compose.runtime.*

@Composable
fun CounterApp() {
var count by remember { mutableStateOf(0) }

Column(
modifier = Modifier.padding(16.dp)
) {
Text(text = "You’ve clicked $count times.")
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { count++ }) {
Text(text = "Click Me!")
}
}
}

What’s Happening?

remember and mutableStateOf are like sticky notes—they hold onto your current state.

Every time you click, the UI automagically updates itself. 🎩✨

Step 4: Combine Composables

Time to combine everything into one final masterpiece.

@Composable
fun AppContent() {
Column(
modifier = Modifier.padding(16.dp)
) {
Greeting(name = "Jetpack Compose")
Spacer(modifier = Modifier.height(16.dp))
CounterApp()
}
}

Analogy: This is your dinner party table. Each dish (Composable) is placed nicely, creating a feast of functionality and design.

Step 5: Preview Your Work

One of the coolest features of Jetpack Compose is that you can preview your UI right in Android Studio. Just add @Preview above any Composable function:

import androidx.compose.ui.tooling.preview.Preview

@Preview
@Composable
fun PreviewApp() {
AppContent()
}

Boom! Your UI renders instantly in the preview window.

Visualizing the Process

Here’s how the layers stack up:

  1. Basic Composable (Text): The base.
  2. Layouts (Column, Spacer): The structure.
  3. Interactivity (State): The fun sprinkles.
  4. Composition (Combining Composables): The grand finale.

Wrap-Up

Composable functions make UI development in Jetpack Compose a breeze. They’re like crafting with Lego blocks — modular, reusable, and endlessly fun. Start small, build one block at a time, and before you know it, you’ll have a skyscraper of UIs!

So, what’s stopping you? Get composing and let the magic unfold. 🚀

Bonus: Full Code Example

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.tooling.preview.Preview

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApp()
}
}
}

@Composable
fun MyApp() {
MaterialTheme {
AppContent()
}
}

@Composable
fun AppContent() {
Column(
modifier = Modifier.padding(16.dp)
) {
Greeting(name = "Jetpack Compose")
Spacer(modifier = Modifier.height(16.dp))
CounterApp()
}
}

@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}

@Composable
fun CounterApp() {
var count by remember { mutableStateOf(0) }
Column(
modifier = Modifier.padding(16.dp)
) {
Text(text = "You’ve clicked $count times.")
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { count++ }) {
Text(text = "Click Me!")
}
}
}

@Preview
@Composable
fun PreviewApp() {
MyApp()
}

Now go forth and compose your heart out! ❤️

--

--

Yugandharkumar
Yugandharkumar

Written by Yugandharkumar

Android DEV skilled in Kotlin, Jetpack Compose, and MVVM. Passionate about building intuitive apps and exploring new tech. Let’s create something amazing! 🚀