我创建了一个库,可以进行网络调用并在成功时填充数据类
data class someData(
val id: String,
val name: String,
)
我正在使用 moshi 和 Retrofit 进行网络调用 一旦网络调用成功并且数据类被填充,我需要将其发送到应用程序模块
当我们使用内部数据类和内部 View 模型时,这是如何完成的? 我的库 View 模型应该将数据传递给应用程序 View 模型
应用程序使用按钮来启动库 该库有一个带有 jetpack compose 的 UI,它收集信息并进行必要的网络调用,并在成功时填充数据类 库如何关闭撰写 UI 并返回数据?
最佳答案
Google 推荐的新“标准做法”方法是在您的库中创建 ActivityResultContract。
首先,您需要使数据类可Parcelable。使用 Parcelize ( instructions here ) 可以最轻松地完成此操作。
@Parcelize
data class SomeData(
val id: String,
val name: String,
)
在图书馆的事件中,当您创建了 SomeData 类的实例后,您应该在完成事件之前将其设置为事件结果:
val resultIntent = Intent().apply {
putExtra("someData", someDataInstance)
}
setResult(Activity.RESULT_OK, resultIntent)
finish()
然后为您的库创建一个合约,启动您的库的事件,并从事件的结果中提取您的数据类。在此示例中,库不需要输入,因此我仅使用 Unit 作为输入类型。
请注意,返回类型应该可为空,以处理用户在等待获取结果之前退出库事件的情况。
class FetchSomeData: ActivityResultContract<Unit, SomeData?>() {
override fun createIntent(context: Context, unit: Unit) =
Intent(context, MyLibraryActivity::class.java)
override fun parseResult(resultCode: Int, result: Intent?) : SomeData? {
if (resultCode != Activity.RESULT_OK) {
return null
}
return result?.getParcelableExtra("someData")
}
}
然后,您的库的用户将在类属性中注册合约,并在一次按钮单击中使用它,如 contracts documentation 中所述。 。例如:
private val fetchSomeData = registerForActivityResult(FetchSomeData()) { someData: SomeData? ->
if (someData == null) {
// action was canceled
} else {
// do something with someData
}
}
//...
someButton.setOnClickListener {
fetchSomeData.launch()
}
关于kotlin - 网络调用后,如何将数据从 Android 库传递到我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74395509/