Comment rendre une interface Flutter responsive pour le web
Posté le 21 juillet 2025 • 4 min de lecture • 743 motsUne approche détaillée et concrète pour créer des interfaces web responsives avec Flutter, en s'appuyant sur les bonnes pratiques et les widgets adaptés.

Flutter est connu pour sa capacité à produire des applications multiplateformes à partir d’un seul codebase. Si le framework a d’abord été conçu pour le mobile, ses capacités web se sont considérablement renforcées. Cependant, rendre une interface responsive sur le web avec Flutter nécessite une approche rigoureuse et adaptée aux contraintes de la navigation multi-écrans.
Dans ce guide approfondi, nous allons explorer :
Flutter fonctionne différemment du HTML/CSS :
Cela implique que l’adaptation aux écrans ne peut pas être laissée au moteur de rendu, mais doit être pensée manuellement à travers la structure des widgets.
MediaQuery.of(context).size est la première brique de base pour détecter la largeur et la hauteur de l’écran, mais son usage doit être réservé à l’extérieur des widgets spécifiques.
Widget build(BuildContext context) {
final width = MediaQuery.of(context).size.width;
return width < 600 ? buildMobile() : buildDesktop();
}LayoutBuilder fournit les contraintes locales du widget parent.
LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth < 800) {
return buildCompactLayout();
} else {
return buildExpandedLayout();
}
},
)✅ À privilégier dans les composants réutilisables ou imbriqués.
OrientationBuilder(
builder: (context, orientation) {
return orientation == Orientation.portrait ? VerticalLayout() : HorizontalLayout();
},
)class ResponsiveWidget extends StatelessWidget {
final Widget mobile;
final Widget tablet;
final Widget desktop;
const ResponsiveWidget({
required this.mobile,
required this.tablet,
required this.desktop,
});
@override
Widget build(BuildContext context) {
final width = MediaQuery.of(context).size.width;
if (width >= 1024) return desktop;
else if (width >= 600) return tablet;
else return mobile;
}
}ResponsiveWidget(
mobile: MobileHomePage(),
tablet: TabletHomePage(),
desktop: DesktopHomePage(),
);Cela permet d’unifier la logique responsive tout en garantissant la lisibilité du code.
🔁 Cette approche est compatible avec
Navigator, lesroutes, et la navigation déclarative.
Flexible et Expanded : pour répartir l’espace disponible.Wrap : idéal pour les grilles dynamiques ou les tags.Spacer : pour créer des marges dynamiques.FittedBox : pour forcer l’ajustement d’un widget à son parent.AspectRatio : utile pour les vidéos ou les cartes visuelles.FractionallySizedBox : ajuste une boîte selon un pourcentage d’un parent.GridView.count() : grille à colonnes fixes.GridView.builder() : grille dynamique, idéale pour les breakpoints conditionnels.GridView.count(
crossAxisCount: MediaQuery.of(context).size.width > 800 ? 4 : 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
children: cards,
)FittedBox, AutoSizeText, ou MediaQuery.textScaleFactorOf(context).BoxFit.cover ou BoxFit.contain avec Image.asset().Image.network() avec width: double.infinity pour les bannières.Vous pouvez stocker le LayoutType (mobile, tablet, desktop) dans un Provider pour l’utiliser dans toute l’application.
if (isDesktop) {
Navigator.push(context, MaterialPageRoute(builder: (_) => DesktopView()));
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => MobileView()));
}Créer une interface responsive en Flutter pour le web demande d’abandonner certaines habitudes héritées du CSS et de bien exploiter la puissance des widgets Flutter. Grâce à des composants comme LayoutBuilder, MediaQuery, ou des approches modulaires comme ResponsiveWidget, il est tout à fait possible de produire des interfaces fluides, professionnelles et adaptées à toutes les résolutions.
En gardant à l’esprit l’importance de la lisibilité, de la flexibilité des layouts et de la performance, Flutter permet de construire des expériences utilisateur cohérentes, modernes, et maintenables.