在Compose中使用useRequest轻松管理网络请求

还记得: 使用 ahooks 中的 useRequest 轻松管理React中的网络请求 这篇文章么?

现在我将 ahooks 带到了 Compose 开发中!

在Compose项目中,你是如何进行网络请求,管理状态的?ViewModel?还是 LaunchedEffect 配合 State

他们看起来都不够优雅,我们真的需要在 Compose 中创建这么多VM么?

还有更优雅的方式么?

来了解一下 junerver/ComposeHooks 吧,也许它会让你在 Compose 开发中更加得心应手,更多的专注于组件而非复杂的状态管理。

来试试 useRequest

一句话发起请求:

kotlin 复制代码
val (data, loading, error, request) = useRequest(::fn.asSuspendNoopFn())

useRequest 的第一个参数是一个 suspend 函数,在组件初次加载时,会自动 触发该函数执行。同时自动管理该函数的 loading , data , error 等状态。

手动触发/自动触发

useRequest 的第二个参数是配置选项,我们可以使用optionsOf轻松的自定义请求的相关配置,例如设置手动触发:

kotlin 复制代码
// 这是一个模拟网络请求的suspend函数
suspend fun fn(s1: String, s2: String): String {
    delay(2_000)
    return "response: result success+${Random.nextInt(20)}"
}

@Composable
fun TestRequestComponent() {
    val (data, loading, error, request) = useRequest(
        requestFn = ::fn.asSuspendNoopFn(), //普通的挂起函数需要转换成钩子的参数
        optionsOf {
            manual = true
        })
    Button(onClick = { request("1", "2") }) {
        Text(text = "手动请求")
    }
}

此时我们的请求不再自动执行,当需要发起请求时直接调用 request,并传递参数。

通过对 useRequest 返回值解构声明或得到的 request 函数是一个普通函数,我们可以直接在组件中使用,无需关心协程作用域的问题。

manual 参数的默认值是false,如果你需要自动请求,那么直接忽视即可。

错误重试

当我们的网络请求出错时,一般都需要进行错误重试的工作,在 ComposeHooks 中这个操作变得非常简单。

对上面的配置增加一行代码,配置最大重试次数:retryCount = 3,你的请求函数会在出错后自动重试。

kotlin 复制代码
val (data, loading, error, request) = useRequest(
    requestFn = ::fn.asSuspendNoopFn(),
    optionsOf {
        retryCount = 3
    })

轮询

同样只需要添加一行代码:pollingInterval = 2.seconds,现在你的请求将会每隔两秒自动发出

kotlin 复制代码
val (data, loading, error, request) = useRequest(
    requestFn = ::fn.asSuspendNoopFn(),
    optionsOf {
        pollingInterval = 2.seconds
    })

防抖、节流

只需要简单的配置 debounceOptionsthrottleOptions 参数,即可为 request 函数增加防抖或节流的效果,非常简单方便。

kotlin 复制代码
val (data, loading, error, request) = useRequest(
    requestFn = ::fn.asSuspendNoopFn(),
    optionsOf {
        manual = true
        debounceOptions = optionsOf { 
        	wait = 2.seconds //两秒防抖间隔
        }
    })

探索更多

项目开源地址:junerver/ComposeHooks

MavenCentral:hooks

kotlin 复制代码
implementation("xyz.junerver.compose:hooks:1.0.1")

欢迎使用、勘误、pr。

相关推荐
QING6186 小时前
Jetpack Compose 条件布局与 Layout 内在测量详解
android·kotlin·android jetpack
Lei活在当下18 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
bqliang1 天前
Jetpack Navigation 3:领航未来
android·android studio·android jetpack
用户69371750013844 天前
🚀 Jetpack MVI 实战全解析:一次彻底搞懂 MVI 架构,让状态管理像点奶茶一样丝滑!
android·android jetpack
俩个逗号。。7 天前
ViewPager+Fragment 切换主题崩溃
android·android studio·android jetpack
alexhilton9 天前
Compose CameraX现已稳定:给Composer的端到端指南
android·kotlin·android jetpack
在狂风暴雨中奔跑11 天前
使用 Compose 权限请求模板高效搭建应用权限流程
android jetpack
H10015 天前
SharedFlow和StateFlow的方案选择-屏幕旋转设计
android jetpack
alexhilton16 天前
理解retain{}的内部机制:Jetpack Compose中基于作用域的状态保存
android·kotlin·android jetpack
Coffeeee16 天前
Labubu很难买?那是因为还没有用Compose来画一个
前端·kotlin·android jetpack