Puissance hybride : avantages et avantages du flottement
Publié: 2022-03-11Flutter est une plate-forme de développement d'applications mobiles hybrides de Google qui a atteint la version 1.0 fin 2018. Bien qu'il s'agisse d'un nouvel entrant dans la liste des frameworks de développement hybrides, les bonnes idées qui la sous-tendent l'ont rapidement fait connaître parmi les développeurs.
Mon objectif dans cet article est d'explorer ces idées et d'écrire sur mes expériences avec Flutter, et pourquoi je pense que c'est l'avenir du développement d'applications mobiles hybrides.
Même s'il existe d'anciens frameworks d'applications hybrides sur le marché, il existe une liste croissante de grandes entreprises qui choisissent Flutter pour leurs applications mobiles. Bien que la page vitrine de Flutter en répertorie un grand nombre, voici quelques applications notables qui utilisent Flutter soit pour l'ensemble de l'application, soit pour une fonctionnalité importante :
- L'application Google Ads
- Application GrabMerchant de GrabFood
- L'application Xianyu du groupe Alibaba, qui compte plus de 50 millions de téléchargements
- Nubank
- L'application eBay Motors
Bien que le framework Flutter soit tout à fait capable, il est encore relativement nouveau. Par souci d'équilibre, je discuterai également de certaines limitations dont vous devez être conscient avant de vous engager dans Flutter.
J'espère qu'après avoir lu cet article, vous aurez une bonne idée des avantages et des inconvénients de Flutter et disposerez de suffisamment d'informations pour décider si vous devez utiliser Flutter dans votre prochain projet d'application mobile.
Avantages Flutter (du point de vue du développement)
En tant que développeur, c'est le point de vue que je connais le mieux et sur lequel je peux partager le plus d'informations.
Courbe d'apprentissage rapide
La première agréable surprise que Flutter réserve aux développeurs est la rapidité avec laquelle il démarre. Il faut moins de 30 minutes pour terminer le processus d'installation et disposer d'un environnement de développement opérationnel. À partir de là, vous êtes prêt à créer votre première application Flutter.
Intégration de l'éditeur populaire
Flutter propose également d'excellentes intégrations d'éditeurs. J'utilise personnellement Android Studio, mais des instructions sont disponibles pour configurer IntelliJ, VSCode ou Emacs.
Processus de développement propre
Par rapport à mon expérience précédente avec les frameworks d'applications hybrides, le processus de développement semble également plus propre . Par exemple, lorsque j'ai utilisé WebViews pour afficher des listes contenant de nombreux éléments (environ 100 environ), j'ai dû faire face à une utilisation élevée du processeur, en particulier lorsque l'utilisateur faisait défiler la liste. Je les ai résolus en utilisant des éléments de cadre ioniques spécialement conçus pour cela. Dans Flutter, il existe un moyen accepté d'afficher des listes, le ListView
, qui a des performances étonnantes prêtes à l'emploi.
Rechargement en direct
Une autre chose qui m'a agréablement surpris est la fonctionnalité de rechargement en direct. En tant que développeur full-stack, j'étais habitué à des frameworks comme BrowserWatch fournissant un rechargement en direct dans le navigateur.
Le développement natif n'a pas cela (mais je pense que SwiftUI d'Apple fait des progrès sur ce front pour le développement iOS). Les développeurs Android et iOS doivent généralement écrire du code, puis attendre qu'il soit compilé et chargé sur l'appareil ou le simulateur avant de pouvoir voir les modifications.
Flutter fournit (à la React Native) un mécanisme de rechargement en direct, où le code de l'application est rechargé sur l'appareil dès que les développeurs cliquent sur "enregistrer". Cela donne un retour immédiat, ce qui rend le développement beaucoup plus rapide.
Performance
Les performances des applications sont une autre mesure où Flutter émerge lentement comme un gagnant.
Étant donné que le framework Flutter est en cours de développement actif, il existe de nombreux endroits où des optimisations de performances peuvent être effectuées. Cela est évident dans, par exemple, Flutter 1.17, qui a augmenté les performances de rendu jusqu'à 50 % sur les nouveaux appareils iOS et réduit la consommation de mémoire jusqu'à 70 % pour certains types de charges de travail.
Cohérence multiplateforme
Des interfaces utilisateur vraiment cohérentes sur les deux plates-formes mobiles sont une autre caractéristique remarquable de Flutter. Étant donné que Flutter utilise son propre moteur de rendu (nous en reparlerons plus tard), l'interface utilisateur est exactement la même sur iOS et Android. Les développeurs n'ont plus à se débattre avec des problèmes de style spécifiques à la plate-forme pour que tout ressemble exactement à la conception : cette garantie fait partie du cadre.
Langage, outils et extension
Trois autres aspects plus petits, mais toujours importants, qui, selon moi, devraient être mentionnés ici sont :
- Dart, le langage dans lequel les applications Flutter sont programmées, est très simple à utiliser. Mais c'est aussi un langage assez puissant, initialement prévu par Google pour remplacer JavaScript. Si les développeurs ont de l'expérience avec JavaScript ou d'autres langages de type C, ils n'auront aucun mal à maîtriser Dart en un jour ou deux.
- Il existe un gestionnaire de plugins robuste (pub) inclus dans la chaîne d'outils par défaut et une énorme bibliothèque de plugins disponibles via le référentiel de plugins pub.dev.
- Créer des plugins pour tirer parti des capacités de la plate-forme native est assez facile, donc si les développeurs ont besoin d'accéder à une fonctionnalité de la plate-forme pour laquelle aucun plugin n'existe déjà, en coder un n'est pas trop difficile.
Avantages Flutter (d'un point de vue commercial)
Le plus grand avantage de Flutter auquel la plupart des entreprises pensent est de n'avoir à embaucher qu'une seule équipe pour les plates-formes iOS et Android. Cependant, un avantage plus important que de nombreuses entreprises négligent est la rapidité de mise sur le marché . En tirant parti des avantages de développement de la section précédente, une petite équipe de développement peut créer une belle application avec des performances natives qui offre la même expérience utilisateur sur les deux plates-formes beaucoup plus rapidement en utilisant Flutter.
Flutter permet aux développeurs de créer de très belles interfaces utilisateur . Jetez un coup d'œil à un défi récent de Google et Lenovo pour créer une belle interface utilisateur d'horloge pour la Lenovo Smart Clock. Le gagnant, Particle Clock de Mickel Andersson, n'est pas seulement d'une élégance unique, il montre également à quel point les animations sont performantes dans Flutter.
Pour les entreprises qui envisagent Flutter mais qui ne savent pas si c'est la bonne voie à suivre, Flutter peut être exploité progressivement : les applications mobiles préexistantes peuvent intégrer Flutter une seule partie à la fois. En fait, c'est ainsi que la plupart des grandes entreprises commencent avec Flutter, en créant une petite partie de leur application existante dans Flutter, puis en remplaçant lentement les autres parties une fois qu'elles en voient les avantages.
Limitations à prendre en compte avant d'utiliser Flutter
En toute honnêteté, Flutter, étant plus récent, n'est pas aussi éprouvé que d'autres frameworks d'applications mobiles hybrides comme React Native. Après tout, la portée des utilisateurs finaux de React Native couvre les applications mobiles de Facebook, Instagram, Skype et Discord.
La réponse par défaut à "devrais-je utiliser Flutter?" est, pour l'instant, un oui prudent . En effet, les chefs de projet doivent toujours déterminer les fonctionnalités avancées dont ils auront besoin, le cas échéant, et s'assurer que ces fonctionnalités sont disponibles dans Flutter avant de s'engager à les utiliser. En particulier, il vaut la peine de se demander de quelles bibliothèques et plugins une équipe pourrait avoir besoin pour créer une application particulière. En tant que nouvelle entrée dans les frameworks d'applications mobiles, Flutter n'a pas la vaste gamme de bibliothèques et de plugins que React Native propose.
Par exemple, la prise en charge de l'appareil photo dans Flutter n'est pas encore complète, le zoom et le contrôle du flash ne faisant pas encore partie du plug-in officiel de l'appareil photo. Pour moi, ce n'était pas un facteur décisif, car j'ai pu trouver un plugin tiers lorsque j'avais besoin d'intégrer la fonctionnalité photo/vidéo dans une application que je construisais.
Google Maps est un autre plugin majeur que vous pourriez manquer. Il n'y a pas de plug-ins Google Maps natifs pour Dart, et bien qu'il existe un plug-in permettant d'intégrer Google Maps dans votre code Flutter, il utilise des fonctionnalités de Flutter (vues de la plate-forme) qui sont toujours au stade de prévisualisation des développeurs.
Une autre chose qui n'affectera pas de nombreux projets, mais dont vous devez être conscient, c'est que pour l'instant, Flutter ne prend en charge aucune fonctionnalité 3D. L'équipe se concentre uniquement sur la 2D pour l'instant. Mais la plupart des applications n'utilisent aucune fonctionnalité 3D, cela ne devrait donc pas être un facteur décisif pour la majorité des développeurs.
Quelques conseils tirés de mon expérience avec Flutter
Après avoir publié trois applications Flutter au cours des deux dernières années, j'ai appris un certain nombre de choses que j'aurais aimé qu'on me dise à mes débuts. Je vais les énumérer ici dans l'espoir qu'ils vous aideront dans votre parcours de développement Flutter.
Flutter est très facile à utiliser. J'ai commencé par un merveilleux cours sur App Brewery. Cependant, après avoir terminé les premiers modules, j'ai pensé que j'en avais suffisamment appris et j'ai commencé à créer la première application que j'ai lancée.
À cause de mon impatience, j'ai sauté un certain nombre de modules de ce cours qui se sont avérés importants, et j'ai dû apprendre les leçons de ces modules à la dure en faisant des erreurs. Plus précisément, j'aurais fait un bien meilleur travail lors de ma première utilisation de Flutter pour le développement d'applications si j'avais appris quelques bonnes pratiques Flutter :
- Comment modulariser et structurer mon code d'application Flutter.
- Comment fonctionne la gestion de l'état.
- Comment authentifier les utilisateurs et suivre l'état de l'authentification sur les différentes pages de mon application Flutter.
- Comment intégrer les notifications à l'aide du package Firebase Messaging.
J'ai fini par apprendre toutes ces choses, mais j'ai d'abord dû faire beaucoup d'erreurs. J'ai réécrit des parties importantes de la première application que j'ai créée. Avec ma deuxième application Flutter, cependant, j'avais appris de mes erreurs et j'ai fini par faire un travail meilleur et plus rapide.
Il existe de nombreuses ressources que vous pouvez facilement trouver en effectuant une recherche sur Google pour en savoir plus sur les concepts que j'ai énumérés ci-dessus. Vous pouvez commencer par consulter les liens de la page En savoir plus sur le site Flutter.
Une autre chose que j'ai trouvée est qu'en raison de la nouveauté de Flutter, il n'y a pas de modèle unique pour structurer votre application. Issu d'une carrière de développement principalement basée sur Django, j'ai l'habitude de savoir que MVC est le modèle à utiliser dans mes applications Django. iOS a également un gagnant clair dans le modèle MVVM qu'il suit. Android a son ensemble de directives sur la meilleure façon de concevoir une application.
Flutter n'a pas un tel modèle d'architecture qui a "l'emporte" sur les nombreuses possibilités. C'est quelque chose qui m'a donné du fil à retordre au début. En fin de compte, ayant développé un certain nombre d'applications Flutter, je pense qu'il est préférable de simplement choisir une architecture et de s'y tenir.
Personnellement, j'utilise le package du provider
à la fois comme infrastructure d'injection de dépendances et de gestion des modifications. Mes applications Flutter sont également divisées en trois lignes :
- Views , qui sont les widgets qui construisent l'application, y compris les écrans. J'injecte des services et des modèles à l'aide du widget
Consumer
du packageProvider
dans mes vues afin de pouvoir créer l'interface utilisateur en fonction des données disponibles. Le widgetConsumer
reconstruit également la vue lorsque l'état change, c'est ainsi que mes applications réagissent aux changements d'état. - Models , qui sont de simples objets anciens que j'utilise pour contenir des données structurées.
- Services/contrôleurs , où va la majeure partie de la logique métier. Les interfaces API sont également codées ici, qui peuvent récupérer et envoyer des données à l'API. Ces interfaces API fournissent et acceptent des modèles pour transmettre des données.
La bibliothèque de blocs vaut également la peine d'être considérée comme une alternative au package du provider
. Il a une architecture légèrement différente et utilise des flux d'événements et d'états pour connecter des vues et des modèles.
C'est une manière légèrement plus complexe de gérer l'état que d'utiliser la bibliothèque du provider
, mais elle est payante si vous avez une application complexe dans laquelle vous apportez des modifications aux mêmes données à partir de plusieurs sources et devez répondre à ces modifications à partir de plusieurs endroits.

Si vous finissez par ne pas utiliser BLoC ou provider
, vous devrez trouver une méthode de gestion de l'état de votre application, en particulier en ce qui concerne les notifications.
Comment Flutter se compare aux autres frameworks hybrides
Réagir natif
React Native est de loin le framework d'applications mobiles hybrides le plus populaire et le plus réussi à ce jour, et pour cause. Il a fallu un framework Web frontal populaire et bien conçu, React, et a permis à des millions de développeurs frontaux de commencer également à écrire des applications mobiles. Je suis convaincu que bon nombre des excellentes applications mobiles que nous avons aujourd'hui n'auraient jamais été créées si les développeurs avaient dû trouver le temps et la motivation nécessaires pour apprendre les SDK de développement iOS et Android natifs.
Dans ce contexte, je suis confiant en disant que Flutter finira par l'emporter en tant que principal cadre d'applications mobiles hybrides. Il y a plusieurs raisons à cela.
Les composants React Native sont décrits dans le code JavaScript et traduits en contrôles natifs. Cela signifie que les utilisateurs obtiennent une interface utilisateur différente dans les versions iOS et Android de l'application. Si les développeurs essaient d'offrir une expérience native à leurs utilisateurs, c'est très bien.
Cependant, cela signifie également que si les développeurs veulent avoir la même interface utilisateur cohérente sur les deux plates-formes mobiles, ils doivent travailler dur pour styliser les composants natifs pour qu'ils se ressemblent, ou utiliser des composants différents qui offrent la même apparence sur les deux plates-formes. plates-formes.
Comparez cela à Flutter, où le framework fournit ses propres widgets sur toutes les plates-formes prises en charge. Il n'y a pas de traduction, car Flutter ne s'appuie pas sur les contrôles natifs pour peindre l'interface utilisateur. Au lieu de cela, il utilise sa propre bibliothèque de contrôles. La bibliothèque de widgets de Flutter fournit des widgets qui ressemblent à des contrôles natifs, mais ils sont complètement facultatifs.
Cette approche a ses avantages et ses inconvénients. Le plus grand avantage est que vous avez maintenant exactement la même application sur les deux plates-formes. Mais vous renoncez à certaines choses pour y parvenir.
Étant donné que Flutter utilise ses propres widgets au lieu d'utiliser ceux natifs, vous ne pouvez pas utiliser la pléthore de bibliothèques existantes fournissant des contrôles personnalisés comme vous le pouvez avec un minimum de travail sur React Native. Dans React Native, il est assez simple d'écrire un petit wrapper autour de n'importe quel contrôle natif existant et de le faire fonctionner. C'est aussi pourquoi, à l'heure actuelle, il n'y a pas d'implémentation stable de Google Maps pour Flutter.
Cependant, la possibilité d'intégrer des contrôles natifs est en cours d'élaboration et est en préversion pour les développeurs, ce qui signifie que vous pouvez l'utiliser mais que vous devrez peut-être faire face à des bogues. Une fois sorti, il comblera ce trou assez important dans les fonctionnalités de Flutter par rapport à React Native.
Cette même fonctionnalité Flutter, qui utilise sa propre bibliothèque de widgets au lieu de widgets natifs, offre également un énorme avantage lorsque vous souhaitez créer un composant entièrement nouveau. Dans React Native, vous devez créer un composant natif de la plate-forme et l'importer dans votre application via des liaisons.
Avec Flutter, vous pouvez créer des composants personnalisés directement dans votre code Dart. Vous avez le contrôle total de l'interface utilisateur avec des widgets comme CustomPainter
qui vous permettent de dessiner tout ce dont vous avez besoin, et vous disposez d'une bibliothèque de widgets disponibles qui vous permettent d'implémenter des animations personnalisées. Vous n'avez jamais besoin de sortir de la base de code Dart pour créer ces widgets personnalisés.
Et je pense que c'est l'un des plus grands avantages de Flutter. Vous avez le contrôle total de votre interface utilisateur à partir du code Dart et vous n'avez plus à vous soucier d'apprendre le SDK natif des plates-formes pour lesquelles vous développez.
Apache Cordoue
Apache Cordova n'est pas tant un framework qu'un wrapper de navigateur. Avec Cordova, vous construisez votre application en utilisant les technologies web : HTML, CSS et JavaScript. Cordova vous permet d'exécuter cette application Web sur des plates-formes mobiles et expose les API de plate-forme natives en JavaScript afin que votre application puisse interagir avec la plate-forme.
Il existe un certain nombre de cadres différents construits pour Cordova. L'un des plus célèbres que j'ai utilisé dans le passé est le cadre ionique. Il fournit un ensemble de composants d'interface utilisateur qui ressemblent et agissent de manière similaire aux composants de la plate-forme native. Cependant, ces composants sont implémentés à l'aide de HTML/CSS/JavaScript.
L'expérience de développement avec Cordova et Ionic est vraiment agréable, et la mise en route est très rapide si vous êtes déjà développeur web. Parce que vous créez des applications à l'aide de technologies Web, vous disposez de tout l'écosystème Web. Pensez aux centaines de milliers de petits composants et bibliothèques basés sur HTML/CSS/JavaScript, et vous pouvez en utiliser la plupart, sinon la totalité. Cela signifie que la plupart des « widgets » dont vous avez besoin sont déjà disponibles en ligne.
C'est aussi un inconvénient, cependant. Parce que vous utilisez des technologies Web pour créer vos applications, il faut beaucoup de soin pour s'assurer que l'application ressemble et se sent comme une application mobile, et pas seulement un site Web qui a été réduit pour fonctionner sur mobile.
Bien que Cordova soit un excellent moyen de développer un MVP ou même les premières versions de votre application, la première application que j'ai créée dans Flutter était un portage d'une application Ionic. Les améliorations de performances que nous avons obtenues, en particulier dans les vues qui avaient beaucoup de contenu à faire défiler, étaient perceptibles dès la première interaction.
XamarinName
Je n'ai aucune expérience avec Xamarian, donc je ne peux pas comparer équitablement les deux. Cependant, au cours de mes recherches, je suis tombé sur un excellent article qui fait une comparaison équitable.
Bien que l'article se termine par une égalité entre Flutter et Xamarian, je peux dire en toute confiance que si je le lisais et que je devais faire un choix entre les deux frameworks, j'aurais opté pour Flutter car les choses dans lesquelles il brille sont les choses que j'apprécie davantage.
Un aperçu technique de Flutter
Flutter : le "moteur de jeu" des frameworks d'applications hybrides
Parmi les frameworks d'applications mobiles hybrides, Flutter a une approche unique. Il ne délègue pas l'interface utilisateur à la plate-forme native ni n'utilise une vue Web. Au lieu de cela, Flutter utilise son propre moteur de rendu pour peindre l'interface utilisateur. Ceci est similaire à la façon dont les jeux utilisent un moteur de jeu qui génère toutes les parties de leurs interfaces utilisateur, au lieu d'utiliser des contrôles natifs.
Flutter utilise le moteur graphique Skia haute performance et testé au combat pour tout dessiner dans votre application mobile. L'utilisation de Skia offre deux avantages principaux auxquels je peux penser, même si je suis sûr que les ingénieurs de Google derrière Flutter avaient beaucoup plus à l'esprit :
- Votre application aura exactement la même apparence sur toutes les plateformes sans avoir besoin d'être personnalisée pour chacune.
- Votre application obtiendra d'excellentes performances, similaires aux applications natives, car il n'y a pas de couche intermédiaire qui doit traduire votre code en code de plate-forme native pour dessiner les widgets.
Tout est un widget
Les documents Flutter parlent de Flutter comme d'un "framework de style React". Cela se voit dans la façon dont les applications sont construites en composant ensemble des widgets plus petits ( composants dans la terminologie React).
Cependant, Flutter va plus loin que tout autre framework avec lequel j'ai travaillé.
Un exemple simple est le rembourrage. Avec la plupart des frameworks, le rembourrage est un attribut des éléments de l'interface utilisateur. Dans Flutter, Padding
est un widget qui peut envelopper d'autres widgets à l'intérieur de lui-même et ajouter un rembourrage autour de son widget enfant.
Plus particulièrement, le InheritedWidget
n'a pas d'interface utilisateur et ne fournit aucune interaction avec l'utilisateur. Son seul travail consiste à ajouter des informations à l'arborescence des widgets afin qu'à un moment donné au plus profond de l'arborescence, vous puissiez extraire ces informations.
Par exemple, la racine de votre application, le widget MaterialApp
, peut injecter un service d'authentification dans l'arborescence des widgets à l'aide d'un InheritedWidget
. Maintenant, au plus profond de l'arborescence sur une autre page, comme votre page de profil utilisateur, vous pouvez utiliser une méthode pour extraire ce service d'authentification et l'utiliser.
Ce tout est une approche de widget prend un certain temps pour s'y habituer. Mais une fois que vous vous y êtes familiarisé, cela devient un moyen puissant de créer des fonctionnalités dans vos applications.
Flutter, Dart et creuser dans la source
Flutter est intimement lié à Dart. Alors que le moteur de rendu principal est construit en C/C++, ce n'est qu'une petite partie de Flutter.
La majorité de la base de code Flutter est écrite en Dart, et il y a d'excellentes raisons pour lesquelles l'équipe Flutter l'a choisi. Mais le plus grand avantage pour moi était que je pouvais facilement consulter le code source du framework - et tous les différents widgets qu'il fournit - et en tirer des leçons.
C'est un avantage plus puissant que ne le pensent de nombreux développeurs. Je recommande à la plupart des développeurs d'essayer de trouver des réponses dans le code de leurs frameworks/bibliothèques, car cela les aide non seulement à comprendre ce qui se passe sous les couvertures, mais les expose également à un code de haute qualité et bien conçu, ce qui est un moyen sûr de grandir en tant que développeur.
Interopérabilité de la plateforme native
Bien que Flutter fournisse la couche d'interface utilisateur et que la logique métier soit facilement gérée via des packages Dart purs, pour accéder aux fonctionnalités de la plate-forme native telles que la géolocalisation et le contrôle de la caméra, l'utilisation des packages tiers de pub.dev est la stratégie la plus simple.
Cependant, si vous avez besoin de certaines fonctionnalités qui ne sont pas disponibles via un package existant, en écrire une vous-même n'est pas trop difficile. Je n'ai pas construit moi-même de packages natifs de la plate-forme, mais j'ai regardé le code source pour beaucoup par curiosité.
Même si je ne suis pas un développeur d'applications natif, j'ai pu comprendre principalement les parties natives de ces plugins et voir comment ils se connectaient au runtime Dart via la transmission de messages. Pour les développeurs de plates-formes natives expérimentés, créer un nouveau package pour tirer parti d'une capacité native sera très facile.
Devriez-vous utiliser Flutter dans votre prochain projet ?
J'espère que cet article vous a donné suffisamment d'informations pour décider si vous pouvez utiliser Flutter dans votre projet d'application mobile. J'ai essayé de donner une image équilibrée de Flutter, en énumérant à la fois les avantages et les inconvénients.
Bien que personne ne puisse prendre la décision à votre place, je peux vous donner quelques conseils d'adieu sur la façon dont je pourrais aborder la question de l'utilisation de Flutter dans ma prochaine application mobile. Si les avantages de Flutter peuvent fournir toutes les fonctionnalités dont une application a besoin, je la choisirais en un clin d'œil.
En effet, mis à part les quelques domaines où Flutter fait actuellement défaut, tous les autres aspects de celui-ci sont ceux que j'admire et sur lesquels je compte pour développer et lancer les cinq applications Flutter différentes au cours de l'année écoulée :
- La facilité de démarrage de Flutter
- Les gains de vitesse qui peuvent être obtenus en utilisant un cadre qui a été conçu dès le départ pour se concentrer sur la vitesse de développement
- Le riche écosystème de bibliothèques Dart et de packages tiers facilement disponibles
- La manière différente mais extrêmement productive de Flutter de développer des applications en utilisant l'approche tout est une approche widget
Ceux qui proposent des services de développement d'applications mobiles seraient bien avisés d'examiner sérieusement Flutter, s'ils ne l'ont pas déjà fait.
Je terminerai en notant un dernier avantage de Flutter : il contient l'une des meilleures documentations de toutes les bibliothèques ou frameworks avec lesquels j'ai travaillé. Il est rare que je google une question Flutter et qu'elle ne soit pas répondue par une page du propre site de Flutter.
En tant que partenaire Google Cloud, les experts certifiés Google de Toptal sont à la disposition des entreprises à la demande pour leurs projets les plus importants.