The same Button, in Jetpack Compose

One contract, a Compose backend

Same lesson as the sensor course's second half: the JS <Button> doesn't change; you write a second native adapter. On Android the durable, public way to render Compose from an Expo view is to host a ComposeView inside an ExpoView and drive it with setContent { … }.

The reactivity model differs from iOS in an instructive way. SwiftUI gave you automatic re-render via @ObservedObject + @Field. In Compose you hold mutableStateOf, update it from a Prop setter, and Compose recomposes when that state changes.