
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.dir
dans sdk.dir
et le projet commence à se construire, j'ai le chemin /Users/vlad/Library/Android/sdk

- Structure du projet, changez le nom des packages de
sample
habr.example

- Il est temps de commencer à publier,
wrapper
appel. 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 de jre7
, nous obtenons koltin-stdlib
, après quoi le projet commence à se construire

- Ouvrez
build.gradle
et ajoutez mavenLocal
section des repositories
. Important! La section des repositories
doit être celle de tous les allprojects
et non pas dans buildScript

- Maintenant, nous pouvons ajouter notre bibliothèque en tant que dépendance
implementation 'habr.example:commonLibrary-jvm:0.0.1'

- Nous ouvrons
activity_main.xml
et nous TextView
ID main_activity_text

- Dans
MainActivity.kt
définissez simplement le texte dans cette TextView

- 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écutez pod init
dans le dossier du projet, fermez le projet dans Xcode
et exécutez pod install
. Nous voyons que l'installation s'est terminée avec succès

- Important!
CocoaPods
ne 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 chaque build
. 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
commonLibrary
et exécutez ./gradlew linkDebugFrameworkIos
. Après cela, iOSFramework
apparaît dans notre dossier de build
iOSFramework

- Choisissez la cible

- Et pour cette cible, nous ajoutons le binaire

- Choisissez Ajouter un autre

- Spécifiez le chemin d'accès au
framework
que vous avez reçu à l'étape 6 ( commonLibrary.framework
)


- Maintenant, dans le projet, ce
framework
doit être affiché

- Accédez aux
Build Settings
et désactivez l' Enable Bitcode

- Maintenant, vous devez spécifier exactement où chercher notre
framework
, ouvrez le Framework Search Path
du Framework Search Path

- Spécifiez le chemin
"${PODS_ROOT}/../../commonLibrary"
. Assurez-vous de choisir recursive
. 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
build
dans Xcode
notre framework
utilisant gradle
. Ouvrir les Build 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'appel echo $(pwd)
n'est nécessaire que pour montrer dans la console dans quel dossier particulier nous sommes arrivés

- Nous poussons notre
build phase
au sommet, juste après target dependencies

- Ouvrez maintenant le
ViewController
et 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.gradle
et activez notre module de flottement en tant que sous-projet

- Ouvrez le fichier build.gradle et ajoutez notre projet en fonction

MainActivity.kt
en FlutterActivity

- Ajoutez
App.kt
, dans lequel nous initialiserons Flutter
au 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.kt
que nous appellerons depuis Flutter. Ici, lors d'un événement de Flutter, nous retournons notre hello()
de kotlin-library

- Et ajoutez du code à
main.dart
qui appellera la méthode dans la partie iOS/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 des framework search paths
du framework search paths
. Assurez-vous de vérifier que vos framework search paths
ne framework search paths
pas vides

Lorsque vous modifiez les dépendances dans some/path/my_flutter/pubspec.yaml
, vous devez exécuter les flutter packages get
partir de some/path/my_flutter
pour mettre à jour les dépendances dans podhelper.rb
. Après cela, exécutez l' pod install
du pod install
partir de some/path/MyApp
- Ajoutez 1
Build Phase
supplémentaire, uniquement pour Flutter. Ci-dessus ce que nous avons ajouté dans la partie 3 de la Script phase
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed

AppDelegate
notre AppDelegate
par FlutterAppDelegate

- Mettre à jour
ViewController

- Enveloppez notre
ViewController
dans un NavigatorController

- 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
flutter
pour l' UI
et kotlin
pour 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