如何让 LaunchedEffect 运行一次并且不再运行?

Yur*_*itz 7 android kotlin android-jetpack-compose jetpack-compose

我知道它LaunchedEffect(key)是在组合开始时执行的,并且在更改时也会被取消并重新执行key。但是,我希望它只执行一次,不再执行,我正在使用以下解决方法,但我觉得我错过了一些东西:

if (!launchedBefore) {
   LaunchedEffect(null) {
      //stuff

      launchedBefore = true
   }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作得很好。但这感觉像是一个捉襟见肘的解决方法,同时可以做一些更简单的事情。我是否误解了 LaunchedEffect 的完整工作原理?

我尝试使用nullUnit作为键,因为它们从未改变,但每次组合发生时都会执行代码。

小智 8

LaunchedEffect(Unit)应该在组合开始时只执行一次。在重组期间它会被重新执行的唯一一次是如果它在之前的重组之一期间从视图树中删除。一个例子是,如果您将其置于其值在某个时刻发生变化的条件中(在if块、when块或任何其他条件语句中)。

我认为重组的问题在于代码片段中未显示的代码的其他部分。检查是否LaunchedEffect嵌套在可能导致其在重组后执行的条件块中。