Skip to content

Latest commit

 

History

History
233 lines (181 loc) · 94.6 KB

README.zh-CN.md

File metadata and controls

233 lines (181 loc) · 94.6 KB

ComposeHooks

English | 简体中文

License Version maven-central latest releast stars Average time to resolve an issue Percentage of issues still open

Star History

Star History Chart

KMP 支持

注意:工件id为 hooks2

implementation("xyz.junerver.compose:hooks2:<latest_release>")

目前只支持有限的 target:

  • android
  • desktop(jvm)
  • iosarm64
  • iosimulatorarm64
  • iosx64

简介

项目的 idea 来自 alibaba/hooks,这是一个非常好用的React Hooks 集合。

它封装了大多数的常用操作作为自定义钩子,而 useRequest 则是重中之重,它设计的非常轻量化、可配置性高,使用简单。

于是,参照这一设计思想,采用类似的 API 名称创建了可以用在 Compose 项目的 Hooks。

目前已经实现的钩子如下:

注意:所有 use 函数同样有 remember 的签名,如果你更喜欢 Compose 的命名方式,只需要使用 rememberXxx 即可!

函数名称 效果
useRequest 管理网络请求,实现了:手动、自动触发;生命周期回调刷新mutate变更取消请求轮询Ready依赖刷新防抖节流错误重试
useAsync 封装 rememberCoroutineScope的 Hook,更方便的使用协程
useBiometric* 使用生物识别
useBoolean 管理 boolean 状态的 Hook。
useBackToFrontEffect & useFrontToBackEffect 在app进入后台,或者从后台返回前台时执行副作用;
useBatteryInfo* 获取电池电量、是否在充电的 Hook。
useBuildInfo* 获取品牌、型号、版本的 Hook。
useClipboard 方便使用剪贴板的 Hook
useContext just like react
useCountdown 一个用于管理倒计时的 Hook。
useCounter 管理计数器的 Hook。
useCreation 用来替换 useRef
useDebounce 用来处理防抖值的 Hook。
useDebounceFn 用来处理防抖函数的 Hook。
useDebounceEffect useEffect 增加防抖的能力。
useDisableScreenshot* 用来处理隐私页面禁止截图的 Hook。
useEffect just like react
useEvent 使用订阅发布模式实现轻量级的跨组件通信
useFlashlight* 方便使用闪光灯的 Hook。
Form.useForm 用于方便的控制Headless组件Form获取表单内容
Form.useWatch 用于方便在 Form 组件外追踪表单字段的 Hook。
Form.useFormInstance 用于方便的在 Form 的子组件中获取 FormInstance 实例的 Hook
useGetState 方便的使用解构声明处理状态的 Hook。
useIdel 用于监听是否处于非活动状态的 Hook。
useInterval 一个可以处理 setInterval 的 Hook。
useKeyboard 一个控制软键盘显示隐藏的 Hook。
useLatest 返回当前最新值的 Hook,可以避免在使用解构写法时的闭包问题。
useMount 只在组件初始化时执行的 Hook。
useNow 动态返回当前时间,默认:yyyy-MM-dd HH:mm:ss
useNetwork* 获取网络连接状态、类型
usePersistent 一个轻量级的持久化钩子,你需要自行实现持久化方法(默认使用内存持久化)
usePrevious 保存上一次状态的 Hook。
useReducer 一个可以在组件内使用的极简 redux
useRef just like react
useResetState 提供重置 state 方法的 Hook
useScreenInfo* 获取屏幕宽高、横竖屏等信息的 Hook。
useSelector/useDispatch 在 Compose 中就像使用redux-react那样轻松管理全局状态
useState just like react
useThrottle 用来处理节流值的 Hook。
useThrottleFn 用来处理函数节流的 Hook。
useThrottleEffect useEffect 增加节流的能力。
useToggle 用于在两个状态值间切换的 Hook。
useTimeout 用于执行定时任务
useTimestamp 动态返回当前时间戳
useUndo 用于处理撤销、重做的 Hook。
useUnmount 在组件卸载(unmount)时执行的 Hook。
useUpdate useUpdate 会返回一个函数,调用该函数会强制组件重新渲染。
useUpdateEffect useUpdateEffect 用法等同于 useEffect,但是会忽略首次执行,只在依赖更新时执行。
useVibrate* 用于使用震动反馈的 Hook

添加依赖

// groovy
implementation 'xyz.junerver.compose:hooks2:<latest_release>'
// kotlin
implementation("xyz.junerver.compose:hooks2:<latest_release>")

纯 Android 项目

纯Android项目请使用如下依赖(即工件id:hooks2-android):

implementation("xyz.junerver.compose:hooks2-android:<latest_release>")

快速开始

  1. 使用 useGetState 快速创建受控组件

    val (name, setName, getState) = useGetState("")
    OutlinedTextField(
        value = getName(), // or `name.value`
        onValueChange = setName,
        label = { Text("Input Name") }
    )
  2. 使用 useEffect 执行组件副作用

  3. 使用 useRef 创建不受组件重组影响的对象引用

    val countRef = useRef(0) // or `val countRef by useRef(0)`
    Button(onClick = {
        countRef.current += 1 // or `countRef += 1`
        println(countRef)
    }) {
        Text(text = "Ref= ${countRef.current}") // or `countRef`
    }
  4. 使用 useRequest 轻松管理网络状态

    val (dataState, loadingState, errorState, run) = useRequest(
        requestFn = WebService::login.asRequestFn(), //自行封装相应扩展函数
        optionsOf {
            manual = true
        }
    )
    val data by dataState // 使用委托获取状态的值
    val loading  by loadingState
    val error by errorState
    if (loading) {
        Text(text = "loading ....")
    }
    if (data != null) {
        Text(text = "resp: $data")
    }
    if (error != null) {
        Text(text = "error: $error")
    }
    Button(onClick = { run(arrayOf(requestBody)) }) {
        Text(text = "Login")
    }

    useRequest 通过插件式组织代码,核心代码极其简单,并且可以很方便的扩展出更高级的功能。目前已有能力包括:

    • 自动请求/手动请求
    • 轮询
    • 防抖
    • 节流
    • 错误重试
    • loading delay
    • SWR(stale-while-revalidate)
    • 缓存

更多用法请查看wiki、工程示例

使用 Live Templates

复制Live Templates目录下的hooks 文件,粘贴到C:\Users\<user-name>\AppData\Roaming\Google\AndroidStudio2023.2\templates\

你可以方便的通过 usur 来创建 useStateuseRequest的代码片段。

开启类型的内嵌提示

useRequest这样的钩子,它的返回值可以解构出很多对象、函数,开启 InlayHint 很有必要:

Editor - Inlay Hints - Types - Kotlin

混淆

如果你的项目需要使用 ProGuard,请加入下面的混淆规则:

-keep class xyz.junerver.composehooks.** { *; }
-keepclassmembers class xyz.junerver.composehooks.** { *; }
-dontwarn xyz.junerver.composehooks.**

文档

Todo:

  • KMP friendly
  • Unit Test
  • CI
  • Complete documentation

参考

  1. alibaba/hooks
  2. pavi2410/useCompose

License

Apache License 2.0