V7 Nylo v7 来了! 查看新功能 →
Nylo
Flutter 微框架 采用 MIT 许可

Flutter
微框架
用于现代应用

Nylo 为每个项目提供同样坚实的基础——路由、状态、网络、表单和认证——让你从第一个功能开始,而不是第一个文件。

一行命令完成安装
$ dart pub global activate nylo_installer
阅读安装指南 然后按照提示为你的项目命名。
my_app 已生成
lib/
app/  — 模型、网络、provider
bootstrap/  — 启动与初始化
config/  — 主题、键、解码器
resources/
pages/  home_page.dart
widgets/
themes/
routes/  router.dart
main.dart
每个 Nylo 项目的结构都一样——你队友的项目也是。
863 ★ GitHub 星标 兼容 Dart 3 采用 MIT 许可 由 nylo.dev 发布于 pub.dev 自 2021 年起持续维护
>_ Metro CLI

从终端创建任何内容

Metro 会生成页面、模型、控制器、组件等——并接入你的路由和目录结构,而不是随手丢在一个角落。

17 个生成器,覆盖组件、应用底层结构与配置
生成时自动注册路由
整个团队保持一致的命名和文件位置
了解更多关于 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());
网络请求

轻松的 API 集成

编写整洁、易维护的 API 服务,自动解析 JSON、处理错误并支持请求拦截器——页面里不再有 Dio 的样板代码。

了解更多关于网络请求
探索

在你真正会写的代码里看看

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

为您的 Flutter 应用构建复杂的路由、界面和 UI 页面。

了解更多
步骤 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()

构建底部导航、顶部导航或旅程流程,支持状态维护。

了解更多
社区

开放开发,用于生产环境

“我刚接触 Dart,也刚接触你们的框架——我非常喜欢。”

P
Peter
高级总监,Heroku Global

“Nylo 是最好的 Flutter 框架——它让开发变得轻松。”

@higakijin

“目前为止最好的框架。质量和功能都令人惊叹。”

@2kulfi

“它让工作更轻松、更省时。做得很棒。”

darkreader01

“刚发现这个框架,非常惊艳。谢谢。”

@lepresk

“非常喜欢这个框架的理念。”

@Chrisvidal

“我想感谢你们所做的出色工作。”

@youssefKadaouiAbbassi

“只想说我太喜欢 @nylo_dev 的网站了!”

@esfoliante_txt

“太棒了。做得非常好!”

FireflyDaniel

你的下一个 Flutter 应用,从一条命令开始

免费,采用 MIT 许可,底层依然只是 Flutter。

$ dart pub global activate nylo_installer