Skip to content

Elmish React Native update / view sync problem when init has Cmd #90

Open
@playfulThinking

Description

@playfulThinking

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!

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions