Skip to content

Commit 2ff38bf

Browse files
committed
🩹: optimization
1 parent a769241 commit 2ff38bf

4 files changed

Lines changed: 27 additions & 6 deletions

File tree

app/src/main/java/xyz/junerver/composehooks/route/routes.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package xyz.junerver.composehooks.route
22

33
import androidx.compose.runtime.Composable
4-
import xyz.junerver.composehooks.HomeScreen
4+
import xyz.junerver.composehooks.example.HomeScreen
55
import xyz.junerver.composehooks.example.RequestExampleList
66
import xyz.junerver.composehooks.example.UseAsyncExample
77
import xyz.junerver.composehooks.example.UseAutoResetExample
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package xyz.junerver.compose.hooks
22

3-
import android.annotation.SuppressLint
43
import androidx.compose.runtime.Composable
54
import androidx.compose.runtime.LaunchedEffect
5+
import xyz.junerver.compose.hooks.utils.unwrap
66

77
/*
88
Description: Alias for [LaunchedEffect]
@@ -12,7 +12,7 @@ import androidx.compose.runtime.LaunchedEffect
1212
Version: v1.0
1313
*/
1414

15-
@SuppressLint("ComposableNaming")
1615
@Composable
17-
fun useEffect(vararg deps: Any?, block: SuspendAsyncFn) =
18-
LaunchedEffect(keys = deps, block = block)
16+
fun useEffect(vararg deps: Any?, block: SuspendAsyncFn) {
17+
LaunchedEffect(keys = unwrap(deps), block = block)
18+
}

hooks/src/main/kotlin/xyz/junerver/compose/hooks/useState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ fun <T> useState(default: T & Any): MutableState<T & Any> {
7676
* @receiver
7777
*/
7878
@Composable
79-
fun <T> useState(vararg keys: Any, factory: () -> T): State<T> = remember(keys = keys) {
79+
fun <T> useState(vararg keys: Any?, factory: () -> T): State<T> = remember(keys = keys) {
8080
derivedStateOf(factory)
8181
}
8282

hooks/src/main/kotlin/xyz/junerver/compose/hooks/utils/ext.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package xyz.junerver.compose.hooks.utils
22

3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.State
5+
import androidx.compose.runtime.snapshots.SnapshotStateList
36
import kotlinx.datetime.Clock
47
import kotlinx.datetime.Instant
8+
import xyz.junerver.compose.hooks.Ref
9+
import xyz.junerver.compose.hooks.observeAsState
510

611
/*
712
Description:
@@ -13,3 +18,19 @@ import kotlinx.datetime.Instant
1318

1419
internal val currentTime: Instant
1520
get() = Clock.System.now()
21+
22+
/**
23+
* 直接使用[State]、[Ref] 作为依赖项无法触发副作用闭包执行,只有状态值、props入参变化才能正常触发,
24+
* 所以需要执行解包装操作,简化对副作用使用时的心智负担。
25+
*
26+
* 注意:只能监听 [Ref] 实例,如果你使用 `by` 关键字进行了对 [Ref] 的委托,将无法通过 [useEffect] 监听。
27+
*/
28+
@Composable
29+
internal inline fun unwrap(deps: Array<out Any?>) = deps.map {
30+
when (it) {
31+
is State<*> -> it.value
32+
is Ref<*> -> it.observeAsState().value
33+
is SnapshotStateList<*> -> it.toList()
34+
else -> it
35+
}
36+
}.toTypedArray()

0 commit comments

Comments
 (0)