🎉 Nylo v7 уже здесь! Узнать, что нового →

Nylo Website logo

Flutter
Микро-фреймворк
для современных приложений

Надёжная основа для создания Flutter-приложений. Маршрутизация, управление состоянием, сетевое взаимодействие и многое другое — всё в одном элегантном пакете.

Начать
Обзор
Metro CLI

Создавайте что угодно из терминала

Metro — это CLI-инструмент Nylo, который помогает создавать страницы, модели, контроллеры, виджеты и многое другое одной командой.

Узнать больше о Metro
metro 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-приложения

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()
        ]
    );
});

Создавайте сложные маршруты, интерфейсы и UI-страницы для вашего Flutter-приложения.

Узнать больше
Шаг 1

Аутентифицировать пользователя

String userToken = "eyJhbG123...";

await Auth.authenticate(data: {"token": userToken});
Шаг 2

Теперь, когда пользователь откроет приложение, он будет аутентифицирован.

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

bool isAuthenticated = await Auth.isAuthenticated();
// true
Шаг 3

Если вы задали authenticatedRoute в вашем маршрутизаторе, эта страница будет показана при повторном открытии приложения.

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

Выйти из аккаунта

await Auth.logout();

Аутентифицируйте пользователей в вашем Flutter-приложении.

Узнать больше
Шаг 1

Создать форму

terminal
metro make:form RegisterForm
Шаг 2

Изменить форму

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");
}
Шаг 3

Использовать форму в виджете

register_page.dart
@override
Widget build(BuildContext context) {
  return Scaffold(
    body: RegisterForm(
      submitButton: Button.primary(text: "Submit"),
      onSubmit: (data) {
        printInfo(data);
      },
    ),
  );
}

Управляйте, валидируйте и отправляйте данные в одном месте с Nylo Forms.

Узнать больше
Шаг 1

Создать виджет с управлением состоянием

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}"));
  }
}
Шаг 2

Use CartIcon.action("clear_cart")

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

Мощное управление состоянием виджетов в вашем Flutter-приложении.

Узнать больше
Шаг 1

Создать событие

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
        );
    }
}
Шаг 2

Отправить событие

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-приложении.

Узнать больше
Шаг 1

Создать 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);
    }
}
Шаг 2

Вызвать API со страницы

User? user = await api<UserApiService>(
    (request) => request.fetchUser(1),
);

Элегантные API-сервисы с автоматическим парсингом JSON, кэшированием и перехватчиками.

Узнать больше
Шаг 1

Безопасное сохранение данных

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),
);
Шаг 2

Чтение с приведением типов

// 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 и коллекциями.

Узнать больше
Шаг 1

Добавьте файлы локализации

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

Переводите текст в ваших виджетах

// 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.

Узнать больше
Шаг 1

Создать навигационный хаб

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),
            ),
        };
    });
}
Шаг 2

Легко переключайте макеты

// Bottom navigation
NavigationHubLayout.bottomNav()

// Top navigation
NavigationHubLayout.topNav()

// Journey / wizard flow
NavigationHubLayout.journey()

Создавайте нижнюю навигацию, верхнюю навигацию или пошаговые потоки с сохранением состояния.

Узнать больше

Любим сообществом

Что говорят разработчики о Nylo Website

Присоединиться к обсуждению

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