SlideShare a Scribd company logo
Pedro Veloso
Twitter &&
Instagram: @pedronveloso
Hands-On
Jetpack Compose
KotlinMeetup2020|NYC2020
Pedro Veloso
Twitter &&
Instagram: @pedronveloso
Hands-On
Jetpack Compose
KotlinMeetup2020|NYC2020
Jetpack
Compose
“Jetpack Compose
simplifies and
accelerates UI
development on
Android. Quickly bring
your app to life with
less code, powerful
tools, and intuitive
Kotlin APIs.”
Source: https://developer.android.com/jetpack/compose
Why and How?
• Android Developers Backstage Episode 131 :
• https://androidbackstage.blogspot.com/2020/01/episode-131-jetpack-compose-and.html
• Understanding Compose (Dev Summit):
• https://www.youtube.com/watch?v=Q9MtlmmN4Q0
• Offitial Website
• https://developer.android.com/jetpack/compose
• Not Stable
• Not in RC
• Not in Beta
• Not in Alpha
• THIS IS A DEV PREVIEW!
¡ Don’t use in production !
Using
Jetpack Compose
H a n d s - O n V e r s i o n
TheHOW|YetAnotherWeatherApplication
• Display Current temperature, max and min
• 2nd Screen with the forecast
• Style the App
• Forecast list must be scrollable
Compose Weather
Layouts
C o l u m n
R o w
ArrangementAxis
A r r a n g e m e n t A x i s
Flex
F l e x i n g
A
0.3 Flex
A
LayoutFlexible(0.3f)
Flex
F l e x i n g
A
0.3 Flex
A
CC
LayoutFlexible(0.3f)
Flex
F l e x i n g
A
0.3 Flex
A
CC
LayoutFlexible(0.3f)
0.2 Flex LayoutFlexible(0.2f)
Basic Elements
T e x t
3 7 4 L O C
I m a g e
1 0 0 L O C
S p a c e r
L a y o u t W i d t h
L a y o u t H e i g h t
C a r d
5 5 L O C
Text
/**
* Simplified version of [Text] component with minimal set of
customizations.
*/
@Composable
fun Text(
text: String,
modifier: Modifier = Modifier.None,
style: TextStyle? = null,
softWrap: Boolean = DefaultSoftWrap,
overflow: TextOverflow = DefaultOverflow,
maxLines: Int = DefaultMaxLines
)
Show us the
Code!
@Composable
private fun MainScreen(){
Column {
DrawBackground()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
MainScreen()
}
}
}
@Composable
fun DrawBackground() {
DrawImage(image =
imageResource(R.drawable.nyc_night_1))
}
B a c k g r o u n d
These aren’t the
Droids you’re
looking for.
BONSAI|PRESENTATION
data class CurrentWeather(
val locationName: String,
val curTemperature: Temperature,
val forecast: WeatherForecast
)
class Temperature(val celcius: Double)
data class WeatherForecast(
val maxTemperature: Temperature,
val minTemperature: Temperature,
val state: WeatherState
)
enum class WeatherState(@DrawableRes val iconResId: Int,
@StringRes val descriptionResId: Int) {
SUNNY(R.drawable.ic_sunny, R.string.state_sunny),
RAINY(R.drawable.ic_rainy, R.string.state_rainy),
PARTLY_CLOUDY(R.drawable.ic_p_cloudy, R.string.state_p_cloudy),
SNOWY(R.drawable.ic_snowy, R.string.state_snowy)
}
<string name="state_sunny">Sunny</string>
<string name="state_rainy">Rainy</string>
…
D a t a M o d e l s
@Composable
fun Title(currentWeather: CurrentWeather) {
Text(text = currentWeather.locationName,
style = MaterialTheme.typography().h2
.copy(color = Color.White,
fontWeight = FontWeight.W200,
fontFamily = FontFamily("sans-
serif-thin")))
}
}
T i t l e
Theming
val weatherTypography =
Typography(
h1 = TextStyle(
fontWeight =
FontWeight.W200,
fontSize = 54.sp,
color = Color.White
),
subtitle1 = …
val weatherThemeColors =
lightColorPalette(
primary = Color(0xFF116a9c),
primaryVariant = Color(0xFF1e5371),
onPrimary = Color.White,
…
@Composable
fun WeatherTheme(children: @Composable() () -> Unit) {
MaterialTheme(colors = weatherThemeColors, typography = weatherTypography,
children = children)
}
A p p l y T h e m e
setContent {
WeatherTheme {
Column {
DrawBackground()
Title(currentWeather)
}
}
}
@Composable
private fun Title(cur: CurrentWeather) {
Text(
text = cur.locationName,
style = MaterialTheme.typography().h2
)
}
@Composable
fun Title(cur: CurrentWeather) {
Row(modifier = LayoutWidth.Fill,
arrangement = Arrangement.Center) {
Spacer(LayoutHeight(16.dp))
Text(text = currentWeather.locationName,
style = MaterialTheme.typography().h2)
}
}
C e n t e r
Column {
DrawBackground()
Title(currentWeather)
}
T o d a y ’ s
S t a t eRow(
modifier = LayoutWidth.Fill,
arrangement = Arrangement.Center) {
Container(width = 32.dp, height = 32.dp) {
DrawImage(image = imageResource(
currentWeather.forecast.state.iconResId))
}
// Empty Space.
Spacer(LayoutWidth(8.dp)
Text(
text = stringResource(
currentWeather.forecast.state.descriptionResId),
style = MaterialTheme.typography().body2)
}
T o d a y ’ s
F o r e c a s t
@Composable
fun CurrentWeatherBlock(
current: CurrentWeather) {
Column(modifier =
LayoutWidth.Fill ,
arrangement =
Arrangement.Center) {
}
}
WeatherState(current)
CurrentTemperature(current)
MinMaxTemperatures(current)
L a y o u t
A d j u s t
Column {
DrawBackground()
Title(currentWeather = cur)
Spacer(modifier = LayoutFlexible(0.7f))
CurrentWeatherBlock(currentWeather = cur)
Spacer(modifier = LayoutFlexible(0.3f))
}
L i s t E l e m e n t
fun WeatherForecastRow
Row {
…
}
Card(color = cardBackgroundColor, elevation = 8.dp) {
Padding(left = 8.dp, right = 8.dp, top = 16.dp, bottom = 16.dp) {
WeatherForecastRow(forecast)
}
}
for (forecast in forecasts) {
}
Column {
DrawBackground()
Title(currentWeather)
CurrentWeatherBlock(currentWeather)
VerticalScroller {
Column(modifier = LayoutPadding(16.dp))
{
WeatherForecastList(forecasts)
}
}
}
S e c o n d
S c r e e n
Navigation
Between
Screens
Compose Models
sealed class Screen {
object MainScreen : Screen()
object WeatherForecastScreen : Screen()
}
@Model
object GlobalState {
var currentScreen : Screen = Screen.MainScreen
var currentWeather : CurrentWeather? = null
var predictions: List<DayForecast> = emptyList()
}
fun navigateTo(screen: Screen){
GlobalState.currentScreen = screen
}
Single Activity
setContent {
Crossfade(GlobalState.currentScreen) { screen ->
Surface {
when (screen) {
is Screen.MainScreen -> MainScreen()
is Screen.WeatherForecastScreen -> WeatherListScreen()
}
}
}
}
override fun onBackPressed() {
if (GlobalState.currentScreen == Screen.WeatherForecastScreen) {
navigateTo(Screen.MainScreen)
} else {
super.onBackPressed()
}
}
AppBar
TopAppBar(
title = {
Text(text =
stringResource(R.string.app_name))
}
)
TopAppBar(
title = { Text(text =
stringResource(R.string.app_name)) },
navigationIcon = {
VectorImageButton(R.drawable.ic_back) {
navigateTo(Screen.MainScreen)
}
}
)
Add a Button
Button(text = stringResource(R.string.load_forecasts),
onClick = { navigateTo(Screen.WeatherForecastScreen)
})
Thank You
Pedr o V elo s o
@ p e d r o n v e l o s o
Q& A?
O r f i nd m e a f te rwa rd s :)

More Related Content

What's hot (11)

PPT
Jquery 2
Manish Kumar Singh
 
ZIP
Learning the basics of the Drupal API
Alexandru Badiu
 
PPTX
Introduction to HTML5 Canvas
Mindy McAdams
 
PDF
HTML5 and CSS3 Refresher
Ivano Malavolta
 
PDF
Introduzione JQuery
orestJump
 
PDF
JDD 2013 JavaFX
益裕 張
 
PPTX
jQuery, CSS3 and ColdFusion
Denard Springle IV
 
PPTX
SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...
Sencha
 
ODP
Drupal Best Practices
manugoel2003
 
PPT
J Query Public
pradeepsilamkoti
 
PPTX
jQuery Data Manipulate API - A source code dissecting journey
Huiyi Yan
 
Learning the basics of the Drupal API
Alexandru Badiu
 
Introduction to HTML5 Canvas
Mindy McAdams
 
HTML5 and CSS3 Refresher
Ivano Malavolta
 
Introduzione JQuery
orestJump
 
JDD 2013 JavaFX
益裕 張
 
jQuery, CSS3 and ColdFusion
Denard Springle IV
 
SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...
Sencha
 
Drupal Best Practices
manugoel2003
 
J Query Public
pradeepsilamkoti
 
jQuery Data Manipulate API - A source code dissecting journey
Huiyi Yan
 

Similar to Jetpack Compose - Hands-on February 2020 (18)

PDF
compose_speaker_session.pdf
AnkurAgarwal151093
 
PDF
Jetpack Compose a nova forma de implementar UI no Android
Nelson Glauber Leal
 
PDF
What's new in android: jetpack compose 2024
Toru Wonyoung Choi
 
PPTX
Compose Camp Day 2.pptx
RajatKumarNayak5
 
PDF
Android Kotlin Weather App Project.pdf
SudhanshiBakre1
 
PDF
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Andrey Dotsenko
 
PDF
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
carlostorres15106
 
PDF
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
DroidConTLV
 
PDF
SOLID principles in practice: the Clean Architecture
Fabio Collini
 
PDF
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
ssuserb6c2641
 
PPTX
Compose camp 2.pptx
MadheswarKonidela
 
PDF
Something old, Something new.pdf
MaiaGrotepass1
 
PDF
Diving deep in compose.pdf
AnkurAgarwal151093
 
PPTX
WELCOME TO OUR PRESENTION.pptx
EtzzBadsha
 
PDF
Compose Camp Day 3 PPT.pptx.pdf
METDSC
 
PDF
Android Development | Compose camp day 3 | GDSC SEC Sasaram.pdf
ShivamShrey1
 
PDF
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
Fabio Collini
 
PDF
COMPOSE CAMP SESSION 4.pdf
AbhishekS325285
 
compose_speaker_session.pdf
AnkurAgarwal151093
 
Jetpack Compose a nova forma de implementar UI no Android
Nelson Glauber Leal
 
What's new in android: jetpack compose 2024
Toru Wonyoung Choi
 
Compose Camp Day 2.pptx
RajatKumarNayak5
 
Android Kotlin Weather App Project.pdf
SudhanshiBakre1
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Andrey Dotsenko
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
carlostorres15106
 
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
DroidConTLV
 
SOLID principles in practice: the Clean Architecture
Fabio Collini
 
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
ssuserb6c2641
 
Compose camp 2.pptx
MadheswarKonidela
 
Something old, Something new.pdf
MaiaGrotepass1
 
Diving deep in compose.pdf
AnkurAgarwal151093
 
WELCOME TO OUR PRESENTION.pptx
EtzzBadsha
 
Compose Camp Day 3 PPT.pptx.pdf
METDSC
 
Android Development | Compose camp day 3 | GDSC SEC Sasaram.pdf
ShivamShrey1
 
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
Fabio Collini
 
COMPOSE CAMP SESSION 4.pdf
AbhishekS325285
 
Ad

Recently uploaded (20)

PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
PPTX
ASSIGNMENT_1[1][1][1][1][1] (1) variables.pptx
kr2589474
 
PDF
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
PDF
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
PDF
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
PPT
Brief History of Python by Learning Python in three hours
adanechb21
 
PPTX
Farrell__10e_ch04_PowerPoint.pptx Programming Logic and Design slides
bashnahara11
 
PDF
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
PDF
How Agentic AI Networks are Revolutionizing Collaborative AI Ecosystems in 2025
ronakdubey419
 
PDF
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
PDF
What companies do with Pharo (ESUG 2025)
ESUG
 
PPTX
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
PDF
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
PDF
SAP GUI Installation Guide for Windows | Step-by-Step Setup for SAP Access
SAP Vista, an A L T Z E N Company
 
PPTX
Explanation about Structures in C language.pptx
Veeral Rathod
 
PDF
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
PDF
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 
PDF
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
PDF
On Software Engineers' Productivity - Beyond Misleading Metrics
Romén Rodríguez-Gil
 
PPTX
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
ASSIGNMENT_1[1][1][1][1][1] (1) variables.pptx
kr2589474
 
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
Brief History of Python by Learning Python in three hours
adanechb21
 
Farrell__10e_ch04_PowerPoint.pptx Programming Logic and Design slides
bashnahara11
 
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
How Agentic AI Networks are Revolutionizing Collaborative AI Ecosystems in 2025
ronakdubey419
 
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
What companies do with Pharo (ESUG 2025)
ESUG
 
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
SAP GUI Installation Guide for Windows | Step-by-Step Setup for SAP Access
SAP Vista, an A L T Z E N Company
 
Explanation about Structures in C language.pptx
Veeral Rathod
 
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
On Software Engineers' Productivity - Beyond Misleading Metrics
Romén Rodríguez-Gil
 
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
Ad

Jetpack Compose - Hands-on February 2020

  • 1. Pedro Veloso Twitter && Instagram: @pedronveloso Hands-On Jetpack Compose KotlinMeetup2020|NYC2020 Pedro Veloso Twitter && Instagram: @pedronveloso Hands-On Jetpack Compose KotlinMeetup2020|NYC2020
  • 2. Jetpack Compose “Jetpack Compose simplifies and accelerates UI development on Android. Quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.” Source: https://developer.android.com/jetpack/compose
  • 3. Why and How? • Android Developers Backstage Episode 131 : • https://androidbackstage.blogspot.com/2020/01/episode-131-jetpack-compose-and.html • Understanding Compose (Dev Summit): • https://www.youtube.com/watch?v=Q9MtlmmN4Q0 • Offitial Website • https://developer.android.com/jetpack/compose
  • 4. • Not Stable • Not in RC • Not in Beta • Not in Alpha • THIS IS A DEV PREVIEW! ¡ Don’t use in production !
  • 5. Using Jetpack Compose H a n d s - O n V e r s i o n
  • 6. TheHOW|YetAnotherWeatherApplication • Display Current temperature, max and min • 2nd Screen with the forecast • Style the App • Forecast list must be scrollable Compose Weather
  • 7. Layouts C o l u m n R o w ArrangementAxis A r r a n g e m e n t A x i s
  • 8. Flex F l e x i n g A 0.3 Flex A LayoutFlexible(0.3f)
  • 9. Flex F l e x i n g A 0.3 Flex A CC LayoutFlexible(0.3f)
  • 10. Flex F l e x i n g A 0.3 Flex A CC LayoutFlexible(0.3f) 0.2 Flex LayoutFlexible(0.2f)
  • 11. Basic Elements T e x t 3 7 4 L O C I m a g e 1 0 0 L O C S p a c e r L a y o u t W i d t h L a y o u t H e i g h t C a r d 5 5 L O C
  • 12. Text /** * Simplified version of [Text] component with minimal set of customizations. */ @Composable fun Text( text: String, modifier: Modifier = Modifier.None, style: TextStyle? = null, softWrap: Boolean = DefaultSoftWrap, overflow: TextOverflow = DefaultOverflow, maxLines: Int = DefaultMaxLines )
  • 14. @Composable private fun MainScreen(){ Column { DrawBackground() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { MainScreen() } } } @Composable fun DrawBackground() { DrawImage(image = imageResource(R.drawable.nyc_night_1)) } B a c k g r o u n d
  • 15. These aren’t the Droids you’re looking for.
  • 16. BONSAI|PRESENTATION data class CurrentWeather( val locationName: String, val curTemperature: Temperature, val forecast: WeatherForecast ) class Temperature(val celcius: Double) data class WeatherForecast( val maxTemperature: Temperature, val minTemperature: Temperature, val state: WeatherState ) enum class WeatherState(@DrawableRes val iconResId: Int, @StringRes val descriptionResId: Int) { SUNNY(R.drawable.ic_sunny, R.string.state_sunny), RAINY(R.drawable.ic_rainy, R.string.state_rainy), PARTLY_CLOUDY(R.drawable.ic_p_cloudy, R.string.state_p_cloudy), SNOWY(R.drawable.ic_snowy, R.string.state_snowy) } <string name="state_sunny">Sunny</string> <string name="state_rainy">Rainy</string> … D a t a M o d e l s
  • 17. @Composable fun Title(currentWeather: CurrentWeather) { Text(text = currentWeather.locationName, style = MaterialTheme.typography().h2 .copy(color = Color.White, fontWeight = FontWeight.W200, fontFamily = FontFamily("sans- serif-thin"))) } } T i t l e
  • 18. Theming val weatherTypography = Typography( h1 = TextStyle( fontWeight = FontWeight.W200, fontSize = 54.sp, color = Color.White ), subtitle1 = … val weatherThemeColors = lightColorPalette( primary = Color(0xFF116a9c), primaryVariant = Color(0xFF1e5371), onPrimary = Color.White, … @Composable fun WeatherTheme(children: @Composable() () -> Unit) { MaterialTheme(colors = weatherThemeColors, typography = weatherTypography, children = children) }
  • 19. A p p l y T h e m e setContent { WeatherTheme { Column { DrawBackground() Title(currentWeather) } } } @Composable private fun Title(cur: CurrentWeather) { Text( text = cur.locationName, style = MaterialTheme.typography().h2 ) }
  • 20. @Composable fun Title(cur: CurrentWeather) { Row(modifier = LayoutWidth.Fill, arrangement = Arrangement.Center) { Spacer(LayoutHeight(16.dp)) Text(text = currentWeather.locationName, style = MaterialTheme.typography().h2) } } C e n t e r Column { DrawBackground() Title(currentWeather) }
  • 21. T o d a y ’ s S t a t eRow( modifier = LayoutWidth.Fill, arrangement = Arrangement.Center) { Container(width = 32.dp, height = 32.dp) { DrawImage(image = imageResource( currentWeather.forecast.state.iconResId)) } // Empty Space. Spacer(LayoutWidth(8.dp) Text( text = stringResource( currentWeather.forecast.state.descriptionResId), style = MaterialTheme.typography().body2) }
  • 22. T o d a y ’ s F o r e c a s t @Composable fun CurrentWeatherBlock( current: CurrentWeather) { Column(modifier = LayoutWidth.Fill , arrangement = Arrangement.Center) { } } WeatherState(current) CurrentTemperature(current) MinMaxTemperatures(current)
  • 23. L a y o u t A d j u s t Column { DrawBackground() Title(currentWeather = cur) Spacer(modifier = LayoutFlexible(0.7f)) CurrentWeatherBlock(currentWeather = cur) Spacer(modifier = LayoutFlexible(0.3f)) }
  • 24. L i s t E l e m e n t fun WeatherForecastRow Row { … } Card(color = cardBackgroundColor, elevation = 8.dp) { Padding(left = 8.dp, right = 8.dp, top = 16.dp, bottom = 16.dp) { WeatherForecastRow(forecast) } } for (forecast in forecasts) { }
  • 25. Column { DrawBackground() Title(currentWeather) CurrentWeatherBlock(currentWeather) VerticalScroller { Column(modifier = LayoutPadding(16.dp)) { WeatherForecastList(forecasts) } } } S e c o n d S c r e e n
  • 27. Compose Models sealed class Screen { object MainScreen : Screen() object WeatherForecastScreen : Screen() } @Model object GlobalState { var currentScreen : Screen = Screen.MainScreen var currentWeather : CurrentWeather? = null var predictions: List<DayForecast> = emptyList() } fun navigateTo(screen: Screen){ GlobalState.currentScreen = screen }
  • 28. Single Activity setContent { Crossfade(GlobalState.currentScreen) { screen -> Surface { when (screen) { is Screen.MainScreen -> MainScreen() is Screen.WeatherForecastScreen -> WeatherListScreen() } } } } override fun onBackPressed() { if (GlobalState.currentScreen == Screen.WeatherForecastScreen) { navigateTo(Screen.MainScreen) } else { super.onBackPressed() } }
  • 29. AppBar TopAppBar( title = { Text(text = stringResource(R.string.app_name)) } ) TopAppBar( title = { Text(text = stringResource(R.string.app_name)) }, navigationIcon = { VectorImageButton(R.drawable.ic_back) { navigateTo(Screen.MainScreen) } } )
  • 30. Add a Button Button(text = stringResource(R.string.load_forecasts), onClick = { navigateTo(Screen.WeatherForecastScreen) })
  • 31. Thank You Pedr o V elo s o @ p e d r o n v e l o s o Q& A? O r f i nd m e a f te rwa rd s :)