android-jetpack-compose - 何时更喜欢通过状态与 T 本身
问题描述
在任何情况下,人们应该更喜欢这些选择中的一种而不是另一种吗?
@Composable
fun <T> Foo(data: State<T>) { ... }
相比
@Composable
fun <T> Foo(data: T) { ... }
或者对于可变状态,
@Composable
fun <T> Foo(data: MutableState<T>) { ... }
相比
@Composable
fun <T> Foo(data: T, setData: (T) -> Unit) { ... }
显然,拥有 setData lambda 的一个优点是您可以拦截 set 操作,但从 Compose 的角度来看,我更感兴趣。对 compose 编译器或重组将如何工作有任何影响吗?
解决方案
我会比较喜欢
@Composable
fun <T> Foo(data: T) { ... }
和
@Composable
fun <T> Foo(data: T, setData: (T) -> Unit) { ... }
在他们各自的柜台上。原因是:
- 对于第一个,如果您
State
将来必须更改数据结构,则必须Composable
无缘无故地重构所有内容,因为State<T>
不会为您的Composable
. 此外,在谷歌的示例项目和现场演示中,我一直看到他们使用T
- 对于第二个,假设您正在使用
MutableState
两个或多个可组合项,例如ComposableA
和,如果他们进行任何可能在某些情况下产生问题的ComposableB
更新,那么这两个可组合项都可以改变彼此的状态。MutableState
如果ComposableP
是他们最不常见的父级,我宁愿MutableState
在父级中声明并将T
和回调传递给ComposableA
andComposableB
。你可以比较一下State Hoisting
推荐阅读
- azure-web-app-service - asp.net-core-signalr 无法保持连接超过一分钟左右
- firebase - 缓慢、不可靠的 Firebase 云函数
- c# - 使用凭据调用命令
- oop - 在 Perl 6 中继承私有属性
- ruby-on-rails - Puma 发现了这个错误:无效的选项键:raise_on_unfiltered_parameters
- javascript - 如何将数字数组映射到对象数组中的属性?
- sql - oracle 版本从 11.2.0.1 更新到 11.2.0.4 后撤消表空间正在增长
- android - Android Kotlin Retrofit + SimpleXMLConverter ElementList 解析不正确
- c# - C# 对列表中的多个数字进行排序。按第二个字符串排序
- jquery - 如何从 jQuery.steps 返回 AJAX 调用的结果?