V7 Nylo v7 burada! Yeniliklere göz atın →
Nylo
Flutter mikro çatısı MIT lisanslı

Flutter
Mikro-framework
Modern Uygulamalar İçin

Nylo her projeye aynı sağlam temeli verir — yönlendirme, durum, ağ, formlar ve kimlik doğrulama — böylece birinci dosyadan değil, birinci özellikten başlarsınız.

Tek satırda kurun
$ dart pub global activate nylo_installer
Kurulum kılavuzunu oku Ardından projenize ad vermek için yönergeleri izleyin.
my_app OLUŞTURULDU
lib/
app/  — modeller, ağ, sağlayıcılar
bootstrap/  — başlatma ve kurulum
config/  — tema, anahtarlar, çözümleyiciler
resources/
pages/  home_page.dart
widgets/
themes/
routes/  router.dart
main.dart
Her Nylo projesi aynı yapıda başlar — ekip arkadaşlarınızınki de.
862 ★ GitHub'da Dart 3 uyumlu MIT lisanslı pub.dev üzerinde nylo.dev tarafından yayınlandı 2021'den beri aktif olarak geliştiriliyor
>_ Metro CLI

Terminalden her şeyi oluşturun

Metro sayfa, model, denetleyici, widget ve daha fazlasını üretir — bir köşeye bırakmak yerine yönlendiricinize ve klasör yapınıza bağlayarak.

Widget'ları, uygulama altyapısını ve yapılandırmayı kapsayan 17 üreteç
Üretim sırasında rotalar otomatik kaydedilir
Ekip genelinde tutarlı isimlendirme ve dosya yerleşimi
Metro hakkında daha fazla bilgi edinin
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());
Ağ İşlemleri

Zahmetsiz API entegrasyonu

Otomatik JSON ayrıştırma, hata yönetimi ve istek yakalayıcılarıyla temiz, sürdürülebilir API servisleri yazın — sayfalarınızda Dio kalıp kodu olmadan.

Ağ İşlemleri hakkında daha fazla bilgi edinin
Keşfet

Gerçekten yazacağınız kodda görün

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 uygulamanız için karmaşık rotalar, arayüzler ve UI sayfaları oluşturun.

Daha fazla bilgi
Adım 1

Kullanıcı kimliğini doğrula

String userToken = "eyJhbG123...";

await Auth.authenticate(data: {"token": userToken});
Adım 2

Artık kullanıcınız uygulamayı açtığında kimliği doğrulanmış olacak.

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

bool isAuthenticated = await Auth.isAuthenticated();
// true
Adım 3

Router'ınızda authenticatedRoute ayarladıysanız, kullanıcı uygulamayı tekrar açtığında bu sayfa gösterilecektir.

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

Kullanıcıyı çıkış yaptır

await Auth.logout();

Flutter uygulamanızda kullanıcıları doğrulayın.

Daha fazla bilgi
Adım 1

Form Oluştur

terminal
metro make:form RegisterForm
Adım 2

Formunuzu değiştirin

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");
}
Adım 3

Formunuzu bir widget'ta kullanın

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

Nylo Forms ile verileri tek bir yerde yönetin, doğrulayın ve gönderin.

Daha fazla bilgi
Adım 1

Durum yönetimli widget oluştur

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}"));
  }
}
Adım 2

Use CartIcon.action("clear_cart")

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

Flutter uygulamanızdaki widget'lar için güçlü durum yönetimi.

Daha fazla bilgi
Adım 1

Etkinliğinizi oluşturun

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
        );
    }
}
Adım 2

Etkinliği gönderin

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

Uygulamanızda etkinlikleri gönderin ve dinleyin.

Daha fazla bilgi

Bir görevi bir kez çalıştırmak için zamanla

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

Belirli bir tarihten sonra bir kez çalıştırmak için görevi zamanla

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

Günde bir kez çalıştırmak için görevi zamanla

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

Flutter uygulamanızda görevleri bir kez veya günlük çalıştırmak için zamanlayın.

Daha fazla bilgi
Adım 1

API Servisi Oluşturun

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);
    }
}
Adım 2

Sayfanızdan API'yi çağırın

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

Otomatik JSON ayrıştırma, önbellekleme ve interceptor'lar ile zarif API servisleri.

Daha fazla bilgi
Adım 1

Verileri güvenle kaydedin

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),
);
Adım 2

Tip dönüşümü ile okuyun

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

Tip dönüşümü, TTL süresi ve koleksiyonlar ile güvenli yerel depolama.

Daha fazla bilgi
Adım 1

Dil dosyalarınızı ekleyin

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

Widget'larınızdaki metni çevirin

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

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

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

JSON dosyaları, argümanlar ve RTL ile çoklu dil desteği.

Daha fazla bilgi
Adım 1

Navigasyon Hub'ı Oluşturun

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),
            ),
        };
    });
}
Adım 2

Düzenleri kolayca değiştirin

// Bottom navigation
NavigationHubLayout.bottomNav()

// Top navigation
NavigationHubLayout.topNav()

// Journey / wizard flow
NavigationHubLayout.journey()

Durum koruması ile alt navigasyon, üst navigasyon veya yolculuk akışları oluşturun.

Daha fazla bilgi
Topluluk

Açıkça geliştirildi, üretimde kullanılıyor

“Dart'ta da sizin çatınızda da yeniyim — ve bayıldım.”

P
Peter
Kıdemli Direktör, Heroku Global

“Nylo, Flutter için en iyi çatı — geliştirmeyi kolaylaştırıyor.”

@higakijin

“Açık ara en iyi çatı. Kalitesi ve özellikleri harika.”

@2kulfi

“İşi kolaylaştırıyor ve zamandan kazandırıyor. Harika iş.”

darkreader01

“Bu çatıyı yeni keşfettim ve çok etkilendim. Teşekkürler.”

@lepresk

“Bu çatının konseptini gerçekten çok sevdim.”

@Chrisvidal

“Yaptığınız harika iş için teşekkür etmek istedim.”

@youssefKadaouiAbbassi

“Sadece @nylo_dev'in sitesine bayıldığımı söylemek istedim!”

@esfoliante_txt

“Bu inanılmaz. Çok iyi iş!”

FireflyDaniel

Bir sonraki Flutter uygulamanız tek bir komutla başlıyor

Ücretsiz, MIT lisanslı ve altında hâlâ sadece Flutter var.

$ dart pub global activate nylo_installer