Advanced

Event

Pengantar

Event sangat berguna ketika Anda perlu menangani logika setelah sesuatu terjadi di aplikasi Anda. Sistem event Nylo memungkinkan Anda membuat, mengirim, dan mendengarkan event dari mana saja di aplikasi Anda, memudahkan pembangunan aplikasi Flutter yang responsif dan berbasis event.

Memahami Event

Pemrograman berbasis event adalah paradigma di mana alur aplikasi Anda ditentukan oleh event seperti aksi pengguna, output sensor, atau pesan dari program atau thread lain. Pendekatan ini membantu memisahkan berbagai bagian aplikasi Anda, membuat kode Anda lebih mudah dipelihara dan dipahami.

Contoh Event Umum

Berikut beberapa event tipikal yang mungkin digunakan aplikasi Anda:

  • Registrasi pengguna selesai
  • Pengguna login/logout
  • Produk ditambahkan ke keranjang
  • Pembayaran berhasil diproses
  • Sinkronisasi data selesai
  • Push notification diterima

Membuat Event

Anda dapat membuat event baru menggunakan CLI framework Nylo atau Metro:

metro make:event PaymentSuccessfulEvent

Setelah menjalankan perintah, file event baru akan dibuat di direktori app/events/.

Struktur Event

Berikut struktur file event yang baru dibuat (contoh: 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
  }
}

Mengirim Event

Event dapat dikirim dari mana saja di aplikasi Anda menggunakan method helper event.

Pengiriman Event Dasar

Untuk mengirim event tanpa data:

event<PaymentSuccessfulEvent>();

Mengirim dengan Data

Untuk mengirim data bersama event Anda:

event<PaymentSuccessfulEvent>(data: {
  'user': user,
  'amount': amount,
  'transactionId': 'txn_123456'
});

Broadcasting Event

Secara default, event Nylo hanya ditangani oleh listener yang didefinisikan di kelas event. Untuk mem-broadcast event (membuatnya tersedia untuk listener eksternal), gunakan parameter broadcast:

event<PaymentSuccessfulEvent>(
  data: {'user': user, 'amount': amount},
  broadcast: true
);

Mendengarkan Event

Nylo menyediakan beberapa cara untuk mendengarkan dan merespons event.

Menggunakan Helper listenOn

Helper listenOn dapat digunakan di mana saja di aplikasi Anda untuk mendengarkan event yang di-broadcast:

NyEventSubscription subscription = listenOn<PaymentSuccessfulEvent>((data) {
  // Access event data
  final user = data['user'];
  final amount = data['amount'];

  // Handle the event
  showSuccessMessage("Payment of $amount received");
});

Menggunakan Helper listen

Helper listen tersedia di kelas NyPage dan NyState. Helper ini secara otomatis mengelola subscription, berhenti berlangganan saat widget di-dispose:

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
}

Berhenti Berlangganan Event

Saat menggunakan listenOn, Anda harus berhenti berlangganan secara manual untuk mencegah kebocoran memori:

// Store the subscription
final subscription = listenOn<PaymentSuccessfulEvent>((data) {
  // Handle event
});

// Later, when no longer needed
subscription.cancel();

Helper listen secara otomatis menangani pembatalan langganan saat widget di-dispose.

Bekerja dengan Listener

Listener adalah kelas yang merespons event. Setiap event dapat memiliki beberapa listener untuk menangani aspek berbeda dari event tersebut.

Menambahkan Beberapa Listener

Anda dapat menambahkan beberapa listener ke event Anda dengan memperbarui properti listeners:

class PaymentSuccessfulEvent implements NyEvent {
  final listeners = {
    NotificationListener: NotificationListener(),
    AnalyticsListener: AnalyticsListener(),
    OrderProcessingListener: OrderProcessingListener(),
  };
}

Mengimplementasikan Logika Listener

Setiap listener harus mengimplementasikan method handle untuk memproses event:

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

Broadcasting Event Global

Jika Anda ingin semua event di-broadcast secara otomatis tanpa menentukan broadcast: true setiap kali, Anda dapat mengaktifkan broadcasting global.

Mengaktifkan Broadcasting Global

Edit file app/providers/app_provider.dart Anda dan tambahkan method broadcastEvents() ke instance Nylo Anda:

class AppProvider implements NyProvider {
  @override
  boot(Nylo nylo) async {
    // Other configuration

    // Enable broadcasting for all events
    nylo.broadcastEvents();
  }
}

Dengan broadcasting global diaktifkan, Anda dapat mengirim dan mendengarkan event dengan lebih ringkas:

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