Das Flutter
Micro-Framework
Für moderne Apps
Nylo gibt jedem Projekt dieselbe solide Basis — Routing, State, Networking, Formulare und Authentifizierung — damit du bei Feature eins startest statt bei Datei eins.
dart pub global activate nylo_installer
Alles, was Sie zum Bauen brauchen
Sechs Säulen, eine Konvention. Jede kommt mit Metro-Generatoren, sinnvollen Voreinstellungen und einer Hintertür — darunter steckt weiterhin reines Flutter.
Routing
Deklarative Routen mit Guards, typisierten Parametern, Übergängen und Deep Linking.
Zustandsverwaltung
Reaktiver State mit Controllern, Lifecycle-Hooks und müheloser Persistenz.
Netzwerk
API-Service-Klassen mit automatischer Modell-Dekodierung und Request-Interceptors.
Formulare
Felder einmal deklarieren — Validierung, Typumwandlung und Datenbindung kommen mit.
Authentifizierung
Session-Handling, Token-Speicherung und Route-Guards ohne maßgeschneiderte Einrichtung.
Metro CLI
Erzeuge Seiten, Modelle, Controller, Formulare und Themes mit einem einzigen Befehl.
Erstellen Sie alles vom Terminal aus
Metro erzeugt Seiten, Modelle, Controller, Widgets und mehr — eingebunden in deinen Router und deine Ordnerstruktur, nicht einfach in eine Ecke gelegt.
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());
Mühelose API-Integration
Schreibe saubere, wartbare API-Services mit automatischem JSON-Parsing, Fehlerbehandlung und Request-Interceptors — ohne Dio-Boilerplate in deinen Seiten.
Mehr über Netzwerk erfahrenSieh es in dem Code, den du wirklich schreiben würdest
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()
]
);
});
Erstellen Sie komplexe Routen, Schnittstellen und UI-Seiten für Ihre Flutter-Anwendung.
Mehr erfahrenBenutzer authentifizieren
String userToken = "eyJhbG123...";
await Auth.authenticate(data: {"token": userToken});
Jetzt wird Ihr Benutzer authentifiziert, wenn er die App öffnet.
final userData = Auth.data();
// {"token": "eyJhbG123..."}
bool isAuthenticated = await Auth.isAuthenticated();
// true
Wenn Sie eine authenticatedRoute in Ihrem Router festgelegt haben, wird diese Seite angezeigt, wenn der Benutzer die App erneut öffnet.
appRouter() => nyRoutes((router) {
...
router.add(LandingPage.path).initialRoute();
router.add(DashboardPage.path).authenticatedRoute();
// overrides the initial route when a user is authenticated
Benutzer abmelden
await Auth.logout();
Authentifizieren Sie Benutzer in Ihrer Flutter-Anwendung.
Mehr erfahrenFormular erstellen
metro make:form RegisterForm
Formular anpassen
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");
}
Formular in einem Widget verwenden
@override
Widget build(BuildContext context) {
return Scaffold(
body: RegisterForm(
submitButton: Button.primary(text: "Submit"),
onSubmit: (data) {
printInfo(data);
},
),
);
}
Verwalten, validieren und senden Sie Daten an einem Ort mit Nylo Forms.
Mehr erfahrenState-Managed-Widget erstellen
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");
}
)
Leistungsstarkes State-Management für Widgets in Ihrer Flutter-Anwendung.
Mehr erfahrenEvent erstellen
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
);
}
}
Event auslösen
MaterialButton(child: Text("Logout"),
onPressed: () {
event<LogoutEvent>();
},
)
Lösen Sie Events aus und hören Sie auf diese in Ihrer Anwendung.
Mehr erfahrenAufgabe einmalig planen
Nylo.scheduleOnce("onboarding_info", () {
print("Perform code here to run once");
});
Aufgabe einmalig nach einem bestimmten Datum planen
Nylo.scheduleOnceAfterDate("app_review_rating", () {
print("Perform code to run once after DateTime(2025, 04, 10)");
}, date: DateTime(2025, 04, 10));
Aufgabe täglich einmalig planen
Nylo.scheduleOnceDaily("free_daily_coins", () {
print("Perform code to run once daily");
});
Planen Sie Aufgaben einmalig oder täglich in Ihrer Flutter-Anwendung.
Mehr erfahrenAPI-Service erstellen
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);
}
}
API von Ihrer Seite aus aufrufen
User? user = await api<UserApiService>(
(request) => request.fetchUser(1),
);
Elegante API-Dienste mit automatischem JSON-Parsing, Caching und Interceptoren.
Mehr erfahrenDaten sicher speichern
// 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),
);
Lesen mit Typkonvertierung
// 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");
Sicherer lokaler Speicher mit Typkonvertierung, TTL-Ablauf und Sammlungen.
Mehr erfahrenFügen Sie Ihre Sprachdateien hinzu
{
"welcome": "Welcome",
"greeting": "Hello {{name}}",
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
Übersetzen Sie Text in Ihren Widgets
// Simple translation
Text("welcome".tr()) // "Welcome"
// With arguments
Text("greeting".tr(arguments: {"name": "Anthony"}))
// "Hello Anthony"
// Nested keys
Text("navigation.home".tr()) // "Home"
Mehrsprachige Unterstützung mit JSON-Dateien, Argumenten und RTL.
Mehr erfahrenNavigations-Hub erstellen
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),
),
};
});
}
Layouts einfach wechseln
// Bottom navigation
NavigationHubLayout.bottomNav()
// Top navigation
NavigationHubLayout.topNav()
// Journey / wizard flow
NavigationHubLayout.journey()
Erstellen Sie untere Navigation, obere Navigation oder Journey-Flows mit Zustandserhaltung.
Mehr erfahrenOffen entwickelt, im Produktivbetrieb erprobt
“Ich bin neu in Dart und neu bei eurem Framework — das ich liebe.”
“Nylo ist das beste Framework für Flutter — es macht das Entwickeln einfach.”
@higakijin
“Mit Abstand das beste Framework überhaupt. Beeindruckende Qualität und Funktionen.”
@2kulfi
“Es macht die Arbeit einfacher und schneller. Großartige Arbeit.”
darkreader01
“Ich habe dieses Framework gerade entdeckt und bin sehr beeindruckt. Danke.”
@lepresk
“Das Konzept dieses Frameworks gefällt mir wirklich gut.”
@Chrisvidal
“Ich wollte euch für die großartige Arbeit danken, die ihr leistet.”
@youssefKadaouiAbbassi
“Ich wollte nur sagen, dass ich die Website von @nylo_dev liebe!”
@esfoliante_txt
“Das ist unglaublich. Sehr gut gemacht!”
FireflyDaniel
Deine nächste Flutter-App beginnt mit einem einzigen Befehl
Kostenlos, MIT-lizenziert — und darunter steckt weiterhin einfach Flutter.
dart pub global activate nylo_installer