Slide 1

Slide 1 text

Flutter O que é isso?

Slide 2

Slide 2 text

2 Desenvolvimento multi-plataforma

Slide 3

Slide 3 text

Wrapper WebView ● Know-how das tecnologias web ● Versões do JavaScript & features da WebView divergentes entre versões (fragmentação) ● Limitação no uso de recursos não incluídos no SDK JavaScript ● Performance ● Lentidão na disponibilização de novas features para as plataformas 3

Slide 4

Slide 4 text

Wrapper WebView 4

Slide 5

Slide 5 text

Transpiler ● Código-fonte para Código-fonte ● Ganhos em performance ● Frequentemente existe a necessidade de lidar diretamente com código nativo ● Algumas abstrações não funcionam bem para todas as plataformas - write once, fix everywhere 5

Slide 6

Slide 6 text

Transpiler 6

Slide 7

Slide 7 text

Flutter ● Engine (C++) ● Não utiliza o toolkit da plataforma - ele tem seu próprio toolkit! ● Se conecta às camadas mais baixo nível de cada SO - gráficos, som, etc. ● Binários otimizados para cada plataforma 7

Slide 8

Slide 8 text

Flutter 8

Slide 9

Slide 9 text

Dicas de leitura THE DIFFERENT APPROACHES TO CROSS-PLATFORM APPS https://bit.ly/2GZM4Vb WHAT’S REVOLUTIONARY ABOUT FLUTTER https://bit.ly/2gEFW8d 9

Slide 10

Slide 10 text

Flutter: o que é? ● Toolkit para a criação extremamente rápida de aplicativos multi-plataforma (iOS e Android)* ● Open-Source, atualmente Beta ● Foco na criação de interfaces belas e performáticas ● Possibilidade de interoperabilidade com código pré-existente 10

Slide 11

Slide 11 text

Flutter: Aplicações 11 DESENVOLVIMENTO Baixa curva de aprendizado, velocidade e um codebase único Mix up your images to match your content. Mix up your images to match your content. PROTOTIPAÇÃO Rápida iteração e customização de componentes DESIGN Unificação da linguagem utilizada - mesmo sem experiência prévia em desenvolvimento

Slide 12

Slide 12 text

Exemplos 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

14 DART???

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

Dart ● Familiar a linguagens conhecidas (C-like) ● Amplamente utilizada em diversos produtos internamente no Google ● Compila ARM e x86, transpila para JavaScript ● Vasta Standard Library ● Versão 2 lançada recentemente 16

Slide 17

Slide 17 text

TOOLING 17

Slide 18

Slide 18 text

Tooling flutter doctor flutter upgrade flutter init flutter packages get|upgrade flutter format flutter analyze flutter run 18

Slide 19

Slide 19 text

pubspec.yaml name: flutter_project description: A new Flutter project. dependencies: flutter: sdk: flutter flutter: uses-material-design: true 19

Slide 20

Slide 20 text

pubspec.yaml name: flutter_project description: A new Flutter project. dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.2 flutter: uses-material-design: true 20

Slide 21

Slide 21 text

Tooling 21

Slide 22

Slide 22 text

Hot Reload 22

Slide 23

Slide 23 text

Runtime Errors 23

Slide 24

Slide 24 text

UI TOOLKIT 24

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

27

Slide 28

Slide 28 text

28

Slide 29

Slide 29 text

Layouts Locais Todo widget define seu próprio layout: não existe um sistema global de layout new Center( child: new Text('Texto centralizado'), ); 29

Slide 30

Slide 30 text

Layouts Locais Todo widget define seu próprio layout: não existe um sistema global de layout Center( child: Text('Texto centralizado'), ); // no Dart 2, 'new' é opcional 30

Slide 31

Slide 31 text

Tudo é um widget 31

Slide 32

Slide 32 text

Tudo é um widget class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { ... } } 32

Slide 33

Slide 33 text

Tudo é um widget class MyWidget extends StatefulWidget { @override State createState() { ... } } 33

Slide 34

Slide 34 text

Tudo é um widget class MyWidget extends StatefulWidget { @override State createState() { ... } } 34

Slide 35

Slide 35 text

Tudo é um widget class _MyWidgetState extends State { var _counter = 0; ... void incrementCounter() { setState(() { _counter++; }); } } 35

Slide 36

Slide 36 text

Tudo é um widget class MyWidget extends StatefulWidget { @override State createState() { ... } } 36

Slide 37

Slide 37 text

Tudo é um widget class MyWidget extends StatefulWidget { @override _MyWidgetState createState() { ... } } 37

Slide 38

Slide 38 text

Tudo é um widget class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => new _MyWidgetState(); } 38

Slide 39

Slide 39 text

NAVEGAÇÃO 39

Slide 40

Slide 40 text

Navegação class MyApp extends StatelessWidget { var routes = ... @override Widget build(BuildContext context) { return new MaterialApp( title: 'Hello TDC!', ... home: HomeScreen(), routes: routes, ); } } 40

Slide 41

Slide 41 text

Navegação class MyApp extends StatelessWidget { var routes = ... @override Widget build(BuildContext context) { return new MaterialApp( title: 'Hello TDC!', ... home: HomeScreen(), routes: routes, ); } } 41

Slide 42

Slide 42 text

Navegação val routes = { '/home': (BuildContext context) => new HomeScreen(), '/details': (BuildContext context) => new DetailsScreen() }; Navigator.pushNamed(context, '/details'); Navigator.push( context, new MaterialPageRoute(builder: (context) => new DetailScreen()), ); Navigator.pop(context); 42

Slide 43

Slide 43 text

Navegação val routes = { '/home': (BuildContext context) => new HomeScreen(), '/details': (BuildContext context) => new DetailsScreen() }; Navigator.pushNamed(context, '/details'); Navigator.push( context, new MaterialPageRoute(builder: (context) => new DetailScreen()), ); Navigator.pop(context); 43

Slide 44

Slide 44 text

Navegação val routes = { '/home': (BuildContext context) => new HomeScreen(), '/details': (BuildContext context) => new DetailsScreen() }; Navigator.pushNamed(context, '/details'); Navigator.push( context, new MaterialPageRoute(builder: (context) => new DetailScreen()), ); Navigator.pop(context); 44

Slide 45

Slide 45 text

Navegação val routes = { '/home': (BuildContext context) => new HomeScreen(), '/details': (BuildContext context) => new DetailsScreen() }; Navigator.pushNamed(context, '/details'); Navigator.push( context, new MaterialPageRoute(builder: (context) => new DetailScreen()), ); Navigator.pop(context); 45

Slide 46

Slide 46 text

PLATFORM CHANNELS 46

Slide 47

Slide 47 text

Platform Channels Camada de comunicação que permite que o Flutter acesse serviços na plataforma de execução (Android, iOS) 47

Slide 48

Slide 48 text

Platform Channels (ex. Android) class MainActivity() : FlutterActivity() { private val CHANNEL = "samples.flutter.io/battery" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) GeneratedPluginRegistrant.registerWith(this) MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result -> // TODO } } } 48

Slide 49

Slide 49 text

Platform Channels (Android) MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getBatteryLevel") { val batteryLevel = getBatteryLevel() if (batteryLevel != -1) { result.success(batteryLevel) } else { result.error("UNAVAILABLE", "Battery level not available.", null) } } else { result.notImplemented() } } 49

Slide 50

Slide 50 text

Platform Channels (Flutter) String _batteryLevel = 'Unknown battery level.'; Future _getBatteryLevel() async { String batteryLevel; try { final int result = await platform.invokeMethod('getBatteryLevel'); batteryLevel = 'Battery level at $result % .'; } on PlatformException catch (e) { batteryLevel = "Failed to get battery level: '${e.message}'."; } setState(() { _batteryLevel = batteryLevel; }); } 50

Slide 51

Slide 51 text

Links FLUTTER https://flutter.io FLUTTER FOR WEB DEVELOPERS https://flutter.io/web-analogs/ FLUTTER FOR ANDROID DEVELOPERS https://flutter.io/flutter-for-android/ FLUTTER FOR REACT NATIVE DEVELOPERS https://flutter.io/flutter-for-react-native/ 51

Slide 52

Slide 52 text

Links - Vídeos WHAT IS FLUTTER? https://www.youtube.com/watch?v=h7HOt3Jb1Ts SINGLE CODEBASE, TWO APPS WITH FLUTTER AND FIREBASE https://www.youtube.com/watch?v=w2TcYP8qiRI IN RECORD TIME: HOW WE QUICKLY BUILT A SERVERLESS APP WITH FIREBASE AND FLUTTER https://www.youtube.com/watch?v=prlK_QL_qOA HOW DART AND FLUTTER WORK TOGETHER? https://www.youtube.com/watch?v=iVYpeEd3Jes 52

Slide 53

Slide 53 text

OBRIGADO Slides disponíveis em: speakerdeck.com/rafaeltoledo 53