- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
虽然我了解或自认为了解,但 Jet-pack Compose 中有哪些副作用。
It's any work done in composable which escapes the scope of the composable function
我理解做一些事情,比如 I/O 操作或在函数范围之外改变一个变量,提供引用而不清除它(内存泄漏),或者改变一个不可组合状态的局部变量——这些都是副作用,因为它们可能会由于重组而导致意外行为和泄漏,重组是不确定的并且可以运行多次。为了处理副作用,我们有效果处理程序。
考虑到以上所有内容,我需要在一些情况下弄清楚
例如
@Composable
fun MyComposable(
viewModel:MyViewModel,
launchSomeActivity:()->Unit
){
var state by remember { mutableStateOf("") }
state = "some string" // not a side-effect?
viewModel.someStringObject = "a" // it's a side-effect?
launchSomeActivity() // it's a side-effect?
when(val screenState = viewModel.screenState.collectAsState().value){
is ScreenState.Success -> launchSomeActivity() // not a side-effect. why?
is ScreenState.Error -> state="some String" // not a side-effect. why?
}
}
我还记得在某处读过,触发回调的副作用,例如 onClick
因为它总是在 UI 线程上执行,或者说从 ViewModel 调用一些 lambda。
是否也想了解上述场景,以及它如何防止副作用、调用 lambda 或回调?
最佳答案
SideEffect
并不意味着其他任何东西都不是副作用。它是应该考虑的事情和组合的影响但没有或不能在节点树中表达的逃生舱口。
例如,Dialog
使用 SideEffect
将 Dialog
参数中的对话框属性、布局方向和关闭回调传递给 Android 对话框作为组合的结果创建。这给人一种错觉,即 Dialog
本身就是 Compose 的一部分,即使它使用 View 系统创建对话框也是如此。
一般来说,组合函数应该只读取状态,而不是修改状态。如果它确实修改了状态,那么它应该只修改在组合期间创建的状态,并由创建状态的可组合函数直接调用的可组合函数使用;并且仅在任何 child 阅读状态之前,而不是之后。
Side-effect - in case of mutating object, does it holds true for any object other than compose object? As in compose states (mutableStateOf etc..) doesn't lead to side-effects? Why?
可组合函数应该只读取这些对象中的状态;它不应该修改这个状态。对于可观察状态,例如 mutableStateOf
,Compose 会观察此状态的变化,并将安排读取状态的可组合函数的重组。您可以使用 mutableStateOf
来执行副作用;你不应该。
Why callbacks/state/event hoisting to your activity/fragment/viewmodel,does not lead to side-effect?
如果使用得当,不会,不会;不是从 Compose 的角度来看。组合函数是从它们读取的数据到用户界面树的转换函数。随着 View 模型的更改,将逐步重新评估转换以生成 View 模型的新状态所暗示的 UI。状态提升允许应用程序的较高级别部分在数据应如何存储和/或验证方面具有更多上下文,以控制应用程序较低级别、更通用部分的状态。已提升状态的组件不应该写入状态。如果他们需要更改状态,则应使用新的所需状态或对要进行的更改的描述调用事件处理程序(例如 DeleteCustomer #1234
)。实际更改提升状态应该由提供的事件处理程序决定。
state = "some string" // not a side-effect?
不,不是。它初始化 state
,因为 state 没有逃脱组合被认为是组合的一部分。这不是推荐的做法,但它不是副作用。
launchSomeActivity()
这是一个副作用,应该在 LaunchEffect
中执行,它将在一个范围内启动协程,当组合中不再调用组合函数时,该范围将自动取消。
is ScreenState.Success -> launchSomeActivity() // not a side-effect. why?
这是出于相同原因和相同答案的副作用。
is ScreenState.Error -> state="some String" // not a side-effect. why?
这不是上面提到的副作用(即副作用意味着它对组合之外的东西有影响,但事实并非如此),但是,如果 state
已经read then 它被认为是向后写并且非常不鼓励,因为它可能导致重复组合,也许无限期地重复;因为任何已经读取过的内容都可能会重新安排再次执行。
关于android - JetPack Compose 中的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71291835/
有没有一种简单的方法可以在 compose 中删除开关的内部填充? 我尝试在其修饰符中提供 0.dp,但它并没有摆脱内部填充 Switch( modifier = Modifier
我正在使用底部导航栏,每个菜单都会将用户导航到特定的可组合屏幕。我使用导航库来管理它们之间的导航。 我为所有可组合项使用一个通用的 ViewModel。我在其中一个可组合项中使用惰性列,当我通过单击底
我在撰写屏幕中有一个 TextField 和一个 ModalDrawer。我想在用户打开抽屉时关闭软键盘,但我一直无法弄清楚如何。在 ModalDrawer afaik 中没有触发 onOpened
我一直在搜索文档,但找不到确认。有谁知道navigation和 compose来自 Android Jetpack 的组件彼此兼容吗? 我知道Jetpack Compose尚未准备好生产,仅处于开发人
我正在尝试将我的应用程序更新为新的撰写版本,但它给了我一个我不知道如何修复的错误。当我运行时,错误仍然存在于我的运行中。我的旧项目正常工作,但我想要的是更改版本,如果有人可以帮助我,我将不胜感激
我有这样的用户界面: val scrollState = rememberScrollState() Column( modifier = Modifier
有没有办法在 Compose 中的列表(列/行)更改上获得动画效果,看起来类似于带有 setItemAnimator 的 recyclerview 动画? 最佳答案 目前没有办法用 LazyColum
我想隐藏状态栏,我已经使用伴奏库做到了这一点: val systemUiController = rememberSystemUiController() systemUiController.isS
我想隐藏状态栏,我已经使用伴奏库做到了这一点: val systemUiController = rememberSystemUiController() systemUiController.isS
使用 Android View,我可以像这样将焦点移动到 View: fun View.requestAccessibilityFocus() { requestFocus() sen
我正在尝试在我的 Android 应用程序中使用 Jetpack Compose 播放视频。要使用 ExoPlayer 进行流式传输,但我真的不明白如何实现全屏按钮,有什么建议吗? @Composab
通常可以使用修饰符将不同的形状分配给可组合项,但在此可组合项中没有这样做。 我希望图像中标记的部分是一个圆圈 你可以在下面看到我写的代码 @Composable fun StandardCheckbo
Jetpack compose 提供了很多 Material 组件,如 TextField 等。 然而,要构建类似文件编辑器的东西,可以使用什么样的组件来支持多行文本任意长的文本操作,如选择文本、剪切
我们可以使用 Scaffold 在 JetpackCompose 中使用抽屉导航如下 Scaffold( drawerContent = { Text(text ="Drawer") } )
对不起,我几乎不会说英语。 机器翻译: 如何为 Jetpack Compose 设置阴影颜色? 我可以设置阴影,但它们很难看。 Jetpack Compose 代码: Surface( mod
我正在开发一个小型 jetpack-compose 演示聊天应用程序。所以我需要在底部有一个带有 TextField 和一个要发送的按钮的栏,就像在 WhatsApp 中一样......我认为最好使用
我正在 Jetpack Compose Desktop 中创建一个应用程序,它将接受用户输入,在用户重新打开应用程序后,输入值应该在那里。我的意思是,在用户重新打开应用程序后,用户给定的数据应该在那里
描述 在 SnackbarHostState 上调用 showSnackbar 并传递 duration 参数不会关闭 Snackbar。协程似乎无限期暂停。 重现步骤: val snackbarHo
谁能建议如何在 Jetpack Compose Navigation 的不同部分共享 ViewModel? 根据文档,viewModels 通常应该在使用事件范围的不同组合函数中共享,但如果在导航内部
我想在相机预览上方创建一个半透明图层,如下所示: 我在我的应用程序中完成了相机预览,我想要的只是在预览上有一个半透明的图层,带有剪裁的卡片形状,如图所示(带有圆角)。 所以:全屏相机预览,上面有一个全
我是一名优秀的程序员,十分优秀!