V7 Nylo v7 est arrivé ! Voir les nouveautés →
Nylo
Micro-framework Flutter Sous licence MIT

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.

Installation en une ligne
$ dart pub global activate nylo_installer
Lire le guide d'installation Suivez ensuite les invites pour nommer votre projet.
my_app GÉNÉRÉ
lib/
app/  — modèles, réseau, fournisseurs
bootstrap/  — démarrage et configuration
config/  — thème, clés, décodeurs
resources/
pages/  home_page.dart
widgets/
themes/
routes/  router.dart
main.dart
Chaque projet Nylo prend la même forme — celui de vos coéquipiers aussi.
862 ★ sur GitHub Compatible Dart 3 Sous licence MIT Publié par nylo.dev sur pub.dev Activement maintenu depuis 2021
>_ Metro CLI

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.

17 générateurs couvrant les widgets, la plomberie de l'app et la config
Routes enregistrées automatiquement à la génération
Nommage et emplacement des fichiers cohérents dans toute l'équipe
En savoir plus sur Metro
zsh — my_app
$ metro make:page HomePage
  ✓ Created lib/resources/pages/home_page.dart
$ metro make:api_service User
  ✓ Created lib/app/networking/user_api_service.dart
$ metro make:model User
  ✓ Created lib/app/models/user.dart
$ metro make:stateful_widget FavouriteWidget
app/networking/api_service.dart
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());
Réseau

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éseau
Explorer

Voyez-le dans le code que vous écririez vraiment

routes/router.dart
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 plus
Étape 1

Authentifier un utilisateur

String userToken = "eyJhbG123...";

await Auth.authenticate(data: {"token": userToken});
Étape 2

Maintenant, lorsque votre utilisateur ouvre l'application, il sera authentifié.

final userData = Auth.data();
// {"token": "eyJhbG123..."}

bool isAuthenticated = await Auth.isAuthenticated();
// true
Étape 3

Si vous avez défini une authenticatedRoute dans votre routeur, cette page sera présentée lorsque l'utilisateur ouvrira à nouveau l'application.

routes/router.dart
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 plus
Étape 1

Créer un formulaire

terminal
metro make:form RegisterForm
Étape 2

Modifier votre formulaire

app/forms/register_form.dart
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");
}
Étape 3

Utiliser votre formulaire dans un widget

register_page.dart
@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 plus
Étape 1

Créer un widget géré par état

terminal
metro make:stateful_widget CartIcon
resources/cart_icon_widget.dart
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}"));
  }
}
Étape 2

Use CartIcon.action("clear_cart")

another widget
Button.primary(text: "Add to cart",
    onPressed: () {
      CartIcon.action("clear_cart");
    }
)

Gestion d'état puissante pour les widgets dans votre application Flutter.

En savoir plus
Étape 1

Créer votre événement

terminal
metro make:event Logout
app/events/logout_event.dart
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
        );
    }
}
Étape 2

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 plus

Planifier 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 plus
Étape 1

Créer un service API

terminal
metro make:api_service User
app/networking/user_api_service.dart
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);
    }
}
Étape 2

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 plus
Étape 1

Sauvegarder les données en toute sécurité

saving_data.dart
// 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),
);
Étape 2

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 plus
Étape 1

Ajoutez vos fichiers de langue

lang/en.json
{
    "welcome": "Welcome",
    "greeting": "Hello {{name}}",
    "navigation": {
        "home": "Home",
        "profile": "Profile"
    }
}
Étape 2

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 plus
Étape 1

Créer un hub de navigation

terminal
metro make:navigation_hub base
resources/pages/base_navigation_hub.dart
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),
            ),
        };
    });
}
Étape 2

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 plus
Communauté

Développé au grand jour, utilisé en production

“Je débute en Dart et je découvre votre framework — que j'adore.”

P
Peter
Directeur principal, Heroku Global

“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