kotlin - 网络调用后,如何将数据从 Android 库传递到我的应用程序?

标签 kotlin callback android-jetpack-compose viewmodel android-library

我创建了一个库,可以进行网络调用并在成功时填充数据类

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/

相关文章:

Android Jetpack 撰写 : Keyboard changing from numeric to alphabets after modifying input text

kotlin - Kotlin Flow 的 GroupBy 运算符

gradle - JavaFX 模块不导出到未命名的模块

android - Kotlin Android 扩展与 Android 数据绑定(bind)库,内存使用情况

node.js - 使用 async.js 的简单控制台 I/O 失败

android - Jetpack compose 中如何让懒惰的列项占据整个高度?

java - 在不知道这种格式是什么的情况下,快速转换为 double 十进制格式字符串的方法

c - 如何将可变大小数组从 Windows 内核驱动程序传递到用户模式进程?

gwt - 如何将每个回调包装在一个地方以改进错误处理

kotlin - Alertdialog 中的 LazyColumn 在 Jetpack Compose 中显示错误