Events
Einleitung
Events sind leistungsstark, wenn Sie Logik verarbeiten müssen, nachdem etwas in Ihrer Anwendung passiert ist. Das Event-System von Nylo ermöglicht es Ihnen, Events von überall in Ihrer Anwendung zu erstellen, auszulösen und auf sie zu lauschen, was den Aufbau reaktiver, eventgesteuerter Flutter-Anwendungen erleichtert.
Events verstehen
Eventgesteuerte Programmierung ist ein Paradigma, bei dem der Ablauf Ihrer Anwendung durch Events wie Benutzeraktionen, Sensorausgaben oder Nachrichten von anderen Programmen oder Threads bestimmt wird. Dieser Ansatz hilft, verschiedene Teile Ihrer Anwendung zu entkoppeln, wodurch Ihr Code wartbarer und leichter nachvollziehbar wird.
Gängige Event-Beispiele
Hier sind einige typische Events, die Ihre Anwendung verwenden könnte:
- Benutzerregistrierung abgeschlossen
- Benutzer angemeldet/abgemeldet
- Produkt zum Warenkorb hinzugefügt
- Zahlung erfolgreich verarbeitet
- Datensynchronisierung abgeschlossen
- Push-Benachrichtigung empfangen
Ein Event erstellen
Sie können ein neues Event entweder mit der Nylo-Framework-CLI oder Metro erstellen:
metro make:event PaymentSuccessfulEvent
Nach Ausführung des Befehls wird eine neue Event-Datei im Verzeichnis app/events/ erstellt.
Event-Struktur
Hier ist die Struktur einer neu erstellten Event-Datei (z.B. app/events/payment_successful_event.dart):
import 'package:nylo_framework/nylo_framework.dart';
class PaymentSuccessfulEvent implements NyEvent {
final listeners = {
DefaultListener: DefaultListener(),
};
}
class DefaultListener extends NyListener {
handle(dynamic event) async {
// Handle the payload from event
}
}
Events auslösen
Events können von überall in Ihrer Anwendung mit der event-Hilfsmethode ausgelöst werden.
Einfaches Event auslösen
Um ein Event ohne Daten auszulösen:
event<PaymentSuccessfulEvent>();
Auslösen mit Daten
Um Daten zusammen mit Ihrem Event zu übergeben:
event<PaymentSuccessfulEvent>(data: {
'user': user,
'amount': amount,
'transactionId': 'txn_123456'
});
Events broadcasten
Standardmäßig werden Nylo-Events nur von den in der Event-Klasse definierten Listenern verarbeitet. Um ein Event zu broadcasten (es für externe Listener verfügbar zu machen), verwenden Sie den Parameter broadcast:
event<PaymentSuccessfulEvent>(
data: {'user': user, 'amount': amount},
broadcast: true
);
Auf Events lauschen
Nylo bietet mehrere Möglichkeiten, auf Events zu lauschen und darauf zu reagieren.
Den listenOn-Helfer verwenden
Der listenOn-Helfer kann überall in Ihrer Anwendung verwendet werden, um auf gebroadcastete Events zu lauschen:
NyEventSubscription subscription = listenOn<PaymentSuccessfulEvent>((data) {
// Access event data
final user = data['user'];
final amount = data['amount'];
// Handle the event
showSuccessMessage("Payment of $amount received");
});
Den listen-Helfer verwenden
Der listen-Helfer ist in NyPage- und NyState-Klassen verfügbar. Er verwaltet Abonnements automatisch und meldet sich ab, wenn das Widget disposed wird:
class _CheckoutPageState extends NyPage<CheckoutPage> {
@override
get init => () {
listen<PaymentSuccessfulEvent>((data) {
// Handle payment success
routeTo(OrderConfirmationPage.path);
});
listen<PaymentFailedEvent>((data) {
// Handle payment failure
displayErrorMessage(data['error']);
});
};
// Rest of your page implementation
}
Events abbestellen
Bei Verwendung von listenOn müssen Sie sich manuell abmelden, um Speicherlecks zu vermeiden:
// Store the subscription
final subscription = listenOn<PaymentSuccessfulEvent>((data) {
// Handle event
});
// Later, when no longer needed
subscription.cancel();
Der listen-Helfer behandelt die Abmeldung automatisch, wenn das Widget disposed wird.
Mit Listenern arbeiten
Listener sind Klassen, die auf Events reagieren. Jedes Event kann mehrere Listener haben, um verschiedene Aspekte des Events zu verarbeiten.
Mehrere Listener hinzufügen
Sie können mehrere Listener zu Ihrem Event hinzufügen, indem Sie die listeners-Eigenschaft aktualisieren:
class PaymentSuccessfulEvent implements NyEvent {
final listeners = {
NotificationListener: NotificationListener(),
AnalyticsListener: AnalyticsListener(),
OrderProcessingListener: OrderProcessingListener(),
};
}
Listener-Logik implementieren
Jeder Listener sollte die handle-Methode implementieren, um das Event zu verarbeiten:
class NotificationListener extends NyListener {
handle(dynamic event) async {
// Send notification to user
final user = event['user'];
await NotificationService.sendNotification(
userId: user.id,
title: "Payment Successful",
body: "Your payment of ${event['amount']} was processed successfully."
);
}
}
class AnalyticsListener extends NyListener {
handle(dynamic event) async {
// Log analytics event
await AnalyticsService.logEvent(
"payment_successful",
parameters: {
'amount': event['amount'],
'userId': event['user'].id,
}
);
}
}
Globales Event-Broadcasting
Wenn Sie möchten, dass alle Events automatisch gebroadcastet werden, ohne jedes Mal broadcast: true angeben zu müssen, können Sie globales Broadcasting aktivieren.
Globales Broadcasting aktivieren
Bearbeiten Sie Ihre Datei app/providers/app_provider.dart und fügen Sie die Methode broadcastEvents() zu Ihrer Nylo-Instanz hinzu:
class AppProvider implements NyProvider {
@override
boot(Nylo nylo) async {
// Other configuration
// Enable broadcasting for all events
nylo.broadcastEvents();
}
}
Mit aktiviertem globalem Broadcasting können Sie Events kompakter auslösen und auf sie lauschen:
// Dispatch event (no need for broadcast: true)
event<PaymentSuccessfulEvent>(data: {
'user': user,
'amount': amount,
});
// Listen for the event anywhere
listen<PaymentSuccessfulEvent>((data) {
// Handle event data
});