V7 Nylo v7 telah hadir! Lihat yang baru →
Nylo
Micro-framework Flutter Berlisensi MIT

Flutter
Micro-framework
Untuk Aplikasi Modern

Nylo memberi setiap proyek fondasi kokoh yang sama — routing, state, jaringan, formulir, dan autentikasi — sehingga Anda mulai dari fitur pertama, bukan berkas pertama.

Pasang dalam satu baris
$ dart pub global activate nylo_installer
Baca panduan pemasangan Lalu ikuti petunjuk untuk memberi nama proyek Anda.
my_app TERBENTUK
lib/
app/  — model, jaringan, provider
bootstrap/  — boot dan penyiapan
config/  — tema, kunci, decoder
resources/
pages/  home_page.dart
widgets/
themes/
routes/  router.dart
main.dart
Setiap proyek Nylo punya bentuk yang sama — begitu juga milik rekan tim Anda.
862 ★ di GitHub Kompatibel dengan Dart 3 Berlisensi MIT Diterbitkan oleh nylo.dev di pub.dev Dikembangkan aktif sejak 2021
>_ Metro CLI

Buat apa saja dari terminal

Metro membuat halaman, model, controller, widget, dan lainnya — terhubung ke router dan struktur folder Anda, bukan sekadar ditaruh di pojok.

17 generator yang mencakup widget, fondasi aplikasi, dan konfigurasi
Rute terdaftar otomatis saat digenerasi
Penamaan dan penempatan berkas yang konsisten di seluruh tim
Pelajari lebih lanjut tentang 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());
Networking

Integrasi API yang mudah

Tulis layanan API yang bersih dan mudah dirawat dengan penguraian JSON otomatis, penanganan error, dan interceptor permintaan — tanpa boilerplate Dio di halaman Anda.

Pelajari lebih lanjut tentang Networking
Jelajahi

Lihat dalam kode yang benar-benar akan Anda tulis

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

Bangun rute kompleks, antarmuka, dan halaman UI untuk aplikasi Flutter Anda.

Pelajari lebih lanjut
Langkah 1

Autentikasi pengguna

String userToken = "eyJhbG123...";

await Auth.authenticate(data: {"token": userToken});
Langkah 2

Sekarang, ketika pengguna Anda membuka aplikasi, mereka akan terautentikasi.

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

bool isAuthenticated = await Auth.isAuthenticated();
// true
Langkah 3

Jika Anda telah menetapkan authenticatedRoute di router Anda, maka halaman ini akan ditampilkan ketika pengguna membuka aplikasi lagi.

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

Logout pengguna

await Auth.logout();

Autentikasi pengguna di aplikasi Flutter Anda.

Pelajari lebih lanjut
Langkah 1

Buat Formulir

terminal
metro make:form RegisterForm
Langkah 2

Modifikasi formulir Anda

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");
}
Langkah 3

Gunakan formulir Anda di widget

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

Kelola, validasi, dan kirim data di satu tempat dengan Nylo Forms.

Pelajari lebih lanjut
Langkah 1

Buat widget yang dikelola state

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}"));
  }
}
Langkah 2

Use CartIcon.action("clear_cart")

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

Manajemen state yang kuat untuk widget di aplikasi Flutter Anda.

Pelajari lebih lanjut
Langkah 1

Buat event Anda

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
        );
    }
}
Langkah 2

Kirim event

MaterialButton(child: Text("Logout"),
    onPressed: () {
        event<LogoutEvent>();
    },
)

Kirim event dan dengarkan di aplikasi Anda.

Pelajari lebih lanjut

Jadwalkan tugas untuk dijalankan sekali

Nylo.scheduleOnce("onboarding_info", () {
    print("Perform code here to run once");
});

Jadwalkan tugas untuk dijalankan sekali setelah tanggal tertentu

Nylo.scheduleOnceAfterDate("app_review_rating", () {
    print("Perform code to run once after DateTime(2025, 04, 10)");
}, date: DateTime(2025, 04, 10));

Jadwalkan tugas untuk dijalankan sekali sehari

Nylo.scheduleOnceDaily("free_daily_coins", () {
    print("Perform code to run once daily");
});

Jadwalkan tugas untuk dijalankan sekali atau harian di aplikasi Flutter Anda.

Pelajari lebih lanjut
Langkah 1

Buat Layanan 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);
    }
}
Langkah 2

Panggil API dari halaman Anda

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

Layanan API yang elegan dengan parsing JSON otomatis, caching, dan interceptor.

Pelajari lebih lanjut
Langkah 1

Simpan data dengan aman

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),
);
Langkah 2

Baca dengan konversi tipe

// 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");

Penyimpanan lokal yang aman dengan konversi tipe, kedaluwarsa TTL, dan koleksi.

Pelajari lebih lanjut
Langkah 1

Tambahkan file bahasa Anda

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

Terjemahkan teks di widget Anda

// Simple translation
Text("welcome".tr())  // "Welcome"

// With arguments
Text("greeting".tr(arguments: {"name": "Anthony"}))
// "Hello Anthony"

// Nested keys
Text("navigation.home".tr())  // "Home"

Dukungan multi-bahasa dengan file JSON, argumen, dan RTL.

Pelajari lebih lanjut
Langkah 1

Buat Hub Navigasi

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),
            ),
        };
    });
}
Langkah 2

Ganti tata letak dengan mudah

// Bottom navigation
NavigationHubLayout.bottomNav()

// Top navigation
NavigationHubLayout.topNav()

// Journey / wizard flow
NavigationHubLayout.journey()

Bangun navigasi bawah, navigasi atas, atau alur perjalanan dengan pemeliharaan state.

Pelajari lebih lanjut
Komunitas

Dikembangkan secara terbuka, dipakai di produksi

“Saya baru di Dart dan baru di framework kalian — yang sangat saya sukai.”

P
Peter
Senior Director, Heroku Global

“Nylo adalah framework terbaik untuk Flutter — membuat pengembangan jadi mudah.”

@higakijin

“Sejauh ini framework terbaik yang ada. Kualitas dan fiturnya luar biasa.”

@2kulfi

“Ini membuat pekerjaan lebih mudah dan lebih cepat. Kerja bagus.”

darkreader01

“Baru menemukan framework ini dan saya sangat terkesan. Terima kasih.”

@lepresk

“Saya sangat suka konsep framework ini.”

@Chrisvidal

“Saya ingin berterima kasih atas kerja hebat yang kalian lakukan.”

@youssefKadaouiAbbassi

“Sekadar ingin bilang bahwa saya suka sekali situs @nylo_dev!”

@esfoliante_txt

“Ini luar biasa. Kerja yang sangat bagus!”

FireflyDaniel

Aplikasi Flutter Anda berikutnya dimulai dengan satu perintah

Gratis, berlisensi MIT, dan di dalamnya tetap Flutter biasa.

$ dart pub global activate nylo_installer