簡體   English   中英

如何處理 Jetpack Compose 中的回調?

[英]How to handle callbacks in Jetpack compose?

我正在將我的多活動應用程序遷移到單活動應用程序。

在活動中,我正在觀察來自視圖 model 的實時數據。當可觀察觸發時,我從第三方 SDK 開始支付活動,如下所示。


onCreate() {
  viewmodel.orderCreation.observe {
    thirdpartysdk.startPaymentWithThisOrder(context)
  }
}


onActivityResult() {
  // use payment result
}

因為我現在將使用 Composable,

@Composable
fun PaymentScreen(onOrderCreated: () -> Unit) {
   val orderCreation by viewmodel.orderCreation.observeAsState()
   
   // How to use order creation once here to call onOrderCreated here only once as composable is called again and again
}

這是我的建議:

在您的視圖模型中,創建一個 function 來重置您的orderCreation 還有一個字段+function,用來存放支付結果。

就像是:

fun resetOrderCreation() {
    _orderCreation.value = null
}

fun paymentResult(value: SomeType) {
    _paymentResult.value = value
}

現在,在您的可組合項中,您可以執行以下操作:

@Composable
fun PaymentScreen(onOrderCreated: () -> Unit) {
    // 1
    val orderCreation by viewmodel.orderCreation.observeAsState()
    var paymentResult by viewmodel.paymentResult.observeAsState()
    // 2  
    val launcher = rememberLauncherForActivityResult(
        PaymentActivityResultContract()
    ) { result ->
        viewModel.paymentResult(result)
    }

    ...
    // 3
    LaunchedEffect(orderCreation) {
        if (orderCreation != null) {
            launcher.launch()
            viewModel.resetOrderCreation()
        }
    }
    // 4
    if (paymentStatus != null) {
        // Show some UI showing the payment status
    }
}

解釋代碼:

  1. 我假設您正在使用LiveData 但我真的建議您StateFlow 在這里查看更多。
  2. 您可能需要將ActivityResultContact寫入第三方庫。 我寫了一篇關於(它是葡萄牙語,但我想你可以把它翻譯成英語的想法)。
  3. 一旦orderCreation發生變化, LaunchedEffect塊將運行,然后您可以使用launcher.launch()啟動第三方活動(此調用的參數在您的ActivityResultContract中定義)。
  4. 最后,當付款狀態發生變化時,您可以向用戶顯示不同的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM