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 |
Beta Was this translation helpful? Give feedback.
-
最后 hooks 选择了 比如现在在代码中我更喜欢使用 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
在hooks2的正式版发布之前,我有些犹豫要不要采取State包装来减少重组次数
从个人角度出发,我对compose重组持开放态度,通过合适的组合,以及编译器插件的跳过重组,即使每次状态变化都重组,理论上不会造成太多的性能损耗。
现在的hooks返回值都使用元组数据类包裹,使用时直接解构获取状态的值,就开发使用而言,这十分方便,缺点也很明确,会带来更多的重组。
只需要将返回值变成
State<T>
,就能改变这一现状,但带来的就是使用上的不便,你需要大量的使用state.value
,也有违项目之初减少模板代码的初衷在分支
feat_stated
中,我尝试了将大部分hook进行了State包装,我不确定是否应该将其合并入主线。如果愿意提供你的使用观点、改进意见,我将不胜感激
Beta Was this translation helpful? Give feedback.
All reactions