Open
Description
Description
I have an React Native app (using Expo) that queues up a Cmd in the init function passed to Program.mkProgram. The Cmd does get executed in update before the first view call, but, weirdly, view gets the previous state.
Repro code
I made a minimal repro, following the counter example, modified to include a Cmd at startup:
let init () = 0, Cmd.ofMsg Increment
let update (msg:Msg) count =
console.log "IN UPDATE"
match msg with
| Increment -> count + 1, Cmd.none
| Decrement -> count - 1, Cmd.none
let Render model dispatch =
console.log $"IN RENDER, state = {model}"
JSX.jsx $"""
import {{View, Text, Button}} from 'react-native'
<View>
<Text>{model}</Text>
<Button title="Increment" onPress={fun _ -> dispatch Increment} />
<Button title="Decrement" onPress={fun _ -> dispatch Decrement} />
</View>
""" |> toReact
Program.mkProgram init update Render
|> Program.withConsoleTrace
|> Program.withReactNative "main"
|> Program.run
Expected and actual results
I expected Render to show a '1'; instead, it shows '0'.
Here's the trace:
LOG Initial state: 0
LOG Updated subs: []
LOG New message: "Increment"
LOG IN UPDATE
LOG Updated state: 1
LOG Updated subs: []
LOG IN RENDER, state = 0
This code works when run on the web (using React Native Web) with
Program.mkProgram init update Render
|> Program.withConsoleTrace
|> Program.withReactBatched "root"
|> Program.run
Related information
- elmish version: 4.1.0
- fable-compiler version: 4.11.0
- fable-core version:4.3.0
- Operating system: Mac Sonoma 14.2.1
Thanks much!