Le Flutter
Micro-framework
Pour les Apps Modernes
Nylo donne à chaque projet la même base solide — routage, état, réseau, formulaires et authentification — pour démarrer à la première fonctionnalité plutôt qu'au premier fichier.
dart pub global activate nylo_installer
Tout ce dont vous avez besoin pour construire
Six piliers, une seule convention. Chacun livré avec des générateurs Metro, des valeurs par défaut sensées et une porte de sortie — ça reste du Flutter pur en dessous.
Routage
Des routes déclaratives avec gardes, paramètres typés, transitions et deep linking.
Gestion d'état
Un état réactif avec contrôleurs, hooks de cycle de vie et persistance sans douleur.
Réseau
Des classes de service d'API avec décodage automatique des modèles et intercepteurs de requêtes.
Formulaires
Déclarez vos champs une fois — validation, conversion et liaison de données suivent.
Authentification
Gestion de session, stockage des jetons et gardes de routes sans configuration sur mesure.
Metro CLI
Générez pages, modèles, contrôleurs, formulaires et thèmes en une seule commande.
Créez n'importe quoi depuis le terminal
Metro génère pages, modèles, contrôleurs, widgets et plus — branchés à votre routeur et à votre arborescence, pas déposés dans un coin.
class ApiService extends NyApiService {
@override
String get baseUrl => "https://api.example.com/v1";
Future<List<Post>> posts() async {
return await network(
request: (request) => request.get("/posts"),
);
}
}
// Usage in your page
final posts = await api<ApiService>((request) => request.posts());
Intégration API sans effort
Écrivez des services d'API propres et maintenables avec analyse JSON automatique, gestion des erreurs et intercepteurs de requêtes — sans code Dio répétitif dans vos pages.
En savoir plus sur le RéseauVoyez-le dans le code que vous écririez vraiment
appRouter() => nyRoutes((router) {
router.add(HomePage.path).initialRoute();
router.add(DiscoverPage.path);
router.add(LoginPage.path,
transitionType: TransitionType.bottomToTop());
router.add(ProfilePage.path,
routeGuard: [
AuthGuard()
]
);
});
Créez des routes complexes, des interfaces et des pages UI pour votre application Flutter.
En savoir plusAuthentifier un utilisateur
String userToken = "eyJhbG123...";
await Auth.authenticate(data: {"token": userToken});
Maintenant, lorsque votre utilisateur ouvre l'application, il sera authentifié.
final userData = Auth.data();
// {"token": "eyJhbG123..."}
bool isAuthenticated = await Auth.isAuthenticated();
// true
Si vous avez défini une authenticatedRoute dans votre routeur, cette page sera présentée lorsque l'utilisateur ouvrira à nouveau l'application.
appRouter() => nyRoutes((router) {
...
router.add(LandingPage.path).initialRoute();
router.add(DashboardPage.path).authenticatedRoute();
// overrides the initial route when a user is authenticated
Déconnecter l'utilisateur
await Auth.logout();
Authentifiez les utilisateurs dans votre application Flutter.
En savoir plusCréer un formulaire
metro make:form RegisterForm
Modifier votre formulaire
class RegisterForm extends NyFormWidget {
RegisterForm({super.key, super.submitButton, super.onSubmit, super.onFailure});
// Add your fields here
@override
fields() => [
Field.capitalizeWords("name",
label: "Name",
validator: FormValidator.notEmpty(),
),
Field.email("email_address",
label: "Email",
validator: FormValidator.email()
),
Field.password("password",
label: "Password",
validator: FormValidator.password(),
),
];
static NyFormActions get actions => const NyFormActions("RegisterForm");
}
Utiliser votre formulaire dans un widget
@override
Widget build(BuildContext context) {
return Scaffold(
body: RegisterForm(
submitButton: Button.primary(text: "Submit"),
onSubmit: (data) {
printInfo(data);
},
),
);
}
Gérez, validez et soumettez des données en un seul endroit avec Nylo Forms.
En savoir plusCréer un widget géré par état
metro make:stateful_widget CartIcon
class _CartIconState extends NyState<CartIcon> {
...
@override
Map<String, Function> get stateActions => {
"clear_cart": () {
_items = 0;
},
...
};
@override
Widget view(BuildContext context) {
return Container(child: Text("Items in cart: ${_items}"));
}
}
Use CartIcon.action("clear_cart")
Button.primary(text: "Add to cart",
onPressed: () {
CartIcon.action("clear_cart");
}
)
Gestion d'état puissante pour les widgets dans votre application Flutter.
En savoir plusCréer votre événement
metro make:event Logout
class LogoutEvent implements NyEvent {
@override
final listeners = {
DefaultListener: DefaultListener(),
};
}
class DefaultListener extends NyListener {
@override
handle(dynamic event) async {
// logout user
await Auth.logout();
// redirect to home page
routeTo(HomePage.path,
navigationType: NavigationType.pushAndForgetAll
);
}
}
Déclencher l'événement
MaterialButton(child: Text("Logout"),
onPressed: () {
event<LogoutEvent>();
},
)
Déclenchez des événements et écoutez-les dans votre application.
En savoir plusPlanifier une tâche à exécuter une fois
Nylo.scheduleOnce("onboarding_info", () {
print("Perform code here to run once");
});
Planifier une tâche à exécuter une fois après une date spécifique
Nylo.scheduleOnceAfterDate("app_review_rating", () {
print("Perform code to run once after DateTime(2025, 04, 10)");
}, date: DateTime(2025, 04, 10));
Planifier une tâche quotidienne
Nylo.scheduleOnceDaily("free_daily_coins", () {
print("Perform code to run once daily");
});
Planifiez des tâches à exécuter une fois ou quotidiennement dans votre application Flutter.
En savoir plusCréer un service API
metro make:api_service User
class UserApiService extends NyApiService {
@override
String get baseUrl => getEnv("API_BASE_URL");
Future<User?> fetchUser(int id) async {
return await get<User>(
"/users/$id",
queryParameters: {"include": "profile"},
);
}
Future<User?> createUser(Map<String, dynamic> data) async {
return await post<User>("/users", data: data);
}
}
Appeler l'API depuis votre page
User? user = await api<UserApiService>(
(request) => request.fetchUser(1),
);
Des services API élégants avec parsing JSON automatique, mise en cache et intercepteurs.
En savoir plusSauvegarder les données en toute sécurité
// Save values to secure storage
await NyStorage.save("coins", 100);
await NyStorage.save("username", "Anthony");
await NyStorage.save("isPremium", true);
// Save with TTL (auto-expires)
await NyStorage.save("session", "abc123",
expiry: Duration(hours: 1),
);
Lire avec conversion de type
// Automatic type casting
String? username = await NyStorage.read("username");
int? coins = await NyStorage.read<int>("coins");
bool? isPremium = await NyStorage.read<bool>("isPremium");
// Delete a value
await NyStorage.delete("coins");
Stockage local sécurisé avec conversion de type, expiration TTL et collections.
En savoir plusAjoutez vos fichiers de langue
{
"welcome": "Welcome",
"greeting": "Hello {{name}}",
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
Traduisez le texte dans vos widgets
// Simple translation
Text("welcome".tr()) // "Welcome"
// With arguments
Text("greeting".tr(arguments: {"name": "Anthony"}))
// "Hello Anthony"
// Nested keys
Text("navigation.home".tr()) // "Home"
Support multilingue avec fichiers JSON, arguments et RTL.
En savoir plusCréer un hub de navigation
metro make:navigation_hub base
class _BaseNavigationHubState extends NavigationHub<BaseNavigationHub> {
NavigationHubLayout? layout = NavigationHubLayout.bottomNav();
@override
bool get maintainState => true;
_BaseNavigationHubState() : super(() async {
return {
0: NavigationTab(
title: "Home",
page: HomeTab(),
icon: Icon(Icons.home),
),
1: NavigationTab(
title: "Settings",
page: SettingsTab(),
icon: Icon(Icons.settings),
),
};
});
}
Changer de mise en page facilement
// Bottom navigation
NavigationHubLayout.bottomNav()
// Top navigation
NavigationHubLayout.topNav()
// Journey / wizard flow
NavigationHubLayout.journey()
Créez des navigations en bas, en haut ou des flux de parcours avec maintien de l'état.
En savoir plusDéveloppé au grand jour, utilisé en production
“Je débute en Dart et je découvre votre framework — que j'adore.”
“Nylo est le meilleur framework pour Flutter — il rend le développement facile.”
@higakijin
“De loin le meilleur framework qui existe. Qualité et fonctionnalités impressionnantes.”
@2kulfi
“Ça rend le travail plus simple et plus rapide. Beau travail.”
darkreader01
“Je viens de découvrir ce framework et je suis très impressionné. Merci.”
@lepresk
“J'aime beaucoup le concept de ce framework.”
@Chrisvidal
“Je voulais vous remercier pour l'excellent travail que vous faites.”
@youssefKadaouiAbbassi
“Je voulais juste dire que j'adore le site de @nylo_dev !”
@esfoliante_txt
“C'est incroyable. Très bien joué !”
FireflyDaniel
Votre prochaine app Flutter commence par une seule commande
Gratuit, sous licence MIT, et ça reste du Flutter en dessous.
dart pub global activate nylo_installer