Comments (3)
This is a problem with real runs, not just tests. The measuring and layout gets into an infinite remeasure/relayout loop on every frame.
Reproduces in 1.6.x, but not in 1.5.12
from compose-multiplatform.
Reproducer:
fun main() = singleWindowApplication {
val state = remember { mutableStateOf(1) }
Layout(
measurePolicy = { measurables, constraints ->
val measurable = measurables.first()
val placeable = measurable.measure(constraints)
val prevValue = Snapshot.withoutReadObservation {
state.value
}
state.value = prevValue+1
layout(100, 100) {
state.value // Read the state value!
placeable.placeRelative(0, 0)
}
},
content = {
Text("Hello")
}
)
}
from compose-multiplatform.
What happens here is:
- The state is written in the measure phase, and
GlobalSnapshotManager
receives a write notification and schedules callingSnapshot.sendApplyNotifications()
, but it's not yet called because the main thread is busy. - The layout phase happens, which reads the state, marking the scope as having read it.
- When the rendering of the current frame (
BaseComposeScene.render()
) completes, the GSM callsSnapshot.sendApplyNotifications()
, the scope reports that it has read that state, so the scope is marked as invalid. - The next time
BaseComposeScene.render()
is called, the whole thing repeats from 1.
This appears to be a bug, because the state is read after it has been written to, so it should not mark the scope as invalid.
There are several differences in Android that "cover" for this, preventing the infinite relayout:
- Between the layout and drawing phases, Android's Choreographer flushes the tasks scheduled by the main dispatcher, which includes the GSM. This means that the scope is marked as invalid before the drawing phase.
- Android's drawing phase (
AndroidComposeView.dispatchDraw
) actually callsmeasureAndLayout
again before drawing. This causes the layout scope to be executed again, and its invalidation state is cleared.
Additionally, in CMP, we don't mark nodes only for layout. Our Owner.onRequestRelayout
implementation actually marks the node as needing to be measured. So even if we add Snapshot.sendApplyNotifications()
and doLayout()
between layout and draw, doLayout()
will end up executing both measure and layout on the node, bringing us back to square one.
from compose-multiplatform.
Related Issues (20)
- Build failed when building native macOS app after added compose resources. HOT 1
- Encountered error after upgrading from 1.6.10-beta01 to 1.6.10-rc01 HOT 4
- Cannot boot for Desktop after upgrade to 1.6.10* HOT 4
- When will proguard be upgraded to 7.4? It seems that it cannot support jdk 21 now. HOT 2
- iOS - Scroll does not work at all when touch starts on a UIKitView inside eg a LazyColumn HOT 9
- Link issue on iOS (undefined symbol _OBJC_CLASS_$_UITextLoupeSession) with 1.6.10-rc03 HOT 1
- Request for ability to opt-out of resource tasks added in latest compose plugin (1.6.10-rc03) HOT 2
- Request for opting out of generating skiko wasm / js resources in latest compose plugin (1.6.10-rc03)
- Material3 Icon and Text vertical alignment is abnormal. HOT 1
- Support 1Password Universal Autofill on Mac
- RuntimeError: illegal cast for wasmJs with SparseArrayCompat.internalGet
- Android Composables not transformed by compiler in 1.6.10 HOT 5
- 1.6.10-rc03 version error HOT 3
- 1.6.10: MPP with JS but without WASM target: Cannot determine the version of Skiko for Compose '1.6.10 HOT 5
- Compose for Desktop doesn't emit lifecycle events, only states HOT 4
- [Web/Wasm] TextField not opening keyboard in mobile browser HOT 1
- String resource mapping web 1.6.10-rc03
- Change position of MenuBar HOT 2
- Compose Desktop IDE Plugin doesn't show when using Jetbrains Preview annotation HOT 1
- ImageViewer example: Android application crash due to missing Android Manifest FileProvider HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from compose-multiplatform.