question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

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

See original GitHub issue

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

Issue Analytics

  • State:closed
  • Created 4 years ago
  • Reactions:3
  • Comments:30 (8 by maintainers)

github_iconTop GitHub Comments

4reactions
aureliopetronecommented, May 22, 2019

@kneth the listener get called and the data received is correct. So with that data I simple do a setState(), it updates well but I can’t see any changes on view until I tap somewhere.

3reactions
aureliopetronecommented, Jun 25, 2019

@jurmous, I solved inseriting this line

setTimeOut(()=>null)

before running setState. If you are interested in this see this post on stackoverflow:

https://stackoverflow.com/questions/56725797/how-to-prevent-react-native-from-stucking-on-es6-promises/56729456#56729456

Read more comments on GitHub >

github_iconTop Results From Across the Web

UI doesn't update until tap on the screen when setState is ...
I have a listener on a Realm Object for getting updates. When there is an update on the server (or in the client)...
Read more >
UI doesn't update until tap on the screen when setState is ...
Coding example for the question UI doesn't update until tap on the screen when setState is called inside a realm listener callback-Reactjs.
Read more >
Ui Doesn39t Update Until Tap On The Screen When Setstate Is ...
UI doesn't update until tap on the screen when setState is called inside a realm listener callback. import React, {Component} from 'react';
Read more >
Why React doesn't update state immediately
To update state in React components, we'll use either the this.setState function or the updater function returned by the React.
Read more >
User DxW - Software Recommendations Stack Exchange
How to debounce Textfield onChange in Dart? 13. UI doesn't update until tap on the screen when setState is called inside a realm...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found