Mental Modles of Jetpack Compose
by
Louis Tsai
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Mental Models of Jetpack Compose @louis993546
Slide 2
Slide 2 text
Google I/O 2019 @louis993546
Slide 3
Slide 3 text
import androidx.compose.* import androidx.ui.core.* @Composable fun Greeting(name: String) { Text ("Hello $name!") } @louis993546
Slide 4
Slide 4 text
1. Mental Model 2. Programming Paradigm 3. Inheritance 4. Composition 5. Reactive Declarative UI 6. Component 7. Functional component 8. Hindsight @louis993546
Slide 5
Slide 5 text
1. Mental Model @louis993546
Slide 6
Slide 6 text
A mental model is an explanation of someone's thought process about how something works in the real world. -- Wikipedia @louis993546
Slide 7
Slide 7 text
2. Programming Paradigm @louis993546
Slide 8
Slide 8 text
State Visibility Data Flags @louis993546
Slide 9
Slide 9 text
@louis993546
Slide 10
Slide 10 text
val linearLayout = LinearLayout(context).apply { orientation = LinearLayout.VERTICAL } linearLayout.addView( TextView(context).apply { text = "Hello, World" } ) linearLayout.addView( ImageView(context).apply { imageResource = R.drawable.star } ) @louis993546
Slide 11
Slide 11 text
val linearLayout = LinearLayout(context).apply { orientation = LinearLayout.VERTICAL } // a statement (instruction) linearLayout.addView( TextView(context).apply { text = "Hello, World" } ) // another statement (instruction) linearLayout.addView( ImageView(context).apply { imageResource = R.drawable.star } ) // yet another statement (instruction) @louis993546
Slide 12
Slide 12 text
Imperative programming val linearLayout = LinearLayout(context).apply { orientation = LinearLayout.VERTICAL } // a statement (instruction) linearLayout.addView( TextView(context).apply { text = "Hello, World" } ) // another statement (instruction) linearLayout.addView( ImageView(context).apply { imageResource = R.drawable.star } ) // yet another statement (instruction) @louis993546
Slide 13
Slide 13 text
@louis993546
Slide 14
Slide 14 text
@louis993546
Slide 15
Slide 15 text
Declarative programming @louis993546
Slide 16
Slide 16 text
Declarative programming @louis993546
Slide 17
Slide 17 text
3. Inheritance @louis993546
Slide 18
Slide 18 text
@louis993546
Slide 19
Slide 19 text
Animal @louis993546
Slide 20
Slide 20 text
Animal @louis993546
Slide 21
Slide 21 text
@louis993546
Slide 22
Slide 22 text
Commonalities Breath Walk Work Take over the world Blep Blop ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ @louis993546
Slide 23
Slide 23 text
Commonalities Breath Walk Work Take over the world Blep Blop ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Animal @louis993546
Slide 24
Slide 24 text
Commonalities Breath Walk Work Take over the world Blep Blop Blup ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ @louis993546
Slide 25
Slide 25 text
@louis993546
Slide 26
Slide 26 text
@louis993546
Slide 27
Slide 27 text
@louis993546
Slide 28
Slide 28 text
4. Composition @louis993546
Slide 29
Slide 29 text
Commonalities Breath Walk Work Take over the world Blep Blop Blup ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ @louis993546
Slide 30
Slide 30 text
Commonalities Breath Walk Work Take over the world Blep Blop Blup ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ @louis993546
Slide 31
Slide 31 text
class : Breathable, Walkable, Workable, Blopable class : Breathable, Walkable, TakeOverTheWorldable, Blepable class : Walkable, Workable, TakeOverTheWorldable, Blupable @louis993546
Slide 32
Slide 32 text
class : Breathable, Walkable, Workable, Blopable class : Breathable, Walkable, TakeOverTheWorldable, Blepable class : Walkable, Workable, TakeOverTheWorldable, Blupable class : Breathable, Blupable @louis993546
Slide 33
Slide 33 text
5. Reactive Declarative UI @louis993546
Slide 34
Slide 34 text
@louis993546 S A B C D F ? XML ? ? ? ?
Slide 35
Slide 35 text
@louis993546 S A B C D F ? XML ? ? ? ?
Slide 36
Slide 36 text
Google I/O 2015 @louis993546
Slide 37
Slide 37 text
@louis993546
Slide 38
Slide 38 text
S A B C D F ? XML Data Binding ? ? ? @louis993546
Slide 39
Slide 39 text
JSConf US 2013 @louis993546
Slide 40
Slide 40 text
Composition Declarative Programming + @louis993546
Slide 41
Slide 41 text
React.js Move markup into logic Data Binding Move logic into markup @louis993546
Slide 42
Slide 42 text
// a JavaScript file class HelloWorld extends React.Component { render() { // ↓ HTML ↓ JS ↓ Back to HTML return
Hello, {this.props.target}!
} } @louis993546
Slide 43
Slide 43 text
UI = f(state) @louis993546
Slide 44
Slide 44 text
sealed class ViewState { data class Success(val data: List) : ViewState() data class Error(val error: Throwable) : ViewState() } viewStateLiveData.observe(this) { viewState -> when (viewState) { is Success -> { ... } is Error -> { ... } } } @louis993546
Slide 45
Slide 45 text
WWDC 2019 @louis993546
Slide 46
Slide 46 text
6. Component @louis993546
Slide 47
Slide 47 text
class HelloWorld extends React.Component { render() { return (
Hello, {this.props.target}!
) } } class HelloWorld extends React.Component { constructor(props) { super(props); this.state = {target: "World"} } componentDidMount() { console.log('mounting......') } componentWillUnmount() { /* ... */ } render() { return (
Hello, {this.state.target}!
) } } @louis993546
Slide 48
Slide 48 text
@louis993546
Slide 49
Slide 49 text
1. Notify someone when click 2. Have a background 3. Display Text 1. Notify someone when click 2. Have a background 3. Display Image @louis993546
Slide 50
Slide 50 text
1. Notify someone when click 2. Have a background 3. Display Text 1. Notify someone when click 2. Have a background 3. Display Image @louis993546
Slide 51
Slide 51 text
1. Notify someone when click 2. Have a background 3. Display something @louis993546
Slide 52
Slide 52 text
1. Notify someone when click 2. Have a background 3. Display anything @louis993546
Slide 53
Slide 53 text
//... FloatingActionButton( onPressed: () { // Add your onPressed code here! }, child: Icon(Icons.navigation), backgroundColor: Colors.green, ), //... @louis993546
Slide 54
Slide 54 text
//... FloatingActionButton( onPressed: () { // Add your onPressed code here! }, child: Text('¯\_(ツ)_/¯'), backgroundColor: Colors.green, ), //... @louis993546
Slide 55
Slide 55 text
class HelloWorld extends React.Component { render() { if (this.props.isFormal) { return /* 2000 lines of very complex layout #1 */ } return /* 2000 lines very complex layout #2 */ } } @louis993546
Slide 56
Slide 56 text
class FormalHelloWorld extends React.Component { render() { return /* 2000 lines of very complex layout #1 */ } } class InformalHelloWorld extends React.Component { render() { return /* 2000 lines of very complex layout #2 */ } } @louis993546
Slide 57
Slide 57 text
Why now? ● Better IDE (Autocomplete, linter, etc.) ● Better performance -> Better developer ergonomics ● Better languages (type inference, lambda/closure, etc.) ○ JavaScript ○ TypeScript/Flow ○ Dart ○ Swift ○ Kotlin ○ (Java 10+) ● etc. @louis993546
Slide 58
Slide 58 text
@louis993546 S A B C D F Flutter XML Data Binding React Compose SwiftUI
Slide 59
Slide 59 text
7. Functional component @louis993546
Slide 60
Slide 60 text
class HelloWorld extends React.Component { constructor(props) { super(props); this.state = {target: "World"} } componentDidMount() { console.log('mounting......') } componentWillUnmount() { /* ... */ } render() { return (
Hello, {this.state.target}!
) } } @louis993546
Slide 61
Slide 61 text
UI = f(state) @louis993546
Slide 62
Slide 62 text
class HelloWorld extends React.Component { constructor(props) { super(props); this.state = {target: "World"} } componentDidMount() { console.log('mounting......') } componentWillUnmount() { /* ... */ } render() { return (
Hello, {this.state.target}!
) } } @louis993546
Slide 63
Slide 63 text
function HelloWorld(props) { const [target, setTarget] = useState("World") useEffect(() => log()) return
Hello, {target}!
} function log() { console.log('mounting......') } @louis993546 class HelloWorld extends React.Component { constructor(props) { super(props); this.state = {target: "World"} } componentDidMount() { console.log('mounting......') } componentWillUnmount() { /* ... */ } render() { return (
Hello, {this.state.target}!
) } } →
Slide 64
Slide 64 text
function HelloWorld(props) { const [target, setTarget] = useState("World") useEffect(() => log()) return
Hello, {target}!
} function log() { console.log('mounting......') } function HelloWorld2(props) { // ... log() // ... } @louis993546 class HelloWorld extends React.Component { constructor(props) { super(props); this.state = {target: "World"} } componentDidMount() { console.log('mounting......') } componentWillUnmount() { /* ... */ } render() { return (
Hello, {this.state.target}!
) } } →
Slide 65
Slide 65 text
ReactConf 2018 @louis993546
Slide 66
Slide 66 text
8. Hindsight @louis993546
Slide 67
Slide 67 text
perception of the nature of an event after it has happened -- Merriam-Webster @louis993546
Slide 68
Slide 68 text
“Read later” ● ${React.js stuff} ○ React hooks ● ${Flutter stuff} ○ Material Components widgets ● Architecture-stuff ○ “Events & Data” ○ MVI, BLoC, etc. ○ Redux, MobX, etc. ● Kotlin extension properties ● Kotlin IR ● Kotlin compiler plugin ● How suspend function compiles ● Virtual DOM @louis993546
Slide 69
Slide 69 text
“Read later” ● ${React.js stuff} ○ React hooks ● ${Flutter stuff} ○ Material Components widgets ● Architecture-stuff ○ “Events & Data” ○ MVI, BLoC, etc. ○ Redux, MobX, etc. ● Kotlin extension properties ● Kotlin IR ● Kotlin compiler plugin ● How suspend function compiles ● Virtual DOM @louis993546 https://bit.ly/2kVVO93
Slide 70
Slide 70 text
@louis993546