Uploaded image for project: 'Realm JavaScript SDK'
  1. Realm JavaScript SDK
  2. RJS-290

UI doesn't update until tap on the screen when setState is called inside a realm listener callback

      Goals

      I'm trying to update the UI of my app when there is an update of realm data from the server/client.

      I have a listener on a Realm Object for getting updates. When there is an update on the server (or in the client) the function provided to the listener calls setState({}).

      Expected Results

      The UI updates when render function is called.

      Actual Results

      The strange part is that even if the console says that everything is ok, and it shows that the render method was called with correct data, I can't see any updates to my app.

      If I tap on the screen randomly (after 1s,2s, 20s...) the UI magically updates and everything is correct.

      If I do the same setState with a function called from a button it works, I guess because the animation of the button triggers the UI updates.

      Steps to Reproduce

      You have to update the server_url and credential in order to work.

      react-native init test
      npm install realm
      react-native link realm

      Code Sample

      `App.js
      
      import React, {Component} from 'react';
      import {Platform, StyleSheet, Text, View} from 'react-native';
      
      import Realm from 'realm'
      
      import { SERVER_URL } from "./config/realm";
      import { Utente } from "./config/schema";
      
      
      export default class App extends Component {
      
        loginAsync = async () => {
      
          var realm_user = Realm.Sync.User.current
      
          if(!realm_user){
            const credentials = Realm.Sync.Credentials.usernamePassword('admin', '******' ,false);
            realm_user = await Realm.Sync.User.login(SERVER_URL, credentials);
          }
      
          const config = realm_user.createConfiguration({
            schema: [
              Utente, 
              Realm.Permissions.Permission,
              Realm.Permissions.User,
              Realm.Permissions.Role],
            schemaVersion: 1,
          });
      
          this.realm = new Realm(config);
      
      
          var connectedUserData = this.realm.objects("Utente").filtered("id = $0", realm_user.identity)
          connectedUserData.subscribe()
      
      
          connectedUserData.addListener((connectedUserData)=>{
      
            if(connectedUserData[0]){
              this.setState({
                connectedUserData: connectedUserData[0]
              })
            }
      
          })
      
        }
      
        constructor(props){
          super(props)
      
          this.loginAsync()
      
          this.state = {
            connectedUserData: {
              nome: 'not loaded'
            }
          }
      
        }
      
      
      
        render() {
          return (
            <View style={styles.container}>
              <Text>{ this.state.connectedUserData.nome }</Text>
            </View>
          );
        }
      }
      
      
      //Schema.js
      
      export const Utente = {
          name: "Utente",
          primaryKey: "id",
          properties: {
              id: "string",
              nome: 'string?',
              permissions: '__Permission[]'
          }
      }
      
      
      //Package.json
      
      {
        "name": "testBaseRealm",
        "version": "0.0.1",
        "private": true,
        "scripts": {
          "start": "node node_modules/react-native/local-cli/cli.js start",
          "test": "jest"
        },
        "dependencies": {
          "react": "16.6.3",
          "react-native": "0.57.7",
          "realm": "^2.27.0-rc.3"
        },
        "devDependencies": {
          "@babel/core": "7.4.4",
          "@babel/runtime": "7.4.4",
          "babel-jest": "24.8.0",
          "jest": "24.8.0",
          "metro-react-native-babel-preset": "0.54.1",
          "react-test-renderer": "16.6.3"
        },
        "jest": {
          "preset": "react-native"
        }
      }
      

      Version of Realm and Tooling

      • React / React Native "16.6.3/0.57.7" (tryed also with others)
      • Realm JS SDK Version: "2.27.0-rc.3"
      • Node or React Native: React Native
      • Client OS & Version: Android (7.0)
      • Which debugger for React Native: Chrome/React Native Debugger

            Assignee:
            Unassigned Unassigned
            Reporter:
            unitosyncbot Unito Sync Bot
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: