Slide 1

Slide 1 text

Effective Dart for mobile developers Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 2

Slide 2 text

A little bit of history 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 3

Slide 3 text

A little bit of history → Client-optimized language for fast apps on any platform 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 4

Slide 4 text

A little bit of history → Client-optimized language for fast apps on any platform → Inspired by JS, Java, C#... 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 5

Slide 5 text

A little bit of history → Client-optimized language for fast apps on any platform → Inspired by JS, Java, C#... → Released in October 2011 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 6

Slide 6 text

A little bit of history → Client-optimized language for fast apps on any platform → Inspired by JS, Java, C#... → Released in October 2011 → v1.0 released in November 2013 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 7

Slide 7 text

A little bit of history → Client-optimized language for fast apps on any platform → Inspired by JS, Java, C#... → Released in October 2011 → v1.0 released in November 2013 → v2.0 released in December 2018 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 8

Slide 8 text

A little bit of history → Client-optimized language for fast apps on any platform → Inspired by JS, Java, C#... → Released in October 2011 → v1.0 released in November 2013 → v2.0 released in December 2018 → Currently in v2.7 2 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 9

Slide 9 text

3

Slide 10

Slide 10 text

Everyone knows Dart already void main() => print('Hello Droidcon Madrid '); 4 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 11

Slide 11 text

Everyone knows Dart already // hello.dart void main(List args) { var name = args[0] ?? 'John Doe'; print('Hello $name'); } // from your terminal $> dart hello.dart Droicon $> Hello Droidcon 5 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 12

Slide 12 text

Everyone knows Dart already Future fetchPost() async { final response = await http.get('https://myblog.com/posts/1'); if (response.statusCode == 200) { return Post.fromJson(json.decode(response.body)); } else { throw Exception('Failed to load post'); } } 6 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 13

Slide 13 text

Everyone knows Dart already Future fetchPost() async { final response = await http.get('https://myblog.com/posts/1'); if (response.statusCode == 200) { return Post.fromJson(json.decode(response.body)); } else { throw Exception('Failed to load post'); } } 6 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 14

Slide 14 text

What makes Dart special? 7 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 15

Slide 15 text

Optimized for UI ! 8 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 16

Slide 16 text

Optimized for UI 9 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 17

Slide 17 text

Optimized for UI → Isolate-based concurrency 9 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 18

Slide 18 text

Optimized for UI → Isolate-based concurrency → Event-loop execution model 9 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 19

Slide 19 text

Optimized for UI → Isolate-based concurrency → Event-loop execution model → Future & Stream API 9 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 20

Slide 20 text

Optimized for UI → Isolate-based concurrency → Event-loop execution model → Future & Stream API → UI-driven features: spread operator, collection if... 9 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 21

Slide 21 text

Isolate-based concurrency 10 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 22

Slide 22 text

Isolate-based concurrency → Space on the machine with: 10 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 23

Slide 23 text

Isolate-based concurrency → Space on the machine with: → its own private memory 10 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 24

Slide 24 text

Isolate-based concurrency → Space on the machine with: → its own private memory → single thread running an event loop 10 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 25

Slide 25 text

Isolates are different than what we are used to 11 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 26

Slide 26 text

Isolates are different than what we are used to → Javascript is single threaded 11 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 27

Slide 27 text

Isolates are different than what we are used to → Javascript is single threaded → No shared memory => no locks! 11 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 28

Slide 28 text

Isolates are different than what we are used to → Javascript is single threaded → No shared memory => no locks! → Go, Rust do not share memory 11 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 29

Slide 29 text

Isolates are different than what we are used to → Javascript is single threaded → No shared memory => no locks! → Go, Rust do not share memory → Low level => you will rarely use them (only w ßhen needing big computation that will drop frames) 11 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 30

Slide 30 text

Isolates Threads No shared memory Shared memory Communication via messages Communicatio n via messages or shared memory Processor time is equally shared Processor time is equally shared 12 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 31

Slide 31 text

Event-loop execution model 13 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 32

Slide 32 text

Future API 14 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 33

Slide 33 text

Stream API 15 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 34

Slide 34 text

Productive development ! 16 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 35

Slide 35 text

Productive development 17 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 36

Slide 36 text

Productive development → Hot-reload to see changes taking effect instantly 17 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 37

Slide 37 text

Productive development → Hot-reload to see changes taking effect instantly → Incredible tooling out of the box 17 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 38

Slide 38 text

Productive development → Hot-reload to see changes taking effect instantly → Incredible tooling out of the box → DartPad to try Dart on your browser 17 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 39

Slide 39 text

Productive development → Hot-reload to see changes taking effect instantly → Incredible tooling out of the box → DartPad to try Dart on your browser → A package manager called pub 17 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 40

Slide 40 text

Hot-reload for instant feedback 18 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 41

Slide 41 text

Hot-reload for instant feedback 19 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 42

Slide 42 text

Hot-reload for instant feedback → Thanks to Just-in-time compilation (JIT) 19 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 43

Slide 43 text

Hot-reload for instant feedback → Thanks to Just-in-time compilation (JIT) → This is how Javascript compiles 19 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 44

Slide 44 text

Incredible tooling out of the box: Timeline view 20 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 45

Slide 45 text

Incredible tooling out of the box: Timeline view 21 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 46

Slide 46 text

Incredible tooling out of the box: Timeline view 22 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 47

Slide 47 text

Incredible tooling out of the box: Timeline view 23 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 48

Slide 48 text

Incredible tooling out of the box: Logger 24 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 49

Slide 49 text

Incredible tooling out of the box: Debugger 25 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 50

Slide 50 text

DartPad to try Dart on your browser 26 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 51

Slide 51 text

DartPad to try Dart on your browser 27 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 52

Slide 52 text

Package manager: pub.dev 28 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 53

Slide 53 text

Dependencies with pubspec.yaml name: she_said_yes_flutter description: My wedding has turned into an open source project version: 1.0.0+1 environment: sdk: ">=2.5.0 <3.0.0" dependencies: flutter: sdk: flutter bloc: 2.0.0 equatable: 1.0.1 flutter_bloc: 2.1.1 flutter_secure_storage: 3.3.1+1 dev_dependencies: flutter_test: sdk: flutter bloc_test: 2.2.0 mockito: 4.1.1 29 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 54

Slide 54 text

Dependencies with pubspec.yaml name: she_said_yes_flutter description: My wedding has turned into an open source project version: 1.0.0+1 environment: sdk: ">=2.5.0 <3.0.0" dependencies: flutter: sdk: flutter bloc: 2.0.0 equatable: 1.0.1 flutter_bloc: 2.1.1 flutter_secure_storage: 3.3.1+1 dev_dependencies: flutter_test: sdk: flutter bloc_test: 2.2.0 mockito: 4.1.1 29 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 55

Slide 55 text

Fast on all platforms ! 30 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 56

Slide 56 text

Fast on all platforms 31 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 57

Slide 57 text

Fast on all platforms → Ahead-of-time compilation to native machine code (AOT) 31 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 58

Slide 58 text

Fast on all platforms → Ahead-of-time compilation to native machine code (AOT) → Target the web with its Javascript compiler 31 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 59

Slide 59 text

Fast on all platforms → Ahead-of-time compilation to native machine code (AOT) → Target the web with its Javascript compiler → Run backend code as well 31 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 60

Slide 60 text

Ahead-of-time compilation (AOT) 32 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 61

Slide 61 text

Ahead-of-time compilation (AOT) → Needed to ship to the AppStore 32 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 62

Slide 62 text

Ahead-of-time compilation (AOT) → Needed to ship to the AppStore → Compile to x64 machine code using dart2native 32 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 63

Slide 63 text

Javascript: dart2js 33 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 64

Slide 64 text

Javascript: dart2js → Use dart2js to compile Dart code to deployable Javascript 33 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 65

Slide 65 text

Run backend code as well 34 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 66

Slide 66 text

Run backend code as well 35 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 67

Slide 67 text

What makes Dart so easy? ! 36 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 68

Slide 68 text

What makes Dart so easy? 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 69

Slide 69 text

What makes Dart so easy? → final vs var 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 70

Slide 70 text

What makes Dart so easy? → final vs var → Optional and named parameters 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 71

Slide 71 text

What makes Dart so easy? → final vs var → Optional and named parameters → Easy to work with collections 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 72

Slide 72 text

What makes Dart so easy? → final vs var → Optional and named parameters → Easy to work with collections → Extension methods (as of v2.7) 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 73

Slide 73 text

What makes Dart so easy? → final vs var → Optional and named parameters → Easy to work with collections → Extension methods (as of v2.7) → Nullability (in preview now) 37 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 74

Slide 74 text

final vs var // can change values var name = 'Jorge'; name = 'George'; dynamic age = 21; age = 31; double pi = 3.14; pi = 3.14159; // can't change value once assigned final fullName = 'Jorge Coca'; const siblingName = 'Clara Coca'; 38 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 75

Slide 75 text

final vs var // can change values var name = 'Jorge'; name = 'George'; dynamic age = 21; age = 31; double pi = 3.14; pi = 3.14159; // can't change value once assigned final fullName = 'Jorge Coca'; const siblingName = 'Clara Coca'; 38 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 76

Slide 76 text

final vs var // can change values var name = 'Jorge'; name = 'George'; dynamic age = 21; age = 31; double pi = 3.14; pi = 3.14159; // can't change value once assigned final fullName = 'Jorge Coca'; const siblingName = 'Clara Coca'; 38 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 77

Slide 77 text

Optional and named parameters Future authenticate({String username, String password}) { ... } authenticate(username: 'jorge', password: '1234'); Future tweet({@required String message, File image}) { ... } tweet(message: 'Droidcon Madrid!'); // tweet without media tweet(message: 'Droidcon Madrid!', image: File('selfie.png')); bool enableFeature(String featureName, bool darkMode = false) { ... } enableFeature('music_playlist'); // darkMode not enabled enableFeature('posts', true); 39 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 78

Slide 78 text

Optional and named parameters Future authenticate({String username, String password}) { ... } authenticate(username: 'jorge', password: '1234'); Future tweet({@required String message, File image}) { ... } tweet(message: 'Droidcon Madrid!'); // tweet without media tweet(message: 'Droidcon Madrid!', image: File('selfie.png')); bool enableFeature(String featureName, bool darkMode = false) { ... } enableFeature('music_playlist'); // darkMode not enabled enableFeature('posts', true); 39 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 79

Slide 79 text

Optional and named parameters Future authenticate({String username, String password}) { ... } authenticate(username: 'jorge', password: '1234'); Future tweet({@required String message, File image}) { ... } tweet(message: 'Droidcon Madrid!'); // tweet without media tweet(message: 'Droidcon Madrid!', image: File('selfie.png')); bool enableFeature(String featureName, bool darkMode = false) { ... } enableFeature('music_playlist'); // darkMode not enabled enableFeature('posts', true); 39 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 80

Slide 80 text

Optional and named parameters Future authenticate({String username, String password}) { ... } authenticate(username: 'jorge', password: '1234'); Future tweet({@required String message, File image}) { ... } tweet(message: 'Droidcon Madrid!'); // tweet without media tweet(message: 'Droidcon Madrid!', image: File('selfie.png')); bool enableFeature(String featureName, bool darkMode = false) { ... } enableFeature('music_playlist'); // darkMode not enabled enableFeature('posts', true); 39 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 81

Slide 81 text

Working with collections: spread operator final firstFive = [1, 2, 3, 4, 5]; final completeList = [0, ...firstFive, 6, 7, 8, 9]; assert(completeList.length == 10); //true 40 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 82

Slide 82 text

Working with collections: spread operator final firstFive = [1, 2, 3, 4, 5]; final completeList = [0, ...firstFive, 6, 7, 8, 9]; assert(completeList.length == 10); //true 40 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 83

Slide 83 text

Working with collections: collection if final tabs = [ 'Artists', 'Playlists', if (socialFeatureEnabled) 'Social', ]; 41 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 84

Slide 84 text

Working with collections: collection for final bonusTracks = [ 'My Shot', 'The Story of Tonight', ]; final hamiltonAlbum = [ 'Alexander Hamilton', 'Aaron Burr, Sir', for (var bonus in bonusTracks) 'Bonus: $bonus', ]; main() => print(hamiltonAlbum); // [Alexander Hamilton, Aaron Burr, Sir, // Bonus: My Shot, Bonus: The Story of Tonight] 42 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 85

Slide 85 text

Working with collections: collection for final bonusTracks = [ 'My Shot', 'The Story of Tonight', ]; final hamiltonAlbum = [ 'Alexander Hamilton', 'Aaron Burr, Sir', for (var bonus in bonusTracks) 'Bonus: $bonus', ]; main() => print(hamiltonAlbum); // [Alexander Hamilton, Aaron Burr, Sir, // Bonus: My Shot, Bonus: The Story of Tonight] 42 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 86

Slide 86 text

Extension methods extension MyString on String { int plusLength(int number) => this.length + number; } void main() { final result = "Droidcon".plusLength(3); print(result); // 11 } 43 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 87

Slide 87 text

Extension methods extension MyString on String { int plusLength(int number) => this.length + number; } void main() { final result = "Droidcon".plusLength(3); print(result); // 11 } 43 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 88

Slide 88 text

Extension methods extension MyString on String { int plusLength(int number) => this.length + number; } void main() { final result = "Droidcon".plusLength(3); print(result); // 11 } 43 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 89

Slide 89 text

Nullability (in preview mode) class Person { final String firstName; DateTime? birthday; Person(this.firstName, this.birthday); int? get year => birthday?.year; } 44 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 90

Slide 90 text

Nullability (in preview mode) class Person { final String firstName; DateTime? birthday; Person(this.firstName, this.birthday); int? get year => birthday?.year; } 44 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 91

Slide 91 text

Nullability (in preview mode) class Person { final String firstName; DateTime? birthday; Person(this.firstName, this.birthday); int? get year => birthday?.year; } 44 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 92

Slide 92 text

Recap 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 93

Slide 93 text

Recap → Easy, familiar syntax 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 94

Slide 94 text

Recap → Easy, familiar syntax → Multiplatform, AOT, JIT 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 95

Slide 95 text

Recap → Easy, familiar syntax → Multiplatform, AOT, JIT → Optimized for UI 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 96

Slide 96 text

Recap → Easy, familiar syntax → Multiplatform, AOT, JIT → Optimized for UI → Isolate, event-loop 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 97

Slide 97 text

Recap → Easy, familiar syntax → Multiplatform, AOT, JIT → Optimized for UI → Isolate, event-loop → Modern feature set 45 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 98

Slide 98 text

Dart powers... 46 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 99

Slide 99 text

Flutter powers... flutter.dev/showcase 47 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 100

Slide 100 text

If you liked this talk 48 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 101

Slide 101 text

If you liked this talk → Very Good Ventures, ex-BMW 48 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 102

Slide 102 text

If you liked this talk → Very Good Ventures, ex-BMW → ! @jcocaramos 48 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 103

Slide 103 text

If you liked this talk → Very Good Ventures, ex-BMW → ! @jcocaramos → ☕ jorgecoca.dev 48 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 104

Slide 104 text

If you liked this talk → Very Good Ventures, ex-BMW → ! @jcocaramos → ☕ jorgecoca.dev → Say hi! 48 — Jorge Coca, Very Good Ventures @ Droidcon Madrid 2019

Slide 105

Slide 105 text

Thank you !