[英]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
}
}
解釋代碼:
LiveData
。 但我真的建議您StateFlow
。 在這里查看更多。ActivityResultContact
寫入第三方庫。 我寫了一篇關於(它是葡萄牙語,但我想你可以把它翻譯成英語的想法)。orderCreation
發生變化, LaunchedEffect
塊將運行,然后您可以使用launcher.launch()
啟動第三方活動(此調用的參數在您的ActivityResultContract
中定義)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.