ÿÿ Xá»­ lý sá»± kiện trong Flutter | Tài liệu Adapty

Flutter - Xử lý sự kiện flow & paywall

Hướng dẫn này đỠcập đến việc xá»­ lý sá»± kiện cho các giao dịch mua, khôi phục, lá»±a chá»n sản phẩm và hiển thị. Việc đóng view và mở liên kết được xá»­ lý bởi implementation mặc định cá»§a flowViewDidPerformAction — xem hướng dẫn xá»­ lý hành động button để ghi đè chúng hoặc xá»­ lý các hành động button tùy chỉnh.

Flows và paywalls được cấu hình bằng builder không cần thêm code để thá»±c hiện và khôi phục giao dịch mua. Tuy nhiên, chúng tạo ra má»™t số sá»± kiện mà ứng dụng cá»§a bạn có thể phản hồi. Những sá»± kiện này bao gồm các lần nhấn nút (nút đóng, URL, lá»±a chá»n sản phẩm, v.v.) cÅ©ng như thông báo vá» các hành động liên quan đến giao dịch mua diá»…n ra trên flow hoặc paywall. Tìm hiểu cách phản hồi các sá»± kiện này bên dưới.

Äể kiểm soát hoặc theo dõi các tiến trình xảy ra trên màn hình flow hoặc paywall trong ứng dụng di động cá»§a bạn, hãy triển khai các phương thức AdaptyUIFlowsEventsObserver và thiết lập observer trước khi hiển thị bất kỳ màn hình nào:

AdaptyUI().setFlowsEventsObserver(this);

Ba phương thức observer là bắt buá»™c — class cá»§a bạn sẽ không biên dịch được nếu thiếu chúng: flowViewDidFinishPurchase, flowViewDidFinishRestore, và flowViewDidReceiveError. Tất cả các phương thức còn lại là tùy chá»n. Äể há»§y kết nối má»™t observer đã được thiết lập trước đó, truyá»n null vào setFlowsEventsObserver.

Muốn xem ví dụ thá»±c tế vá» cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu cá»§a chúng tôi, nÆ¡i minh há»a toàn bá»™ quá trình thiết lập, bao gồm hiển thị paywall, thá»±c hiện mua hàng và các chức năng cÆ¡ bản khác.

Các ví dụ sá»± kiện dưới đây hiển thị các thuá»™c tính có sẵn trên từng đối tượng, vá»›i các giá trị minh há»a trong phần chú thích.

Sá»± kiện do ngưá»i dùng tạo ra

View appeared

Phương thức này được gá»i khi flow hoặc màn hình paywall xuất hiện trên màn hình.

Trên iOS, phương thức này cÅ©ng được gá»i khi ngưá»i dùng nhấn vào nút web paywall bên trong má»™t paywall, và web paywall mở ra trong trình duyệt trong ứng dụng.

void flowViewDidAppear(AdaptyUIFlowView view) {
}

View disappeared

Phương thức này được gá»i khi flow hoặc màn hình paywall bị đóng khá»i màn hình.

Trên iOS, cÅ©ng được gá»i khi má»™t web paywall mở từ paywall trong trình duyệt trong ứng dụng biến mất khá»i màn hình.

void flowViewDidDisappear(AdaptyUIFlowView view) {
}

Chá»n sản phẩm

Nếu má»™t sản phẩm được chá»n để mua (bởi ngưá»i dùng hoặc hệ thống), phương thức này sẽ được gá»i:

void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

Äã bắt đầu mua hàng

Nếu ngưá»i dùng bắt đầu quá trình mua hàng, phương thức này sẽ được gá»i:

void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

Hoàn tất giao dịch mua

Phương thức này là bắt buá»™c. Nó được gá»i khi má»™t giao dịch mua thành công, ngưá»i dùng há»§y giao dịch, hoặc giao dịch có vẻ Ä‘ang chá» xá»­ lý:

void flowViewDidFinishPurchase(AdaptyUIFlowView view, 
                               AdaptyPaywallProduct product, 
                               AdaptyPurchaseResult purchaseResult) {
    switch (purchaseResult) {
      case AdaptyPurchaseResultSuccess(profile: final profile):
        // successful purchase
        break;
      case AdaptyPurchaseResultPending():
        // purchase is pending
        break;
      case AdaptyPurchaseResultUserCancelled():
        // user cancelled the purchase
        break;
      default:
        break;
    }
}
Ví dụ sự kiện (Nhấn để mở rộng)
void flowViewDidFinishPurchase(AdaptyUIFlowView view,
                               AdaptyPaywallProduct product,
                               AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final profile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

Khác vá»›i v3, phương thức này không có hành vi mặc định — view sẽ không tá»± động bị đóng sau khi mua thành công. Bạn tá»± quyết định bước tiếp theo: tiếp tục flow hoặc gá»i view.dismiss(). Tham khảo Xá»­ lý hành động nút để biết thêm chi tiết vá» cách đóng màn hình.

Hoàn tất Ä‘iá»u hướng thanh toán web

Phương thức này được gá»i sau khi có má»™t lần thá»­ mở web paywall cho má»™t sản phẩm cụ thể. Äiá»u này bao gồm cả các lần Ä‘iá»u hướng thành công lẫn thất bại:

void flowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, 
                                           AdaptyPaywallProduct? product, 
                                           AdaptyError? error) {
}

Tham số:

Tham sốMô tả
productMột AdaptyPaywallProduct mà web paywall đã được mở. Có thể là null.
errorMá»™t đối tượng AdaptyError nếu Ä‘iá»u hướng web paywall thất bại; null nếu Ä‘iá»u hướng thành công.

Giao dịch thất bại

Phương thức này được gá»i khi má»™t giao dịch mua thất bại (ví dụ: do sá»± cố thanh toán hoặc lá»—i mạng). Nó không kích hoạt khi ngưá»i dùng tá»± há»§y hoặc khi giao dịch Ä‘ang chá» xá»­ lý—những trưá»ng hợp đó được xá»­ lý bởi flowViewDidFinishPurchase:

void flowViewDidFailPurchase(AdaptyUIFlowView view, 
                             AdaptyPaywallProduct product, 
                             AdaptyError error) {
}

Bắt đầu khôi phục

Nếu ngưá»i dùng bắt đầu quá trình khôi phục, phương thức này sẽ được gá»i:

void flowViewDidStartRestore(AdaptyUIFlowView view) {
}

Khôi phục thành công

Phương thức này là bắt buá»™c. Nếu việc khôi phục mua hàng thành công, nó sẽ được gá»i:

void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

Chúng tôi khuyến nghị đóng màn hình nếu ngưá»i dùng đã có accessLevel yêu cầu. Tham khảo chá»§ đỠTrạng thái gói đăng ký để tìm hiểu cách kiểm tra và chá»§ đỠPhản hồi các hành động nút để tìm hiểu cách đóng màn hình.

Khôi phục thất bại

Nếu việc khôi phục giao dịch mua thất bại, phương thức này sẽ được gá»i:

void flowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) {
}

Tải dữ liệu và hiển thị

Lỗi tải sản phẩm

Nếu bạn không truyá»n mảng sản phẩm trong quá trình khởi tạo, AdaptyUI sẽ tá»± động lấy các đối tượng cần thiết từ máy chá»§. Nếu thao tác này thất bại, AdaptyUI sẽ báo lá»—i bằng cách gá»i phương thức sau:

void flowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) {
}

Lá»—i view

Phương thức này là bắt buá»™c. Nó thay thế phương thức paywallViewDidFailRendering cá»§a v3: các lá»—i xảy ra trong quá trình render giao diện, cÅ©ng như các lá»—i view khác, sẽ được báo cáo thông qua lần gá»i này. Sau khi bạn implement nó, việc đóng view là tùy bạn quyết định — chúng tôi khuyến nghị đóng view khi gặp các lá»—i như vậy, đây cÅ©ng chính là hành vi mặc định tích hợp sẵn cá»§a SDK khi không có observer nào được thiết lập:

void flowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) {
  // log the error and dismiss the broken view
  view.dismiss();
}

Trong trưá»ng hợp bình thưá»ng, lá»—i hiển thị không nên xảy ra, vì vậy nếu bạn gặp phải, hãy cho chúng tôi biết.

Sự kiện phân tích

Phương thức tùy chá»n flowViewDidReceiveAnalyticEvent được dành riêng cho các sá»± kiện phân tích tùy chỉnh từ má»™t flow. Hiện tại, các flow chưa phát các sá»± kiện này đến code cá»§a bạn, vì vậy bạn chưa cần triển khai nó.

Xử lý giao dịch mua hàng trong Observer mode

Nếu bạn đã kích hoạt SDK ở chế độ Observer mode và hiển thị má»™t flow hoặc paywall do Adapty render, SDK sẽ không thá»±c hiện giao dịch mua hàng thay bạn. Khi ngưá»i dùng nhấn nút mua hàng hoặc khôi phục, SDK sẽ gá»i AdaptyUIObserverModeResolver cá»§a bạn. Xem Hiển thị flow trong Observer mode để biết cách thiết lập đầy đủ.

Xử lý các yêu cầu hệ thống

AdaptyUISystemRequestsHandler (đăng ký qua AdaptyUI().setSystemRequestsHandler(...)) được dành riêng cho các yêu cầu hệ thống từ má»™t flow: các lá»i nhắc cấp quyá»n cá»§a hệ Ä‘iá»u hành (như thông báo đẩy hoặc quyá»n truy cập camera) và yêu cầu đánh giá trên App Store. Hiện tại các flow chưa kích hoạt những yêu cầu này, nên bạn chưa cần đăng ký handler. Nếu bạn có đăng ký má»™t cái, hãy lưu ý rằng handlePermission là phương thức bắt buá»™c cá»§a class — hãy yêu cầu quyá»n bằng code cá»§a riêng bạn, sau đó trả vá» AdaptyUIPermissionResult.granted() hoặc AdaptyUIPermissionResult.denied(); còn handleAppReviewRequest là tùy chá»n.

Hướng dẫn này đỠcập đến việc xá»­ lý sá»± kiện cho các giao dịch mua, khôi phục, chá»n sản phẩm và hiển thị paywall. Bạn cÅ©ng cần triển khai xá»­ lý nút (đóng paywall, mở liên kết, v.v.). Xem hướng dẫn xá»­ lý hành động nút để biết thêm chi tiết.

Các paywall được cấu hình bằng Paywall Builder không cần thêm code để thá»±c hiện và khôi phục giao dịch mua. Tuy nhiên, chúng tạo ra má»™t số sá»± kiện mà ứng dụng cá»§a bạn có thể phản hồi. Các sá»± kiện đó bao gồm các lần nhấn nút (nút đóng, URL, chá»n sản phẩm, v.v.) cÅ©ng như thông báo vá» các hành động liên quan đến giao dịch mua được thá»±c hiện trên paywall. Hãy xem cách phản hồi các sá»± kiện này bên dưới.

Hướng dẫn này chỉ dành cho paywall Paywall Builder mới yêu cầu Adapty SDK v3.0 trở lên.

Äể kiểm soát hoặc theo dõi các sá»± kiện xảy ra trên màn hình paywall trong ứng dụng di động cá»§a bạn, hãy implement các phương thức AdaptyUIPaywallsEventsObserver và đặt observer trước khi hiển thị bất kỳ màn hình nào:

AdaptyUI().setPaywallsEventsObserver(this);

Muốn xem ví dụ thá»±c tế vá» cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu cá»§a chúng tôi, nÆ¡i minh há»a toàn bá»™ quá trình thiết lập, bao gồm hiển thị paywall, thá»±c hiện mua hàng và các chức năng cÆ¡ bản khác.

Các ví dụ vá» sá»± kiện bên dưới hiển thị các thuá»™c tính có sẵn trên má»—i đối tượng, cùng vá»›i các giá trị minh há»a trong phần chú thích.

Sá»± kiện do ngưá»i dùng tạo ra

Paywall xuất hiện

Phương thức này được gá»i khi màn hình paywall hiển thị trên màn hình.

Trên iOS, cÅ©ng được gá»i khi ngưá»i dùng nhấn nút web paywall bên trong má»™t paywall, và web paywall mở ra trong trình duyệt trong ứng dụng.

void paywallViewDidAppear(AdaptyUIPaywallView view) {
}

Paywall biến mất

Phương thức này được gá»i khi màn hình paywall bị đóng khá»i màn hình.

Trên iOS, cÅ©ng được gá»i khi má»™t web paywall mở từ má»™t paywall trong trình duyệt trong ứng dụng biến mất khá»i màn hình.

void paywallViewDidDisappear(AdaptyUIPaywallView view) {
}

Chá»n sản phẩm

Nếu má»™t sản phẩm được chá»n để mua (bởi ngưá»i dùng hoặc bởi hệ thống), phương thức này sẽ được gá»i:

void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

Bắt đầu mua hàng

Khi ngưá»i dùng bắt đầu quá trình mua hàng, phương thức này sẽ được gá»i:

void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

Hoàn tất thanh toán

Phương thức này được gá»i khi giao dịch mua thành công, ngưá»i dùng há»§y giao dịch, hoặc giao dịch Ä‘ang ở trạng thái chá» xá»­ lý:

void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, 
                                  AdaptyPaywallProduct product, 
                                  AdaptyPurchaseResult purchaseResult) {
    switch (purchaseResult) {
      case AdaptyPurchaseResultSuccess(profile: final profile):
        // successful purchase
        break;
      case AdaptyPurchaseResultPending():
        // purchase is pending
        break;
      case AdaptyPurchaseResultUserCancelled():
        // user cancelled the purchase
        break;
      default:
        break;
    }
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidFinishPurchase(AdaptyUIPaywallView view,
                                  AdaptyPaywallProduct product,
                                  AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final profile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

Chúng tôi khuyến nghị đóng màn hình trong trưá»ng hợp đó. Tham khảo Phản hồi các hành động nút để biết chi tiết vá» cách đóng màn hình paywall.

Hoàn tất Ä‘iá»u hướng thanh toán web

Phương thức này được gá»i sau khi có lần thá»­ mở web paywall cho má»™t sản phẩm cụ thể. Äiá»u này bao gồm cả các lần Ä‘iá»u hướng thành công và thất bại:

void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view, 
                                               AdaptyPaywallProduct? product, 
                                               AdaptyError? error) {
}

Tham số:

Tham sốMô tả
productMột AdaptyPaywallProduct mà web paywall được mở cho. Có thể là null.
errorMá»™t đối tượng AdaptyError nếu Ä‘iá»u hướng web paywall thất bại; null nếu Ä‘iá»u hướng thành công.
Ví dụ vỠsự kiện (Nhấn để mở rộng)
void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view,
                                               AdaptyPaywallProduct? product,
                                               AdaptyError? error) {
  // product — AdaptyPaywallProduct?:
  product?.vendorProductId; // 'premium_monthly'

  if (error == null) {
    // navigation succeeded
  } else {
    // error — AdaptyError:
    error.code;    // AdaptyErrorCode.networkFailed (2005)
    error.message; // 'Network request failed'
    error.detail;  // platform-specific underlying error, or null
  }
}

Mua hàng thất bại

Phương thức này được gá»i khi má»™t giao dịch mua thất bại (ví dụ: do lá»—i thanh toán hoặc lá»—i mạng). Nó không kích hoạt khi ngưá»i dùng chá»§ động huá»· hoặc giao dịch Ä‘ang chá» xá»­ lý — những trưá»ng hợp đó được xá»­ lý bởi paywallViewDidFinishPurchase:

void paywallViewDidFailPurchase(AdaptyUIPaywallView view, 
                                AdaptyPaywallProduct product, 
                                AdaptyError error) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidFailPurchase(AdaptyUIPaywallView view,
                                AdaptyPaywallProduct product,
                                AdaptyError error) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productPurchaseFailed (1006)
  error.message; // 'Product purchase failed.'
  error.detail;  // platform-specific underlying error, or null
}

Bắt đầu khôi phục

Nếu ngưá»i dùng khởi động quá trình khôi phục, phương thức này sẽ được gá»i:

void paywallViewDidStartRestore(AdaptyUIPaywallView view) {
}

Khôi phục thành công

Nếu việc khôi phục giao dịch thành công, phương thức này sẽ được gá»i:

void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

Chúng tôi khuyến nghị đóng màn hình nếu ngưá»i dùng đã có accessLevel yêu cầu. Tham khảo chá»§ đỠTrạng thái gói đăng ký để biết cách kiểm tra và chá»§ đỠXá»­ lý hành động nút để biết cách đóng màn hình paywall.

Khôi phục thất bại

Nếu việc khôi phục giao dịch thất bại, phương thức này sẽ được gá»i:

void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
}
Ví dụ sự kiện (Nhấp để mở rộng)
void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.receiveRestoredTransactionsFailed (1011)
  error.message; // 'Error occurred in the process of restoring purchases.'
  error.detail;  // platform-specific underlying error, or null
}

Tải dữ liệu và hiển thị

Lỗi tải sản phẩm

Nếu bạn không truyá»n mảng sản phẩm trong quá trình khởi tạo, AdaptyUI sẽ tá»± động lấy các đối tượng cần thiết từ server. Nếu thao tác này thất bại, AdaptyUI sẽ báo lá»—i bằng cách gá»i phương thức sau:

void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productRequestFailed (1002)
  error.message; // 'Unable to fetch available In-App Purchase products at the moment.'
  error.detail;  // platform-specific underlying error, or null
}

Lỗi khi hiển thị

Nếu xảy ra lỗi trong quá trình render giao diện, lỗi đó sẽ được báo cáo thông qua phương thức này. Theo mặc định (từ v3.15.2), paywall sẽ tự động bị đóng khi gặp lỗi render, nhưng bạn có thể ghi đè hành vi này nếu cần.

void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // Default behavior: view.dismiss()
  // Override with custom logic if needed, for example:
  // - Log the error
  // - Show an error message to the user
}
Ví dụ sự kiện (Nhấn để mở rộng)
void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.jsException (4105)
  error.message; // 'An exception was thrown from JS during AdaptyUI flow execution.'
  error.detail;  // platform-specific underlying error, or null

  // Default behavior: view.dismiss()
}

Trong trưá»ng hợp bình thưá»ng, các lá»—i này không nên xảy ra, vì vậy nếu bạn gặp phải, hãy cho chúng tôi biết.

ÿÿÿÿ