gpt4 book ai didi

Android Compose 副作用

转载 作者:行者123 更新时间:2023-12-04 23:47:22 33 4
gpt4 key购买 nike

这2个有什么区别?一个使用 SideEffect,另一个不使用。
“每次成功重组都会调用 SideEffect”,但如果没有 SideEffect,它也会在每次重组时运行。

@Composable
fun BackHandler(
backDispatcher: OnBackPressedDispatcher,
enabled: Boolean = true, // Whether back events should be intercepted or not
onBack: () -> Unit
) {
val backCallback = remember { /* ... */ }

// On every successful composition, update the callback with the `enabled` value
// to tell `backCallback` whether back events should be intercepted or not
SideEffect {
backCallback.isEnabled = enabled
}

/* Rest of the code */
}

@Composable
fun BackHandler(
backDispatcher: OnBackPressedDispatcher,
enabled: Boolean = true, // Whether back events should be intercepted or not
onBack: () -> Unit
) {
val backCallback = remember { /* ... */ }

backCallback.isEnabled = enabled

/* Rest of the code */
}

最佳答案

不同之处在于“成功”一词。调用 BackHandler 的效果即使它被调用,也不能保证它是结果组合的一部分(可以丢弃它的方法很少见且难以描述)。 SideEffect确保 lambda 仅在执行时才执行。
一个 SideEffect确保,

  • 仅当封闭范围的效果实际上是结果组合的一部分时才应用它。
  • 在组合被实现为结果组合后调用它(即 LayoutNode 已创建并成功插入到布局树中)。这在内部很重要(对于诸如焦点之类的事情),但在框架内部之外可能没有那么多应用程序。
  • 这是一个单独的快照,而不是为合成拍摄的快照,任何可观察到的变化都会影响下一个合成,而不是这个。
  • 它总是在应用程序的线程上调用(即 LayoutNode s 的主线程)。

  • 只有上面的(1)是相关的。
    可组合函数具有未被 SideEffect 封装的副作用被认为是不好的做法。或类似的构造打破了可组合函数对于组合而言是引用透明的假设。

    关于Android Compose 副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68490101/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com