Flutter
微框架
用于现代应用
Nylo 为每个项目提供同样坚实的基础——路由、状态、网络、表单和认证——让你从第一个功能开始,而不是第一个文件。
构建所需的一切
六大支柱,一套约定。每一项都配有 Metro 生成器、合理的默认值和随时可退出的机制——底层依然是纯粹的 Flutter。
从终端创建任何内容
Metro 会生成页面、模型、控制器、组件等——并接入你的路由和目录结构,而不是随手丢在一个角落。
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());
在你真正会写的代码里看看
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 页面。
了解更多认证用户
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()
构建底部导航、顶部导航或旅程流程,支持状态维护。
了解更多开放开发,用于生产环境
“我刚接触 Dart,也刚接触你们的框架——我非常喜欢。”
“Nylo 是最好的 Flutter 框架——它让开发变得轻松。”
@higakijin
“目前为止最好的框架。质量和功能都令人惊叹。”
@2kulfi
“它让工作更轻松、更省时。做得很棒。”
darkreader01
“刚发现这个框架,非常惊艳。谢谢。”
@lepresk
“非常喜欢这个框架的理念。”
@Chrisvidal
“我想感谢你们所做的出色工作。”
@youssefKadaouiAbbassi
“只想说我太喜欢 @nylo_dev 的网站了!”
@esfoliante_txt
“太棒了。做得非常好!”
FireflyDaniel