English | 简体中文
注意:工件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>")
-
使用
useGetState
快速创建受控组件val (name, setName, getState) = useGetState("") OutlinedTextField( value = getName(), // or `name.value` onValueChange = setName, label = { Text("Input Name") } )
-
使用
useEffect
执行组件副作用 -
使用
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` }
-
使用
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
目录下的hooks
文件,粘贴到C:\Users\<user-name>\AppData\Roaming\Google\AndroidStudio2023.2\templates\
你可以方便的通过 us
、ur
来创建 useState
、useRequest
的代码片段。
像useRequest
这样的钩子,它的返回值可以解构出很多对象、函数,开启 InlayHint 很有必要:
Editor - Inlay Hints - Types - Kotlin
如果你的项目需要使用 ProGuard,请加入下面的混淆规则:
-keep class xyz.junerver.composehooks.** { *; }
-keepclassmembers class xyz.junerver.composehooks.** { *; }
-dontwarn xyz.junerver.composehooks.**
- 在Compose中使用useRequest轻松管理网络请求
- 在Compose中使用状态提升?我提升个P...Provider
- 在Compose中父组件如何调用子组件的函数?
- 在Compose中方便的使用MVI思想?试试useReducer!
- 在Compose中像使用redux一样轻松管理全局状态
- 在Compose中轻松使用异步dispatch管理全局状态
- 在Compose中管理网络请求竟然如此简单!
- 在Jetpack Compose中优雅的使用防抖、节流
KMP friendly- Unit Test
- CI
- Complete documentation