setState updates the UI only after tap on screen even if the console shows the method has been called before
See original GitHub issueGoals
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
React Native Environment Info:
System:
OS: Windows 10
CPU: (8) x64 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
Memory: 5.46 GB / 15.88 GB
Binaries:
npm: 6.4.1 - C:\Program Files\nodejs\npm.CMD
IDEs:
Android Studio: Version 3.4.0.0 AI-183.5429.30.34.5452501
Issue Analytics
- State:
- Created 4 years ago
- Reactions:1
- Comments:9
I seem to be running into the same issue but without using any Realm Object. Even though the render function is fired and some console logs indicate that all the data has been updated after a network call completes, the UI will not update unless I tap on the screen.
Side note: This only seems to happen on the iOS simulator for me.
React Native Environment Info:
Can you run
react-native info
and edit your issue to include these results under the React Native version: section?