Controller'lar
Giriş
Nylo Website v7'deki controller'lar, görünümleriniz (sayfalar) ve iş mantığı arasında koordinatör görevi görür. Kullanıcı girdilerini işler, durum güncellemelerini yönetir ve temiz bir sorumluluk ayrımı sağlar.
Nylo Website v7, toast bildirimleri, form doğrulama, durum yönetimi ve daha fazlası için güçlü yerleşik metotlara sahip NyController sınıfını sunar.
import 'package:nylo_framework/nylo_framework.dart';
class HomeController extends NyController {
@override
Future<void> construct(BuildContext context) async {
super.construct(context);
// Initialize services or fetch data
}
void onTapProfile() {
routeTo(ProfilePage.path);
}
void submitForm() {
validate(
rules: {"email": "email"},
onSuccess: () => showToastSuccess(description: "Form submitted!"),
);
}
}
Controller Oluşturma
Controller oluşturmak için Metro CLI kullanın:
# Create a page with a controller
metro make:page dashboard --controller
# or shorthand
metro make:page dashboard -c
# Create a controller only
metro make:controller profile_controller
Bu şunları oluşturur:
- Controller:
lib/app/controllers/dashboard_controller.dart - Sayfa:
lib/resources/pages/dashboard_page.dart
Controller Kullanma
NyStatefulWidget üzerinde generic tip olarak belirterek bir controller'ı sayfanıza bağlayın:
import 'package:nylo_framework/nylo_framework.dart';
import '/app/controllers/home_controller.dart';
class HomePage extends NyStatefulWidget<HomeController> {
static RouteView path = ("/home", (_) => HomePage());
HomePage() : super(child: () => _HomePageState());
}
class _HomePageState extends NyPage<HomePage> {
@override
get init => () async {
// Access controller methods
widget.controller.fetchData();
};
@override
Widget view(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Home")),
body: Column(
children: [
ElevatedButton(
onPressed: widget.controller.onTapProfile,
child: Text("View Profile"),
),
TextField(
controller: widget.controller.nameController,
),
],
),
);
}
}
Rota Verilerine Erişim
Sayfalar arasında veri geçirin ve controller'ınızda erişin:
// Navigate with data
routeTo(ProfilePage.path, data: {"userId": 123});
// In your controller
class ProfileController extends NyController {
@override
Future<void> construct(BuildContext context) async {
super.construct(context);
// Get the passed data
Map<String, dynamic>? userData = data();
int? userId = userData?['userId'];
}
}
Veya sayfa durumunuzda doğrudan verilere erişin:
class _ProfilePageState extends NyPage<ProfilePage> {
@override
get init => () async {
// From controller
var userData = widget.controller.data();
// Or from widget directly
var userData = widget.data();
};
}
Sorgu Parametreleri
Controller'ınızda URL sorgu parametrelerine erişin:
// Navigate to: /profile?tab=settings&highlight=true
routeTo("/profile?tab=settings&highlight=true");
// In your controller
class ProfileController extends NyController {
@override
Future<void> construct(BuildContext context) async {
super.construct(context);
// Get all query parameters as Map
Map<String, dynamic>? params = queryParameters();
// {"tab": "settings", "highlight": "true"}
// Get a specific parameter
String? tab = queryParameters(key: "tab");
// "settings"
}
}
Bir sorgu parametresinin mevcut olup olmadığını kontrol edin:
// In your page
if (widget.hasQueryParameter("tab")) {
// Handle tab parameter
}
Sayfa Durum Yönetimi
Controller'lar sayfa durumunu doğrudan yönetebilir:
class HomeController extends NyController {
int counter = 0;
void increment() {
counter++;
// Trigger a setState on the page
setState(setState: () {});
}
void refresh() {
// Refresh the entire page
refreshPage();
}
void goBack() {
// Pop the page with optional result
pop(result: {"updated": true});
}
void updateCustomState() {
// Send custom action to page
updatePageState("customAction", {"key": "value"});
}
}
Toast Bildirimleri
Controller'lar yerleşik toast bildirim metotları içerir:
class FormController extends NyController {
void showNotifications() {
// Success toast
showToastSuccess(description: "Profile updated!");
// Warning toast
showToastWarning(description: "Please check your input");
// Error/Danger toast
showToastDanger(description: "Failed to save changes");
// Info toast
showToastInfo(description: "New features available");
// Sorry toast
showToastSorry(description: "We couldn't process your request");
// Oops toast
showToastOops(description: "Something went wrong");
}
void showCustomToast() {
// Custom toast with title
showToastSuccess(
title: "Great Job!",
description: "Your changes have been saved",
);
// Use custom toast style (registered in Nylo)
showToastCustom(
title: "Custom",
description: "Using custom style",
id: "my_custom_toast",
);
}
}
Form Doğrulama
Controller'ınızdan form verilerini doğrudan doğrulayın:
class RegisterController extends NyController {
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
void submitRegistration() {
validate(
rules: {
"email": "email|max:50",
"password": "min:8|max:64",
},
data: {
"email": emailController.text,
"password": passwordController.text,
},
messages: {
"email.email": "Please enter a valid email",
"password.min": "Password must be at least 8 characters",
},
showAlert: true,
alertStyle: 'warning',
onSuccess: () {
// Validation passed
_performRegistration();
},
onFailure: (exception) {
// Validation failed
print(exception.toString());
},
);
}
void _performRegistration() async {
// Handle registration logic
showToastSuccess(description: "Account created!");
}
}
Dil Değiştirme
Controller'ınızdan uygulamanın dilini değiştirin:
class SettingsController extends NyController {
void switchToSpanish() {
changeLanguage('es', restartState: true);
}
void switchToEnglish() {
changeLanguage('en', restartState: true);
}
}
Kilit Serbest Bırakma
Butonlara birden fazla hızlı dokunmayı önleyin:
class CheckoutController extends NyController {
void onTapPurchase() {
lockRelease("purchase_lock", perform: () async {
// This code only runs once until the lock is released
await processPayment();
showToastSuccess(description: "Payment complete!");
});
}
void onTapWithoutSetState() {
lockRelease(
"my_lock",
perform: () async {
await someAsyncOperation();
},
shouldSetState: false, // Don't trigger setState after
);
}
}
İşlem Onayı
Yıkıcı işlemlerden önce onay diyalogu gösterin:
class AccountController extends NyController {
void onTapDeleteAccount() {
confirmAction(
() async {
// User confirmed - perform deletion
await deleteAccount();
showToastSuccess(description: "Account deleted");
},
title: "Delete Account?",
dismissText: "Cancel",
);
}
}
Singleton Controller'lar
Bir controller'ı uygulama genelinde singleton olarak kalıcı kılın:
class AuthController extends NyController {
@override
bool get singleton => true;
User? currentUser;
Future<void> login(String email, String password) async {
// Login logic
currentUser = await AuthService.login(email, password);
}
bool get isLoggedIn => currentUser != null;
}
Singleton controller'lar bir kez oluşturulur ve uygulama yaşam döngüsü boyunca yeniden kullanılır.
Controller Kod Çözücüler
Controller'larınızı lib/config/decoders.dart dosyasında kaydedin:
import 'package:nylo_framework/nylo_framework.dart';
import '/app/controllers/home_controller.dart';
import '/app/controllers/profile_controller.dart';
import '/app/controllers/auth_controller.dart';
final Map<Type, BaseController Function()> controllers = {
HomeController: () => HomeController(),
ProfileController: () => ProfileController(),
AuthController: () => AuthController(),
};
Bu harita, sayfalar yüklendiğinde Nylo Website'nun controller'ları çözmesine olanak tanır.
Rota Korumaları
Controller'lar, sayfa yüklenmeden önce çalışan rota korumaları tanımlayabilir:
class AdminController extends NyController {
@override
List<RouteGuard> get routeGuards => [
AuthRouteGuard(),
AdminRoleGuard(),
];
@override
Future<void> construct(BuildContext context) async {
super.construct(context);
// Only runs if all guards pass
}
}
Rota korumaları hakkında daha fazla bilgi için Router dokümantasyonuna bakın.