Flutter
Micro-framework
Cho ứng dụng hiện đại
Nylo mang đến cho mọi dự án cùng một nền tảng vững chắc — định tuyến, trạng thái, mạng, biểu mẫu và xác thực — để bạn bắt đầu từ tính năng đầu tiên thay vì tệp đầu tiên.
dart pub global activate nylo_installer
Mọi thứ bạn cần để xây dựng
Sáu trụ cột, một quy ước. Mỗi phần đi kèm trình tạo Metro, giá trị mặc định hợp lý và một lối thoát — bên dưới vẫn là Flutter thuần.
Định tuyến
Route khai báo với guard, tham số có kiểu, hiệu ứng chuyển trang và deep linking.
Quản lý trạng thái
Trạng thái phản ứng với controller, hook vòng đời và lưu trữ nhẹ nhàng.
Kết nối mạng
Các lớp dịch vụ API với giải mã model tự động và bộ chặn yêu cầu.
Biểu mẫu
Khai báo trường một lần — kiểm tra hợp lệ, ép kiểu và liên kết dữ liệu đi kèm.
Xác thực
Xử lý phiên, lưu token và route guard mà không cần thiết lập riêng.
Metro CLI
Tạo trang, model, controller, biểu mẫu và giao diện chỉ từ một lệnh.
Tạo mọi thứ từ terminal
Metro tạo trang, model, controller, widget và nhiều thứ khác — được nối thẳng vào router và cấu trúc thư mục của bạn, chứ không vứt vào một góc.
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());
Tích hợp API dễ dàng
Viết các dịch vụ API gọn gàng, dễ bảo trì với phân tích JSON tự động, xử lý lỗi và bộ chặn yêu cầu — không còn mã Dio lặp lại trong các trang của bạn.
Tìm hiểu thêm về Kết nối mạngXem nó trong đoạn mã bạn thực sự sẽ viết
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()
]
);
});
Xây dựng các tuyến đường phức tạp, giao diện và trang UI cho ứng dụng Flutter của bạn.
Tìm hiểu thêmXác thực người dùng
String userToken = "eyJhbG123...";
await Auth.authenticate(data: {"token": userToken});
Bây giờ, khi người dùng mở ứng dụng, họ sẽ được xác thực.
final userData = Auth.data();
// {"token": "eyJhbG123..."}
bool isAuthenticated = await Auth.isAuthenticated();
// true
Nếu bạn đã thiết lập authenticatedRoute trong bộ định tuyến, trang này sẽ được hiển thị khi người dùng mở lại ứng dụng.
appRouter() => nyRoutes((router) {
...
router.add(LandingPage.path).initialRoute();
router.add(DashboardPage.path).authenticatedRoute();
// overrides the initial route when a user is authenticated
Đăng xuất người dùng
await Auth.logout();
Xác thực người dùng trong ứng dụng Flutter của bạn.
Tìm hiểu thêmTạo biểu mẫu
metro make:form RegisterForm
Chỉnh sửa biểu mẫu
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");
}
Sử dụng biểu mẫu trong widget
@override
Widget build(BuildContext context) {
return Scaffold(
body: RegisterForm(
submitButton: Button.primary(text: "Submit"),
onSubmit: (data) {
printInfo(data);
},
),
);
}
Quản lý, xác thực và gửi dữ liệu tất cả tại một nơi với Nylo Forms.
Tìm hiểu thêmTạo widget quản lý trạng thái
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");
}
)
Quản lý trạng thái mạnh mẽ cho widget trong ứng dụng Flutter của bạn.
Tìm hiểu thêmTạo sự kiện
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
);
}
}
Phát sự kiện
MaterialButton(child: Text("Logout"),
onPressed: () {
event<LogoutEvent>();
},
)
Phát sự kiện và lắng nghe chúng trong ứng dụng của bạn.
Tìm hiểu thêmLên lịch chạy tác vụ một lần
Nylo.scheduleOnce("onboarding_info", () {
print("Perform code here to run once");
});
Lên lịch chạy tác vụ một lần sau một ngày cụ thể
Nylo.scheduleOnceAfterDate("app_review_rating", () {
print("Perform code to run once after DateTime(2025, 04, 10)");
}, date: DateTime(2025, 04, 10));
Lên lịch chạy tác vụ một lần mỗi ngày
Nylo.scheduleOnceDaily("free_daily_coins", () {
print("Perform code to run once daily");
});
Lên lịch các tác vụ chạy một lần hoặc hàng ngày trong ứng dụng Flutter của bạn.
Tìm hiểu thêmTạo dịch vụ 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);
}
}
Gọi API từ trang của bạn
User? user = await api<UserApiService>(
(request) => request.fetchUser(1),
);
Dịch vụ API tinh gọn với phân tích JSON tự động, bộ nhớ đệm và interceptor.
Tìm hiểu thêmLưu dữ liệu an toàn
// 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),
);
Đọc với ép kiểu
// 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");
Lưu trữ cục bộ an toàn với ép kiểu, hết hạn TTL và bộ sưu tập.
Tìm hiểu thêmThêm tệp ngôn ngữ của bạn
{
"welcome": "Welcome",
"greeting": "Hello {{name}}",
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
Dịch văn bản trong widget của bạn
// Simple translation
Text("welcome".tr()) // "Welcome"
// With arguments
Text("greeting".tr(arguments: {"name": "Anthony"}))
// "Hello Anthony"
// Nested keys
Text("navigation.home".tr()) // "Home"
Hỗ trợ đa ngôn ngữ với tệp JSON, tham số và RTL.
Tìm hiểu thêmTạo trung tâm điều hướng
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),
),
};
});
}
Chuyển đổi bố cục dễ dàng
// Bottom navigation
NavigationHubLayout.bottomNav()
// Top navigation
NavigationHubLayout.topNav()
// Journey / wizard flow
NavigationHubLayout.journey()
Xây dựng thanh điều hướng dưới, trên hoặc luồng hành trình với duy trì trạng thái.
Tìm hiểu thêmPhát triển công khai, dùng trong sản phẩm thật
“Tôi mới làm quen với Dart và với framework của các bạn — mà tôi rất thích.”
“Nylo là framework tốt nhất cho Flutter — nó khiến việc phát triển trở nên dễ dàng.”
@higakijin
“Cho đến nay là framework tốt nhất. Chất lượng và tính năng tuyệt vời.”
@2kulfi
“Nó khiến công việc dễ hơn và tốn ít thời gian hơn. Làm tốt lắm.”
darkreader01
“Tôi vừa khám phá ra framework này và rất ấn tượng. Cảm ơn.”
@lepresk
“Tôi thực sự thích ý tưởng của framework này.”
@Chrisvidal
“Tôi muốn cảm ơn các bạn vì công việc tuyệt vời mà các bạn đang làm.”
@youssefKadaouiAbbassi
“Chỉ muốn nói rằng tôi rất mê trang web của @nylo_dev!”
@esfoliante_txt
“Thật tuyệt vời. Làm rất tốt!”
FireflyDaniel
Ứng dụng Flutter tiếp theo của bạn bắt đầu bằng một lệnh
Miễn phí, giấy phép MIT, và bên dưới vẫn chỉ là Flutter.
dart pub global activate nylo_installer