Vos techniciens, commerciaux ou livreurs utilisent une application WinDev Mobile tous les jours. Elle fonctionne, mais elle vieillit : écrans chargés, ergonomie datée, évolutions lentes. Nous la réécrivons en Flutter pour Android et iOS, avec les mêmes règles métier et les mêmes données.
WinDev Mobile a permis à beaucoup d'entreprises de mettre une application dans la poche de leurs équipes terrain, souvent reliée à une application WinDev de bureau ou à un ERP. Mais une application mobile vit dans un environnement qui bouge vite : nouvelles versions d'Android et d'iOS, exigences des magasins d'applications, attentes des utilisateurs habitués aux applications grand public.
Flutter est un framework open source pour construire des applications mobiles à partir d'une seule base de code, en langage Dart. Il apporte :
Flutter n'est pas la seule cible : React Native et .NET MAUI sont aussi des choix solides selon vos équipes et votre back-end. Nous vous aidons à choisir pendant l'audit.
Nous l'avons vécu : notre propre application d'intervention pour techniciens, développée en WinDev et WinDev Mobile, a été entièrement repensée sur une technologie moderne, avec une API au-dessus des données existantes. Voir l'avant / après.
| Dans WinDev Mobile | En Flutter |
|---|---|
| Fenêtre (FEN_…) | Écran (widget Scaffold) déclaré dans la navigation de l'application |
| Champs (libellé, saisie, bouton, interrupteur) | Widgets Text, TextField, ElevatedButton, Switch… |
| Zone répétée, champ table | ListView.builder, avec un widget par ligne |
| Procédures et classes WLangage | Classes Dart : services, dépôts de données, modèles |
| Base HFSQL embarquée sur l'appareil | Base SQLite locale (par exemple avec sqflite ou drift) |
| Synchronisation avec le serveur (réplication, webservices) | API REST et logique de synchronisation explicite |
| Fonctions GPS, caméra, notifications | Paquets Flutter dédiés, avec gestion des permissions |
| ThreadExécute, traitements longs | async / await, Future, isolates pour les calculs lourds |
| Génération Android et iOS | Une base de code Flutter, compilée pour chaque plateforme |
| Déploiement (magasin, MDM, installation directe) | Google Play, App Store ou gestion de flotte (MDM), selon votre organisation |
Un écran très courant : à l'ouverture, l'application affiche les interventions du jour dans une zone répétée. En WinDev Mobile, la fenêtre lit la base HFSQL embarquée et remplit la zone ligne par ligne.
// FEN_Interventions · traitement d'initialisation
ZoneRépétéeSupprimeTout(ZR_Interventions)
HLitRecherchePremier(Intervention, DateIntervention, DateDuJour())
TANTQUE HTrouve(Intervention)
ZoneRépétéeAjouteLigne(ZR_Interventions, ...
Intervention.Client, Intervention.Adresse, Intervention.Statut)
HLitSuivant(Intervention, DateIntervention)
FINEn Flutter, l'écran ne lit pas la base lui-même. Il demande la liste à un dépôt de données, affiche un indicateur de chargement, puis construit une ligne par intervention. Ici, la vue passe du jour à la semaine, comme dans notre propre application.
class InterventionsPage extends StatefulWidget {
const InterventionsPage({super.key, required this.repo});
final InterventionRepository repo;
@override
State<InterventionsPage> createState() => _InterventionsPageState();
}
class _InterventionsPageState extends State<InterventionsPage> {
late final Future<List<Intervention>> _semaine = widget.repo.semaineEnCours();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Mes interventions')),
body: FutureBuilder<List<Intervention>>(
future: _semaine,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(child: CircularProgressIndicator());
}
final items = snapshot.data!;
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, i) => InterventionTile(items[i]),
);
},
),
);
}
}Le dépôt de données centralise la question qui compte le plus sur le terrain : que se passe-t-il sans réseau ? L'écran lit toujours la base locale, et la synchronisation avec le serveur se fait à part.
class InterventionRepository {
InterventionRepository(this.db, this.api);
final LocalDatabase db; // SQLite sur le téléphone
final InterventionApi api; // API REST du serveur
// Lecture locale : l'écran s'affiche même sans réseau
Future<List<Intervention>> semaineEnCours() => db.interventionsDeLaSemaine();
// Envoi des modifications faites hors ligne, puis récupération des nouveautés
Future<void> synchroniser() async {
await api.envoyer(await db.modificationsEnAttente());
await db.enregistrer(await api.interventionsDeLaSemaine());
}
}Ce découpage rend chaque morceau testable : on peut vérifier la synchronisation sans écran, et l'écran sans réseau.
Une application terrain doit fonctionner dans un sous-sol, une chaufferie ou une zone blanche. Si deux personnes modifient la même intervention hors ligne, laquelle gagne ? Ces règles sont souvent implicites dans l'ancienne synchronisation. Il faut les écrire noir sur blanc avant de coder.
Au moment de la bascule, des téléphones peuvent contenir des saisies pas encore synchronisées. Il faut prévoir une procédure : synchroniser l'ancienne application une dernière fois, ou reprendre ses données locales dans la nouvelle.
Android et iOS encadrent de plus en plus la géolocalisation en arrière-plan, les notifications et l'accès aux fichiers. Une fonction qui marchait dans une ancienne application peut demander une autorisation explicite ou une autre approche dans la nouvelle.
Imprimante Bluetooth, lecteur de codes-barres intégré, terminal durci : chaque matériel doit être testé avec la nouvelle application. On les inventorie dès l'audit pour vérifier qu'une bibliothèque existe ou prévoir un développement spécifique.
Copier les fenêtres WinDev Mobile champ par champ produit une application neuve qui a l'air ancienne. La migration est le bon moment pour repenser l'ergonomie avec les utilisateurs : vue semaine plutôt que jour par jour, urgences en tête, actions principales accessibles d'un pouce.
Si votre base serveur est en HFSQL, elle peut être reprise dans un second temps : voir HFSQL vers PostgreSQL. Pour une vue d'ensemble de notre démarche, consultez la page migration et refonte d'applications WinDev Mobile.
Oui. Une seule base de code Flutter produit une application Android et une application iOS. La publication sur iOS demande, comme pour toute application iPhone, un Mac et un compte développeur Apple.
Oui. Les données utiles au terrain sont stockées dans une base locale sur le téléphone (SQLite), puis synchronisées avec le serveur via une API quand le réseau revient. Les règles de synchronisation et de gestion des conflits sont définies avec vous pendant l'audit.
Les trois sont des options sérieuses et nous les proposons selon votre contexte. Flutter offre un rendu identique sur Android et iOS et de bonnes performances d'affichage. React Native convient bien si vous avez déjà une équipe React, .NET MAUI si votre back-end est en C#.
Oui. Si la nouvelle application s'appuie sur la même API et les mêmes données, les deux versions peuvent cohabiter : vous déployez la nouvelle auprès d'un premier groupe d'utilisateurs avant de la généraliser.
Décrivez-nous votre projet en quelques mots. Nous revenons vers vous sous 48 h ouvrées.