Flutter
Микро-фреймворк
для современных приложений
Надёжная основа для создания Flutter-приложений. Маршрутизация, управление состоянием, сетевое взаимодействие и многое другое — всё в одном элегантном пакете.
Всё, что нужно для разработки
Nylo предоставляет все инструменты для уверенного создания Flutter-приложений, готовых к продакшену.
Маршрутизация
Простая декларативная маршрутизация с защитой маршрутов, параметрами и поддержкой диплинков.
Управление состоянием
Встроенное реактивное управление состоянием с контроллерами и удобным сохранением состояния.
Сетевое взаимодействие
Элегантные классы API-сервисов с автоматической сериализацией моделей и перехватчиками.
Формы
Мощная работа с формами: валидация, приведение типов и автоматическая привязка данных.
Аутентификация
Безопасная аутентификация с защитой маршрутов, хранением токенов и управлением сессиями.
Metro CLI
Генерируйте страницы, модели, контроллеры и многое другое с помощью мощных команд CLI.
Создавайте что угодно из терминала
Metro — это CLI-инструмент Nylo, который помогает создавать страницы, модели, контроллеры, виджеты и многое другое одной командой.
Узнать больше о Metrometro make:page HomePage
# Creates a new page called HomePage
metro make:api_service User
# Creates a new API Service called UserApiService
metro make:model User
# Creates a new model called User
metro make:stateful_widget FavouriteWidget
# Creates a new stateful widget called FavouriteWidget
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());
Простая интеграция с API
Пишите чистые и поддерживаемые API-сервисы с автоматическим парсингом JSON, обработкой ошибок и перехватчиками запросов.
Узнать больше о сетевом взаимодействииМощные инструменты для создания
Всё, что нужно для создания вашего следующего Flutter-приложения
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()
]
);
});
Создавайте сложные маршруты, интерфейсы и UI-страницы для вашего Flutter-приложения.
Узнать больше
Аутентифицировать пользователя
String userToken = "eyJhbG123...";
await Auth.authenticate(data: {"token": userToken});
Теперь, когда пользователь откроет приложение, он будет аутентифицирован.
final userData = Auth.data();
// {"token": "eyJhbG123..."}
bool isAuthenticated = await Auth.isAuthenticated();
// true
Если вы задали authenticatedRoute в вашем маршрутизаторе, эта страница будет показана при повторном открытии приложения.
appRouter() => nyRoutes((router) {
...
router.add(LandingPage.path).initialRoute();
router.add(DashboardPage.path).authenticatedRoute();
// overrides the initial route when a user is authenticated
Выйти из аккаунта
await Auth.logout();
Аутентифицируйте пользователей в вашем Flutter-приложении.
Узнать больше
Создать форму
metro make:form RegisterForm
Изменить форму
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");
}
Использовать форму в виджете
@override
Widget build(BuildContext context) {
return Scaffold(
body: RegisterForm(
submitButton: Button.primary(text: "Submit"),
onSubmit: (data) {
printInfo(data);
},
),
);
}
Управляйте, валидируйте и отправляйте данные в одном месте с Nylo Forms.
Узнать больше
Создать виджет с управлением состоянием
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");
}
)
Мощное управление состоянием виджетов в вашем Flutter-приложении.
Узнать больше
Создать событие
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
);
}
}
Отправить событие
MaterialButton(child: Text("Logout"),
onPressed: () {
event<LogoutEvent>();
},
)
Отправляйте события и слушайте их в вашем приложении.
Узнать больше
Запланировать одноразовое выполнение задачи
Nylo.scheduleOnce("onboarding_info", () {
print("Perform code here to run once");
});
Запланировать одноразовое выполнение задачи после определённой даты
Nylo.scheduleOnceAfterDate("app_review_rating", () {
print("Perform code to run once after DateTime(2025, 04, 10)");
}, date: DateTime(2025, 04, 10));
Запланировать ежедневное выполнение задачи
Nylo.scheduleOnceDaily("free_daily_coins", () {
print("Perform code to run once daily");
});
Планируйте одноразовое или ежедневное выполнение задач в вашем Flutter-приложении.
Узнать больше
Создать 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);
}
}
Вызвать API со страницы
User? user = await api<UserApiService>(
(request) => request.fetchUser(1),
);
Элегантные API-сервисы с автоматическим парсингом JSON, кэшированием и перехватчиками.
Узнать больше
Безопасное сохранение данных
// 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),
);
Чтение с приведением типов
// 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");
Безопасное локальное хранилище с приведением типов, TTL и коллекциями.
Узнать больше
Добавьте файлы локализации
{
"welcome": "Welcome",
"greeting": "Hello {{name}}",
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
Переводите текст в ваших виджетах
// Simple translation
Text("welcome".tr()) // "Welcome"
// With arguments
Text("greeting".tr(arguments: {"name": "Anthony"}))
// "Hello Anthony"
// Nested keys
Text("navigation.home".tr()) // "Home"
Многоязычная поддержка с помощью JSON-файлов, аргументов и RTL.
Узнать больше
Создать навигационный хаб
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),
),
};
});
}
Легко переключайте макеты
// Bottom navigation
NavigationHubLayout.bottomNav()
// Top navigation
NavigationHubLayout.topNav()
// Journey / wizard flow
NavigationHubLayout.journey()
Создавайте нижнюю навигацию, верхнюю навигацию или пошаговые потоки с сохранением состояния.
Узнать больше
I'm new to Dart and new to your framework (which I love)
Peter Senior Director of Heroku Global
I wanted to thank you guys for the great job you are doing.
@youssefKadaouiAbbassi
Just to say that I am in love with @nylo_dev's website!! Definitely gonna explore it!
@esfoliante_txt
Really love the concept of this framework
@Chrisvidal
Nylo is the best framework for flutter, which makes developing easy
@higakijin
This is incredible. Very well done!
FireflyDaniel
Very nice Framework! Thank you so much!
@ChaoChao2509
I just discovered this framework and I'm very impressed. Thank you
@lepresk
Great work on Nylo
@dylandamsma
This is by far the best framework out there. Amazing quality and features. Thanks so much.
@2kulfi
It's interesting and very amazing. It makes the work more easier and less time consuming. Great work. Thank you
darkreader01
Salut. Je viens juste de découvrir votre outils et je le trouve vraiment super. Une belle découverte pour moi 👌🤌
ojean-01