SlideShare une entreprise Scribd logo
1  sur  70
Télécharger pour lire hors ligne
Flutter Paris
Aller un peu plus loin…
Edouard Marquez
Freelance développeur Android & Flutter
2
@g123k edouard@marquez.cool
@FlutterDev
Qui suis-je ?
3
Flutter Paris
Aller plus loin en Flutter
Android / iOS Et maintenant ?
— Comment faire communiquer son
code Flutter avec Android et / ou
iOS ?
— Roadmap Flutter
— Ressources utiles
Les packages / plugins
— A quoi servent-ils ?
— Où les trouver ?
— Comment les utiliser dans ses
applications ?
Communiquer avec
Android et iOS
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter et Android / iOS
5
FlutterView
Dans une Activité
Android
FlutterViewController
Dans un AppDelegate
iOS
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter et Android / iOS
5
FlutterView
Dans une Activité
Android
FlutterViewController
Dans un AppDelegate
iOS
Dart
runApp()
Flutter
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
MethodChannel : Communication avec résultat
6
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
MethodChannel : Communication avec résultat
6
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
MethodChannel : Communication avec résultat
6
Résultat, erreur ou non implémenté
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
MethodChannel : Communication avec résultat
6
Résultat, erreur ou non implémenté
Dart Android iOS
null null nil / NSNull
bool Boolean NSNumber numberWithBool
int Integer NSNumber numberWithInt
Int (> 32 bits) Long NSNumber numberWithLong
Int (> 64 bits) BigInteger FlutterStandardBigInteger
double Double NSNumber numberWithDouble
String String NSString
Uint8List byte[] FlutterStandardTypedData typedDataWithBytes:
Int32List int[] FlutterStandardTypedData typedDataWithInt32:
Int64List long[] FlutterStandardTypedData typedDataWithInt64:
Float64List double[] FlutterStandardTypedData typedDataWithFloat64:
List ArrayList NSArray
Map HashMap NSDictionary
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel côté Flutter
7
Dart
On crée un MethodChannel, sur
lequel on va appeler une méthode
dont le résultat est asynchrone.
static const MethodChannel channel = const
MethodChannel('flutter.paris/test');
Future<String> getBatteryLevel() {
try {
int level = await
channel.invokeMethod('getBatteryLevel');
return 'Battery level $level';
} on PlatformException {
return "Unknown battery level";
}
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel côté Flutter
7
Dart
On crée un MethodChannel, sur
lequel on va appeler une méthode
dont le résultat est asynchrone.
static const MethodChannel channel = const
MethodChannel('flutter.paris/test');
Future<String> getBatteryLevel() {
try {
int level = await
channel.invokeMethod('getBatteryLevel');
return 'Battery level $level';
} on PlatformException {
return "Unknown battery level";
}
}
Future<String> getBatteryLevel() {
try {
int level = await
channel.invokeMethod('getBatteryLevel');
return 'Battery level $level';
} on PlatformException {
return "Unknown battery level";
}
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur Android
8
Android
On modifie le code de la MainActivity public class MainActivity extends FlutterActivity {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
GeneratedPluginRegistrant.registerWith(this);
// TODO
}
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur Android
9
new MethodChannel(getFlutterView(), "flutter.paris/test")
.setMethodCallHandler(new MethodCallHandler() {
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}}}
);}}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur Android
9
new MethodChannel(getFlutterView(), "flutter.paris/test")
.setMethodCallHandler(new MethodCallHandler() {
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}}}
);}}
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}}}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur Android
9
new MethodChannel(getFlutterView(), "flutter.paris/test")
.setMethodCallHandler(new MethodCallHandler() {
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}}}
);}}
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}}}
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur iOS
10
iOS
On modifie le code de l'AppDelegate
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
FlutterViewController* controller =
(FlutterViewController*)self.window.rootViewController;
FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
methodChannelWithName:@"flutter.paris/test"
binaryMessenger:controller];
// TODO
return [super application:application
didFinishLaunchingWithOptions:launchOptions];
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur iOS
10
iOS
On modifie le code de l'AppDelegate
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
FlutterViewController* controller =
(FlutterViewController*)self.window.rootViewController;
FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
methodChannelWithName:@"flutter.paris/test"
binaryMessenger:controller];
// TODO
return [super application:application
didFinishLaunchingWithOptions:launchOptions];
}
FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
methodChannelWithName:@"flutter.paris/test"
binaryMessenger:controller];
// TODO
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur iOS
11
[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
if ([@"getBatteryLevel" isEqualToString:call.method]) {
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
} else {
result(FlutterMethodNotImplemented);
}
}];
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur iOS
11
[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
if ([@"getBatteryLevel" isEqualToString:call.method]) {
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
} else {
result(FlutterMethodNotImplemented);
}
}];
if ([@"getBatteryLevel" isEqualToString:call.method]) {
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
} else {
result(FlutterMethodNotImplemented);
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les MethodChannel sur iOS
11
[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
if ([@"getBatteryLevel" isEqualToString:call.method]) {
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
} else {
result(FlutterMethodNotImplemented);
}
}];
if ([@"getBatteryLevel" isEqualToString:call.method]) {
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
} else {
result(FlutterMethodNotImplemented);
}
int batteryLevel = [self getBatteryLevel];
if (batteryLevel == -1) {
result([FlutterError errorWithCode:@"UNAVAILABLE"
message:@"Battery info unavailable" 

details:nil]);
} else {
result(@(batteryLevel));
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
EventChannel : Communication avec un seul résultat
12
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
EventChannel : Communication avec un seul résultat
12
Résultat(s) et/ou
erreur(s)
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel côté Flutter
13
Dart
On crée un EventChannel, sur lequel
on va appeler une méthode dont le
résultat est un Stream.
static const EventChannel eventChannel = const
EventChannel('flutter.paris/testEvent');
eventChannel.receiveBroadcastStream()
.listen((obj) {
// Nouvelle position reçue
}, (err) {
// Nouvelle erreur reçue
}
);
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel côté Flutter
13
Dart
On crée un EventChannel, sur lequel
on va appeler une méthode dont le
résultat est un Stream.
static const EventChannel eventChannel = const
EventChannel('flutter.paris/testEvent');
eventChannel.receiveBroadcastStream()
.listen((obj) {
// Nouvelle position reçue
}, (err) {
// Nouvelle erreur reçue
}
);
eventChannel.receiveBroadcastStream()
.listen((obj) {
// Nouvelle valeur reçue
}, onError: (err) {
// Nouvelle erreur reçue
}
);
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur Android
14
Android
On modifie le code de la MainActivity
On met en attribut l'EventSink
public class MainActivity extends FlutterActivity {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
GeneratedPluginRegistrant.registerWith(this);
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur Android
14
Android
On modifie le code de la MainActivity
On met en attribut l'EventSink
public class MainActivity extends FlutterActivity
implements StreamHandler {
private EventSink sink;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
GeneratedPluginRegistrant.registerWith(this);
new EventChannel(getFlutterView(),
"flutter.paris/testEvent")

.setStreamHandler(this));
}
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur Android
15
@Override
public void onListen(Object arguments, EventSink events) {
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.
}
@Override
public void onListen(Object arguments, EventSink events) {
this.sink = events;
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.sink = null;
}
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur Android
15
@Override
public void onListen(Object arguments, EventSink events) {
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.
}
@Override
public void onListen(Object arguments, EventSink events) {
this.sink = events;
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.sink = null;
}
}
this.sink = events;
events.success("Hello");
events.success("World");
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur Android
15
@Override
public void onListen(Object arguments, EventSink events) {
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.
}
@Override
public void onListen(Object arguments, EventSink events) {
this.sink = events;
events.success("Hello");
events.success("World");
}
@Override
public void onCancel(Object arguments) {
this.sink = null;
}
}
this.sink = events;
events.success("Hello");
events.success("World");
this.sink = null;
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
16
iOS
On modifie le code de l'AppDelegate
On garde la variable de type
FlutterEventSink pour l'appeler à
n'importe quel moment
@implementation AppDelegate { FlutterEventSink _eventSink; }
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
FlutterViewController* controller =
(FlutterViewController*)self.window.rootViewController;
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"flutter.paris/testEvent"
binaryMessenger:controller]; 

[eventChannel setStreamHandler:self];
}
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
16
iOS
On modifie le code de l'AppDelegate
On garde la variable de type
FlutterEventSink pour l'appeler à
n'importe quel moment
@implementation AppDelegate { FlutterEventSink _eventSink; }
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
FlutterViewController* controller =
(FlutterViewController*)self.window.rootViewController;
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"flutter.paris/testEvent"
binaryMessenger:controller]; 

[eventChannel setStreamHandler:self];
}
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"flutter.paris/testEvent"
binaryMessenger:controller];
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
16
iOS
On modifie le code de l'AppDelegate
On garde la variable de type
FlutterEventSink pour l'appeler à
n'importe quel moment
@implementation AppDelegate { FlutterEventSink _eventSink; }
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
FlutterViewController* controller =
(FlutterViewController*)self.window.rootViewController;
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"flutter.paris/testEvent"
binaryMessenger:controller]; 

[eventChannel setStreamHandler:self];
}
@implementation AppDelegate { FlutterEventSink _eventSink; }
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"flutter.paris/testEvent"
binaryMessenger:controller];
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
17
- (FlutterError*)onListenWithArguments:(id)arguments
eventSink:(FlutterEventSink)eventSink {
_eventSink = eventSink;
_eventSink(@"Hello");
_eventSink(@"World");
return nil;
}
- (FlutterError*)onCancelWithArguments:(id)arguments {
_eventSink = nil;
return nil;
}
@end
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
17
- (FlutterError*)onListenWithArguments:(id)arguments
eventSink:(FlutterEventSink)eventSink {
_eventSink = eventSink;
_eventSink(@"Hello");
_eventSink(@"World");
return nil;
}
- (FlutterError*)onCancelWithArguments:(id)arguments {
_eventSink = nil;
return nil;
}
@end
_eventSink = eventSink;
_eventSink(@"Hello");
_eventSink(@"World");
Flutter Paris sli.do/zr8eef4g
Communication Android / iOS Packages / plugins Et maintenant ?
Les EventChannel sur iOS
17
- (FlutterError*)onListenWithArguments:(id)arguments
eventSink:(FlutterEventSink)eventSink {
_eventSink = eventSink;
_eventSink(@"Hello");
_eventSink(@"World");
return nil;
}
- (FlutterError*)onCancelWithArguments:(id)arguments {
_eventSink = nil;
return nil;
}
@end
_eventSink = eventSink;
_eventSink(@"Hello");
_eventSink(@"World");
_eventSink = nil;
Les packages
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
A quoi servent-ils ?
19
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
A quoi servent-ils ?
19
Nouveaux widgets
Nouveaux composants
graphiques
Outils tiers
Firebase, MixPanel…
Nouveau composants
Redux, RXDart…
Compléter des fonctions
Ex: demander la
géolocalisation du téléphone
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Quelle différence entre package et plugin ?
20
Package
Ne contient que
du code Dart
(dossier lib)
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Quelle différence entre package et plugin ?
21
Android
Code Java/Kotlin
(dossier android)
iOS
Code Obj C/Swift
(dossier ios)
Plugin
Code Dart
(dossier lib)
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Où les trouver ?
22
https://pub.dartlang.org/flutter
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Choisir son plugin
23
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Choisir son plugin
23
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Pub : le gestionnaire des dépendances
24
Le gestionnaire des
dépendances du
langage Dart
pub
Fichier dans lequel
on indique les
dépendances du projet
pubspec.yaml
Fichier généré qui précise
quelles versions
des dépendances
sont utilisées
pubspec.lock
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Comment les utiliser dans vos applications ?
25
Pubspec.yaml
Le fichier pubspec est en quelque
sorte la carte d'identité de
l'application.
On y indique le nom et la description
du projet, tout comme les ressources
(assets) qui pourront être utilisées.
On indique également les
dépendances qui seront utilisées.
name: helloworld
description: A new Flutter project.
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Ajouter une dépendance
26
Ajouter la dépendance
au projet
dependencies
firebase_auth: '^0.5.3'
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Pubspec.yaml : indiquer le numéro de version
27
any
La dernière version disponible
1.2.3
Exactement la version 1.2.3
>=1.2.3
Au moins la 1.2.3
>1.2.3
Une version supérieure
à la 1.2.3
<=1.2.3
Au maximum la 1.2.3
<1.2.3
Une version antérieure
à la 1.2.3
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Pubspec.yaml : indiquer une plage de versions
28
Utiliser la version la plus
récente entre la 0.5 et 0.9**
dependencies
firebase_auth: '>=0.5.3 <0.6.0'
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Pubspec.yaml : indiquer une plage de versions
28
Utiliser la version la plus
récente entre la 0.5 et 0.9**
dependencies
firebase_auth: '>=0.5.3 <0.6.0'
La caret syntax
permet d'exprimer une
plage de versions
dependencies
firebase_auth: '^0.5.3'
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Dépendances : la source
29
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Dépendances : la source
29
Repo officiel
pub.dartlang.org
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Dépendances : la source
29
Repo privé
Hébergé par vos soins
Repo officiel
pub.dartlang.org
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Dépendances : la source
29
Repo privé
Hébergé par vos soins
Git
Pointer sur une branche, 

un tag ou un commit
Repo officiel
pub.dartlang.org
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Dépendances : la source
29
Repo privé
Hébergé par vos soins
Git
Pointer sur une branche, 

un tag ou un commit
Repo officiel
pub.dartlang.org
Dossier local
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Flutter packages… : les commandes utiles
30
Récupère les dépendances
pour les nouveaux packages
flutter packages get
Mettre à jour
les dépendances
flutter packages upgrade
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
31
Authentification
Database & Cloud Firestore
Storage
Analytics
Messaging
AdMob
Firebase
Base de données SQLite (SQFLite)
Préférences (~ NSUserDefaults)
Données
Flux
Redux
RXDart
Flutter Stream Friends
Autres
Google
Facebook
Twitter
Comptes
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
32
Graphiques (animés)
Charts Flutter
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
32
Graphiques (animés)
Charts Flutter
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
33
Grille avec des éléments de
tailles différentes
Staggered 

Grid View
De la parallaxe avec
n'importe quel widget
Flutter
Parallax
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
33
Grille avec des éléments de
tailles différentes
Staggered 

Grid View
De la parallaxe avec
n'importe quel widget
Flutter
Parallax
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
34
Moteur de jeu 2D
Sprite Widget
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Une sélection des packages utiles
34
Moteur de jeu 2D
Sprite Widget
Et maintenant ?
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Roadmap (sur GitHub)
36
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Roadmap (lors de l'annonce de la bêta)
37
Intégration WebView
Maps
Routing
Taille
Faciliter l'intégration de
Flutter dans une
application existante
Enrichir/améliorer les
APIs pour la navigation
Intégrer des WebView
dans l'arbre des widgets
Intégrer une carte
comme widget
Réduire la taille du
moteur
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Roadmap (sondage)
38
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Quelques ressources
39
Flutter.rocks
https://flutter.rocks/
Sergi & Replace
https://sergiandreplace.com
Flutter institute
https://flutter.institute/
Codelabs
codelabs.google.com / flutter.io
Flutter Weekly
https://flutterweekly.net/
Communication Android / iOS Packages / plugins Et maintenant ?
Flutter Paris sli.do/zr8eef4g
Extension Chrome
40
Merci :)
Questions ?
41
@g123k @FlutterDev

Contenu connexe

Tendances

Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelThierry Gayet
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Innobec
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
Langage C
Langage  CLangage  C
Langage Cjwilili
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en cbenouini rachid
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateursAziz Darouichi
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Cours c#
Cours c#Cours c#
Cours c#zan
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NETAziz Darouichi
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage cEbrima NJIE
 

Tendances (18)

Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appel
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)
 
Chapitre2 prog dsplf3
Chapitre2 prog dsplf3Chapitre2 prog dsplf3
Chapitre2 prog dsplf3
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Langage C
Langage  CLangage  C
Langage C
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Le langage C
Le langage CLe langage C
Le langage C
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en c
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Le langage C
Le langage CLe langage C
Le langage C
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Cours c#
Cours c#Cours c#
Cours c#
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NET
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage c
 

Similaire à Flutter : communication Android/iOS et les packages

Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Formation POO & Java (2ème séance)
Formation POO & Java (2ème séance)Formation POO & Java (2ème séance)
Formation POO & Java (2ème séance)G²FOSS ENIT
 
Contrôle de la qualité logiciel
Contrôle de la qualité logicielContrôle de la qualité logiciel
Contrôle de la qualité logicielSylvain Leroy
 
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...ATPENSC-Group
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdfPatiento Del Mar
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des appsNoé Breiss
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 

Similaire à Flutter : communication Android/iOS et les packages (20)

Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Formation POO & Java (2ème séance)
Formation POO & Java (2ème séance)Formation POO & Java (2ème séance)
Formation POO & Java (2ème séance)
 
Contrôle de la qualité logiciel
Contrôle de la qualité logicielContrôle de la qualité logiciel
Contrôle de la qualité logiciel
 
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...
Fiche de TD 1 de préparation probatoire (littéraire et scientifique) du Camer...
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
Tpag appli-galaxy
Tpag appli-galaxyTpag appli-galaxy
Tpag appli-galaxy
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des apps
 
Tutorial android
Tutorial androidTutorial android
Tutorial android
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 

Flutter : communication Android/iOS et les packages

  • 1. Flutter Paris Aller un peu plus loin…
  • 2. Edouard Marquez Freelance développeur Android & Flutter 2 @g123k edouard@marquez.cool @FlutterDev Qui suis-je ?
  • 3. 3 Flutter Paris Aller plus loin en Flutter Android / iOS Et maintenant ? — Comment faire communiquer son code Flutter avec Android et / ou iOS ? — Roadmap Flutter — Ressources utiles Les packages / plugins — A quoi servent-ils ? — Où les trouver ? — Comment les utiliser dans ses applications ?
  • 5. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Flutter et Android / iOS 5 FlutterView Dans une Activité Android FlutterViewController Dans un AppDelegate iOS
  • 6. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Flutter et Android / iOS 5 FlutterView Dans une Activité Android FlutterViewController Dans un AppDelegate iOS Dart runApp() Flutter
  • 7. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? MethodChannel : Communication avec résultat 6
  • 8. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? MethodChannel : Communication avec résultat 6
  • 9. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? MethodChannel : Communication avec résultat 6 Résultat, erreur ou non implémenté
  • 10. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? MethodChannel : Communication avec résultat 6 Résultat, erreur ou non implémenté Dart Android iOS null null nil / NSNull bool Boolean NSNumber numberWithBool int Integer NSNumber numberWithInt Int (> 32 bits) Long NSNumber numberWithLong Int (> 64 bits) BigInteger FlutterStandardBigInteger double Double NSNumber numberWithDouble String String NSString Uint8List byte[] FlutterStandardTypedData typedDataWithBytes: Int32List int[] FlutterStandardTypedData typedDataWithInt32: Int64List long[] FlutterStandardTypedData typedDataWithInt64: Float64List double[] FlutterStandardTypedData typedDataWithFloat64: List ArrayList NSArray Map HashMap NSDictionary
  • 11. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel côté Flutter 7 Dart On crée un MethodChannel, sur lequel on va appeler une méthode dont le résultat est asynchrone. static const MethodChannel channel = const MethodChannel('flutter.paris/test'); Future<String> getBatteryLevel() { try { int level = await channel.invokeMethod('getBatteryLevel'); return 'Battery level $level'; } on PlatformException { return "Unknown battery level"; } }
  • 12. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel côté Flutter 7 Dart On crée un MethodChannel, sur lequel on va appeler une méthode dont le résultat est asynchrone. static const MethodChannel channel = const MethodChannel('flutter.paris/test'); Future<String> getBatteryLevel() { try { int level = await channel.invokeMethod('getBatteryLevel'); return 'Battery level $level'; } on PlatformException { return "Unknown battery level"; } } Future<String> getBatteryLevel() { try { int level = await channel.invokeMethod('getBatteryLevel'); return 'Battery level $level'; } on PlatformException { return "Unknown battery level"; } }
  • 13. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur Android 8 Android On modifie le code de la MainActivity public class MainActivity extends FlutterActivity { public void onCreate(Bundle bundle) { super.onCreate(bundle); GeneratedPluginRegistrant.registerWith(this); // TODO } }
  • 14. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur Android 9 new MethodChannel(getFlutterView(), "flutter.paris/test") .setMethodCallHandler(new MethodCallHandler() { public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("getBatteryLevel")) { int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); } } else { result.notImplemented(); }}} );}}
  • 15. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur Android 9 new MethodChannel(getFlutterView(), "flutter.paris/test") .setMethodCallHandler(new MethodCallHandler() { public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("getBatteryLevel")) { int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); } } else { result.notImplemented(); }}} );}} if (call.method.equals("getBatteryLevel")) { int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); } } else { result.notImplemented(); }}}
  • 16. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur Android 9 new MethodChannel(getFlutterView(), "flutter.paris/test") .setMethodCallHandler(new MethodCallHandler() { public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("getBatteryLevel")) { int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); } } else { result.notImplemented(); }}} );}} if (call.method.equals("getBatteryLevel")) { int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); } } else { result.notImplemented(); }}} int batteryLevel = getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level not available.", null); }
  • 17. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur iOS 10 iOS On modifie le code de l'AppDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterMethodChannel* batteryChannel = [FlutterMethodChannel methodChannelWithName:@"flutter.paris/test" binaryMessenger:controller]; // TODO return [super application:application didFinishLaunchingWithOptions:launchOptions]; }
  • 18. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur iOS 10 iOS On modifie le code de l'AppDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterMethodChannel* batteryChannel = [FlutterMethodChannel methodChannelWithName:@"flutter.paris/test" binaryMessenger:controller]; // TODO return [super application:application didFinishLaunchingWithOptions:launchOptions]; } FlutterMethodChannel* batteryChannel = [FlutterMethodChannel methodChannelWithName:@"flutter.paris/test" binaryMessenger:controller]; // TODO
  • 19. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur iOS 11 [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); } }];
  • 20. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur iOS 11 [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); } }]; if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); }
  • 21. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les MethodChannel sur iOS 11 [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); } }]; if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); } int batteryLevel = [self getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" 
 details:nil]); } else { result(@(batteryLevel)); }
  • 22. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? EventChannel : Communication avec un seul résultat 12
  • 23. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? EventChannel : Communication avec un seul résultat 12 Résultat(s) et/ou erreur(s)
  • 24. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel côté Flutter 13 Dart On crée un EventChannel, sur lequel on va appeler une méthode dont le résultat est un Stream. static const EventChannel eventChannel = const EventChannel('flutter.paris/testEvent'); eventChannel.receiveBroadcastStream() .listen((obj) { // Nouvelle position reçue }, (err) { // Nouvelle erreur reçue } );
  • 25. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel côté Flutter 13 Dart On crée un EventChannel, sur lequel on va appeler une méthode dont le résultat est un Stream. static const EventChannel eventChannel = const EventChannel('flutter.paris/testEvent'); eventChannel.receiveBroadcastStream() .listen((obj) { // Nouvelle position reçue }, (err) { // Nouvelle erreur reçue } ); eventChannel.receiveBroadcastStream() .listen((obj) { // Nouvelle valeur reçue }, onError: (err) { // Nouvelle erreur reçue } );
  • 26. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur Android 14 Android On modifie le code de la MainActivity On met en attribut l'EventSink public class MainActivity extends FlutterActivity { public void onCreate(Bundle bundle) { super.onCreate(bundle); GeneratedPluginRegistrant.registerWith(this); }
  • 27. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur Android 14 Android On modifie le code de la MainActivity On met en attribut l'EventSink public class MainActivity extends FlutterActivity implements StreamHandler { private EventSink sink; public void onCreate(Bundle bundle) { super.onCreate(bundle); GeneratedPluginRegistrant.registerWith(this); new EventChannel(getFlutterView(), "flutter.paris/testEvent")
 .setStreamHandler(this)); } }
  • 28. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur Android 15 @Override public void onListen(Object arguments, EventSink events) { events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this. } @Override public void onListen(Object arguments, EventSink events) { this.sink = events; events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this.sink = null; } }
  • 29. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur Android 15 @Override public void onListen(Object arguments, EventSink events) { events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this. } @Override public void onListen(Object arguments, EventSink events) { this.sink = events; events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this.sink = null; } } this.sink = events; events.success("Hello"); events.success("World");
  • 30. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur Android 15 @Override public void onListen(Object arguments, EventSink events) { events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this. } @Override public void onListen(Object arguments, EventSink events) { this.sink = events; events.success("Hello"); events.success("World"); } @Override public void onCancel(Object arguments) { this.sink = null; } } this.sink = events; events.success("Hello"); events.success("World"); this.sink = null;
  • 31. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 16 iOS On modifie le code de l'AppDelegate On garde la variable de type FlutterEventSink pour l'appeler à n'importe quel moment @implementation AppDelegate { FlutterEventSink _eventSink; } -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter.paris/testEvent" binaryMessenger:controller]; 
 [eventChannel setStreamHandler:self]; }
  • 32. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 16 iOS On modifie le code de l'AppDelegate On garde la variable de type FlutterEventSink pour l'appeler à n'importe quel moment @implementation AppDelegate { FlutterEventSink _eventSink; } -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter.paris/testEvent" binaryMessenger:controller]; 
 [eventChannel setStreamHandler:self]; } FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter.paris/testEvent" binaryMessenger:controller];
  • 33. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 16 iOS On modifie le code de l'AppDelegate On garde la variable de type FlutterEventSink pour l'appeler à n'importe quel moment @implementation AppDelegate { FlutterEventSink _eventSink; } -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter.paris/testEvent" binaryMessenger:controller]; 
 [eventChannel setStreamHandler:self]; } @implementation AppDelegate { FlutterEventSink _eventSink; } FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter.paris/testEvent" binaryMessenger:controller];
  • 34. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 17 - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _eventSink = eventSink; _eventSink(@"Hello"); _eventSink(@"World"); return nil; } - (FlutterError*)onCancelWithArguments:(id)arguments { _eventSink = nil; return nil; } @end
  • 35. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 17 - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _eventSink = eventSink; _eventSink(@"Hello"); _eventSink(@"World"); return nil; } - (FlutterError*)onCancelWithArguments:(id)arguments { _eventSink = nil; return nil; } @end _eventSink = eventSink; _eventSink(@"Hello"); _eventSink(@"World");
  • 36. Flutter Paris sli.do/zr8eef4g Communication Android / iOS Packages / plugins Et maintenant ? Les EventChannel sur iOS 17 - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _eventSink = eventSink; _eventSink(@"Hello"); _eventSink(@"World"); return nil; } - (FlutterError*)onCancelWithArguments:(id)arguments { _eventSink = nil; return nil; } @end _eventSink = eventSink; _eventSink(@"Hello"); _eventSink(@"World"); _eventSink = nil;
  • 38. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g A quoi servent-ils ? 19
  • 39. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g A quoi servent-ils ? 19 Nouveaux widgets Nouveaux composants graphiques Outils tiers Firebase, MixPanel… Nouveau composants Redux, RXDart… Compléter des fonctions Ex: demander la géolocalisation du téléphone
  • 40. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Quelle différence entre package et plugin ? 20 Package Ne contient que du code Dart (dossier lib)
  • 41. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Quelle différence entre package et plugin ? 21 Android Code Java/Kotlin (dossier android) iOS Code Obj C/Swift (dossier ios) Plugin Code Dart (dossier lib)
  • 42. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Où les trouver ? 22 https://pub.dartlang.org/flutter
  • 43. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Choisir son plugin 23
  • 44. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Choisir son plugin 23
  • 45. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Pub : le gestionnaire des dépendances 24 Le gestionnaire des dépendances du langage Dart pub Fichier dans lequel on indique les dépendances du projet pubspec.yaml Fichier généré qui précise quelles versions des dépendances sont utilisées pubspec.lock
  • 46. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Comment les utiliser dans vos applications ? 25 Pubspec.yaml Le fichier pubspec est en quelque sorte la carte d'identité de l'application. On y indique le nom et la description du projet, tout comme les ressources (assets) qui pourront être utilisées. On indique également les dépendances qui seront utilisées. name: helloworld description: A new Flutter project. dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.0 dev_dependencies: flutter_test: sdk: flutter flutter: uses-material-design: true
  • 47. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Ajouter une dépendance 26 Ajouter la dépendance au projet dependencies firebase_auth: '^0.5.3'
  • 48. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Pubspec.yaml : indiquer le numéro de version 27 any La dernière version disponible 1.2.3 Exactement la version 1.2.3 >=1.2.3 Au moins la 1.2.3 >1.2.3 Une version supérieure à la 1.2.3 <=1.2.3 Au maximum la 1.2.3 <1.2.3 Une version antérieure à la 1.2.3
  • 49. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Pubspec.yaml : indiquer une plage de versions 28 Utiliser la version la plus récente entre la 0.5 et 0.9** dependencies firebase_auth: '>=0.5.3 <0.6.0'
  • 50. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Pubspec.yaml : indiquer une plage de versions 28 Utiliser la version la plus récente entre la 0.5 et 0.9** dependencies firebase_auth: '>=0.5.3 <0.6.0' La caret syntax permet d'exprimer une plage de versions dependencies firebase_auth: '^0.5.3'
  • 51. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Dépendances : la source 29
  • 52. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Dépendances : la source 29 Repo officiel pub.dartlang.org
  • 53. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Dépendances : la source 29 Repo privé Hébergé par vos soins Repo officiel pub.dartlang.org
  • 54. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Dépendances : la source 29 Repo privé Hébergé par vos soins Git Pointer sur une branche, 
 un tag ou un commit Repo officiel pub.dartlang.org
  • 55. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Dépendances : la source 29 Repo privé Hébergé par vos soins Git Pointer sur une branche, 
 un tag ou un commit Repo officiel pub.dartlang.org Dossier local
  • 56. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Flutter packages… : les commandes utiles 30 Récupère les dépendances pour les nouveaux packages flutter packages get Mettre à jour les dépendances flutter packages upgrade
  • 57. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 31 Authentification Database & Cloud Firestore Storage Analytics Messaging AdMob Firebase Base de données SQLite (SQFLite) Préférences (~ NSUserDefaults) Données Flux Redux RXDart Flutter Stream Friends Autres Google Facebook Twitter Comptes
  • 58. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 32 Graphiques (animés) Charts Flutter
  • 59. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 32 Graphiques (animés) Charts Flutter
  • 60. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 33 Grille avec des éléments de tailles différentes Staggered 
 Grid View De la parallaxe avec n'importe quel widget Flutter Parallax
  • 61. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 33 Grille avec des éléments de tailles différentes Staggered 
 Grid View De la parallaxe avec n'importe quel widget Flutter Parallax
  • 62. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 34 Moteur de jeu 2D Sprite Widget
  • 63. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Une sélection des packages utiles 34 Moteur de jeu 2D Sprite Widget
  • 65. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Roadmap (sur GitHub) 36
  • 66. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Roadmap (lors de l'annonce de la bêta) 37 Intégration WebView Maps Routing Taille Faciliter l'intégration de Flutter dans une application existante Enrichir/améliorer les APIs pour la navigation Intégrer des WebView dans l'arbre des widgets Intégrer une carte comme widget Réduire la taille du moteur
  • 67. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Roadmap (sondage) 38
  • 68. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Quelques ressources 39 Flutter.rocks https://flutter.rocks/ Sergi & Replace https://sergiandreplace.com Flutter institute https://flutter.institute/ Codelabs codelabs.google.com / flutter.io Flutter Weekly https://flutterweekly.net/
  • 69. Communication Android / iOS Packages / plugins Et maintenant ? Flutter Paris sli.do/zr8eef4g Extension Chrome 40