Replies: 2 comments
|
简而言之,当前的所有 hook ,都在调用处 读取了状态,而非使用处 读取状态,这可能会扩大重组范围(这也正是 修改后,所有 hook 返回 // 修改前
val (state, setState, getState) = useGetState("getState")
Column(modifier = Modifier.randomBackground().size(200.dp, 300.dp)) {
Button(onClick = {
setState(getState() + "1")
}) { Text(state) } //此处可以直接使用state的值
}
// 修改后
val (state, setState, getState) = useGetState("getState")
Column(modifier = Modifier.randomBackground().size(200.dp, 300.dp)) {
Button(onClick = {
setState(getState() + "2")
}) { Text(state.value) } //改为 state.value
}修改前整个 这样的使用方法比较繁琐的是,要写很多 将所有hook改成两步调用,就像无头表单 val controller = useController("default")
val (setState, getState) = controller
val state by useGetState(controller)
Column(modifier = Modifier.randomBackground().size(200.dp, 300.dp)) {
Button(onClick = {
setState(getState() + "2")
}) { Text(state) }
}也就是将所有函数调用由 这个设想也可以是这样: val setStateFnRef = useRef<SetValueFn<String>?>(null) //需要用那个函数就创建一个 Ref
val stateRef by useGetState("getStateWithRef") {
this.setValue = setStateFnRef // 将MutableRef 传递给 hook
}
Button(onClick = {
setStateFnRef.current?.invoke("$stateRef+") // 使用ref.current 获取到函数
}) { Text(stateRef) } 实验性质的代码可见:useGetState |
0 replies
|
最后 hooks 选择了 比如现在在代码中我更喜欢使用 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
在hooks2的正式版发布之前,我有些犹豫要不要采取State包装来减少重组次数
从个人角度出发,我对compose重组持开放态度,通过合适的组合,以及编译器插件的跳过重组,即使每次状态变化都重组,理论上不会造成太多的性能损耗。
现在的hooks返回值都使用元组数据类包裹,使用时直接解构获取状态的值,就开发使用而言,这十分方便,缺点也很明确,会带来更多的重组。
只需要将返回值变成
State<T>,就能改变这一现状,但带来的就是使用上的不便,你需要大量的使用state.value,也有违项目之初减少模板代码的初衷在分支
feat_stated中,我尝试了将大部分hook进行了State包装,我不确定是否应该将其合并入主线。如果愿意提供你的使用观点、改进意见,我将不胜感激
All reactions