(#) Flow operator functions should not be invoked within composition
!!! ERROR: Flow operator functions should not be invoked within composition
This is an error.
Id
: `FlowOperatorInvokedInComposition`
Summary
: Flow operator functions should not be invoked within composition
Severity
: Error
Category
: Correctness
Platform
: Any
Vendor
: Jetpack Compose
Identifier
: androidx.compose.runtime
Feedback
: https://issuetracker.google.com/issues/new?component=612128
Min
: Lint 8.0 and 8.1
Compiled
: Lint 8.0 and 8.1
Artifact
: [androidx.compose.runtime:runtime-android](androidx_compose_runtime_runtime-android.md.html)
Since
: 1.5.0
Affects
: Kotlin and Java files and test sources
Editing
: This check runs on the fly in the IDE editor
Implementation
: [Source Code](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetector.kt)
Tests
: [Source Code](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetectorTest.kt)
Copyright Year
: 2021
Calling a Flow operator function within composition will result in a new
Flow being created every recomposition, which will reset
collectAsState() and cause other related problems. Instead Flow
operators should be called inside `remember`, or a side effect such as
LaunchedEffect.
(##) Example
Here is an example of lint warnings produced by this check:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~text
src/androidx/compose/runtime/foo/test.kt:15:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:16:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:21:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:22:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:23:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:28:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:29:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:30:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:40:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:41:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:42:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:46:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:47:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:48:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:55:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:56:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:57:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
src/androidx/compose/runtime/foo/test.kt:62:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.map { true }
---
src/androidx/compose/runtime/foo/test.kt:63:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.customOperator(true)
--------------
src/androidx/compose/runtime/foo/test.kt:64:Error: Flow operator
functions should not be invoked within composition
[FlowOperatorInvokedInComposition]
.drop(0)
----
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is the source file referenced above:
`src/androidx/compose/runtime/foo/test.kt`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
package androidx.compose.runtime.foo
import androidx.compose.runtime.Composable
import kotlinx.coroutines.flow.*
val emptyFlow: Flow