
Entrée
Bonjour à tous. Il y a quelque temps, j'ai décidé de réaliser mon projet pour Android et iOS en même temps. Naturellement, la question s'est posée du choix de la technologie. Quelques semaines, j'ai regardé les piles populaires et j'ai choisi Kotlin / Native. Depuis que je suis développeur Android, je connais Kotlin depuis longtemps, mais il n'y avait pas beaucoup d'expérience avec Swift et je voulais obtenir la plupart du code commun aux deux plates-formes. Par conséquent, la question s'est immédiatement posée, mais comment écrire une interface utilisateur pour iOS. Un rapide coup d'œil sur le marché a suggéré qu'il existe Flutter, qui vous permet d'écrire l'interface utilisateur pour deux plates-formes simultanément. En fait, cette histoire a commencé.
Cet article décrit l'expérience de construction de Flutter en tant qu'interface utilisateur et Kotlin pour la logique principale. 
Important: sous le chat, il y a beaucoup de photos et d'instructions sur la façon d'assembler le projet
Table des matières
Partie 1
Création d'une bibliothèque partagée sur Kotlin
- Choisissez la bibliothèque partagée Kotlin Mobile
 
  
- Suivant
 
  
- Spécifiez notre dossier de travail, ici j'ai fait un dossier séparé pour le projet. Puisque j'aurai 4 projets différents et c'est plus pratique de les garder au même endroit
 
  
- Il reste à spécifier le chemin vers sdk.dirdanssdk.diret le projet commence à se construire, j'ai le chemin/Users/vlad/Library/Android/sdk
 
  
- Structure du projet, changez le nom des packages de samplehabr.example
 
  
- Il est temps de commencer à publier, wrapperappel. Après cela, le.gradlew.gradlew apparaîtra dans notre projet et il sera possible de travailler avec lui depuis le terminal
 
  
- Exécutez à partir du terminal ./gradlew publishToMavenLocal
 
  
- Après cela, dans le référentiel maven local, nous aurons 4 dossiers dans lesquels nos bibliothèques se trouveront
 
  
2e partie
Création d'une application Android
Créez un projet Android
- Au moment de l'écriture, le projet est généré avec une dépendance «cassée», donc nous le jre7à la fin dejre7, nous obtenonskoltin-stdlib, après quoi le projet commence à se construire
 
  
- Ouvrez build.gradleet ajoutezmavenLocalsection desrepositories. Important! La section desrepositoriesdoit être celle de tous lesallprojectset non pas dansbuildScript
 
  
- Maintenant, nous pouvons ajouter notre bibliothèque en tant que dépendance
 implementation 'habr.example:commonLibrary-jvm:0.0.1'
 
  
- Nous ouvrons activity_main.xmlet nousTextViewIDmain_activity_text
 
  
- Dans MainActivity.ktdéfinissez simplement le texte dans cetteTextView
 
  
- Super, à ce stade, nous avons une application Android qui peut utiliser la fonction hello()de notre bibliothèquebonjour () sur l'émulateur 
3e partie
Créer un projet iOS
- Choisir une application à vue unique
 
  
- Remplissez les informations de base et sélectionnez le dossier. Il est important de choisir la racine du dossier pour nos autres projets, car Xcode créera un sous-dossier avec le nom du projet
 
  
 
  
- Tout d'abord, ajoutez CocoaPods. Pour ce faire, exécutezpod initdans le dossier du projet, fermez le projet dansXcodeet exécutezpod install. Nous voyons que l'installation s'est terminée avec succès
 
  
- Important! CocoaPodsne recommande pas d'ajouter le dossier/Podsà.gitignore, mais je l'ai quand même fait. Puisqu'après avoir ajoutéflutter, nous allons reconfigurer les dépendances pour chaquebuild. Jusqu'à présent, j'aime plus cette solution que le colmatage.git
- Ouvrez le projet via le fichier Awesome App.xcworkspace
 
  
- Nous ouvrons le terminal, allez dans le dossier de notre commonLibraryet exécutez./gradlew linkDebugFrameworkIos. Après cela,iOSFrameworkapparaît dans notre dossier debuildiOSFramework
 
  
- Choisissez la cible
 
  
- Et pour cette cible, nous ajoutons le binaire
 
  
- Choisissez Ajouter un autre
 
  
- Spécifiez le chemin d'accès au frameworkque vous avez reçu à l'étape 6 (commonLibrary.framework)
 
  
 
  
- Maintenant, dans le projet, ce frameworkdoit être affiché
 
  
- Accédez aux Build Settingset désactivez l'Enable Bitcode
 
  
- Maintenant, vous devez spécifier exactement où chercher notre framework, ouvrez leFramework Search PathduFramework Search Path
 
  
- Spécifiez le chemin "${PODS_ROOT}/../../commonLibrary". Assurez-vous de choisirrecursive. Bien sûr, vous pouvez vous en passer si vous configurez plus précisément le chemin. Mais, comme ce n'est que le début du projet, il est maintenant important pour nous de nous assurer que tout ce groupe fonctionnera. Et nous pouvons changer la façon puis
 
  
- Nous devons nous assurer qu'avec chaque builddansXcodenotreframeworkutilisantgradle. Ouvrir lesBuild Phases
 
  
- Ajouter une nouvelle Script Phase
 
  
- Ajoutez le code du script.
 
  cd "${PODS_ROOT}/../../commonLibrary" echo $(pwd) ./gradlew linkIos
 
 Ici, nous allons simplement dans le dossier de projet de notre bibliothèque et./gradlew linkIos. L'appelecho $(pwd)n'est nécessaire que pour montrer dans la console dans quel dossier particulier nous sommes arrivés
 
  
- Nous poussons notre build phaseau sommet, juste aprèstarget dependencies
 
  
- Ouvrez maintenant le ViewControlleret ajoutez un appel à notre fonction depuis la bibliothèque
 
  
- Nous lançons notre projet et voyons
 
  
Très bien, cela signifie que nous avons correctement connecté la bibliothèque Kotlin au projet iOS.
Il ne reste plus qu'à ajouter du scintillement, comme cadre pour écrire l'interface utilisateur, dans nos applications et vous pouvez commencer à développer le produit
Partie 4
Ajouter Flutter à une application Android
Ensuite, un article sur 
github m'a beaucoup aidé
- Allez dans le dossier racine où se trouvent tous nos projets et faites flutter create -t module flutter_ui
 
  
 
- Ouvrez settings.gradleet activez notre module de flottement en tant que sous-projet
 
  
 
- Ouvrez le fichier build.gradle et ajoutez notre projet en fonction
 
  
 
- MainActivity.kten- FlutterActivity
 
  
 
- Ajoutez App.kt, dans lequel nous initialiseronsFlutterau démarrage de l'application
 
  
 
- Changez le manifeste et dites que nous avons maintenant une classe pour l' Application
 
  
 
- Assurez-vous d'ajouter java8, sans que ce flottement ne démarre
 
  
 
- Nous voyons l'interface utilisateur dans les journaux Hello from JVM , ce qui signifie que nous avons mis en place l'interface utilisateur sur Flutter et la bibliothèque principale sur Kotlin / Native
 
  
 
  
 
- Ajoutez une méthode à MainActivity.ktque nous appellerons depuis Flutter. Ici, lors d'un événement de Flutter, nous retournons notrehello()de kotlin-library
 
  
 
- Et ajoutez du code à main.dartqui appellera la méthode dans la partieiOS/Android-application
 
  
 
- Nous obtenons
  
 
Partie 5
Ajout de Flutter à l'application iOS
- Mise à jour de notre Podfile
  flutter_application_path = File.expand_path("../flutter_ui", File.dirname(path)) eval(File.read( File.join( flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
 
  
 
  
- C'est important . Ajoutez $(inherited)à la première ligne desframework search pathsduframework search paths. Assurez-vous de vérifier que vosframework search pathsneframework search pathspas vides
 
  
 
 Lorsque vous modifiez les dépendances danssome/path/my_flutter/pubspec.yaml, vous devez exécuter lesflutter packages getpartir desome/path/my_flutterpour mettre à jour les dépendances danspodhelper.rb. Après cela, exécutez l'pod installdupod installpartir desome/path/MyApp
- Ajoutez 1 Build Phasesupplémentaire, uniquement pour Flutter. Ci-dessus ce que nous avons ajouté dans la partie 3 de laScript phase
 
  "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
 
  
- AppDelegatenotre- AppDelegatepar- FlutterAppDelegate
 
  
- Mettre à jour ViewController
 
  
- Enveloppez notre ViewControllerdans unNavigatorController
 
    
- Maintenant, l'application démarre. Mais, pour l'instant, nous n'avons aucun lien entre la bibliothèque et le flottement  
- Ajouter ce lien à l'aide de FlutterMethodChannel
 
  
 
- Génial, maintenant l'application iOS utilise flutterpour l'UIetkotlinpour la logique principale.
 
  
 
Conclusion 
Ce qui est important à dire ici: je ne prétends pas que vous avez appris quelque chose de nouveau ou d'unique. Je viens de partager mes expériences, car pour que tout fonctionne ensemble, j'ai passé environ 4 jours ouvrables. Et je n'ai pas pu trouver d'exemples de code de projet qui utilisent à la fois Kotlin / Native et Flutter
Projets finaux
- groupe de projet
- flutter-ui
- iOS
- android
- bibliothèque commune
Liste de liens qui m'ont aidé, mais pas tout de suite
- Lui-même vacille
- La relation entre le code natif et les canaux de plate-forme de flottement de l' interface utilisateur
- Ajouter un flottement à l'application github existante
- Présentation native de Kotlin Native