- 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/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!