0
votes

Comment obtenir des données de la base de données Firebase Realtime avec React Native?

J'essaie d'obtenir une base de données DATA FireBase Realtime. Je peux montrer des données avec console.log () mais je ne peux pas montrer dans la liste des plats. J'ai essayé différentes manières de résoudre ce problème. Mais, je ne pouvais trouver aucune solution certaine. Ici, mon arbre Json en Firebase:

arbre JSON p>

ici, mon code : P>

const NotesList = (props) => {

  const { colors } = useTheme();
  const styles = customStyles(colors);

  const user = auth().currentUser
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(false);

  const getData = () => {
    firebase.database().ref(`notes/`).on('value', function (snapshot) {
        console.log(snapshot.val())
    });
  }

  useEffect(() => {
    setTimeout(() => {
      setData(getData);
      setLoading(true);
    }, 1000);
  }, []);
  
  const renderItem = ({ item }) => {
    return (
      <View style={{ marginRight: 10, marginLeft: 10 }}>
        <TouchableOpacity>
          <NoteCard title={item.noteTitle} icerik={item.noteDetails} date={item.timestamp} />
        </TouchableOpacity>
      </View>
    );
  };
  const split = () => {
    let icerik = data.map((item, key) => item.icerik);
    return icerik.slice(0, 1) + '...';
  };
  return (
    <View style={styles.container}>
      <StatusBar barStyle="light-content" />
      
      <NoteSearchBar />
      {!loading ? (
        <View style={{ alignItems: 'center' }}>
          <ActivityIndicator color="#ff5227" />
        </View>
      ) : (
          <FlatList
            data={data}
            numColumns={2}
            renderItem={renderItem}
            keyExtractor={(item, index) => index.toString()}
          />
        )}
      <TouchableOpacity
        style={styles.addButton}
        onPress={() => props.navigation.navigate('AddNote')}>
        <Plus width={40} height={40} fill="white" margin={10} />
      </TouchableOpacity>
    </View>
  );
};


0 commentaires

3 Réponses :


0
votes

Votre getdata n'est pas retourner les données, car les données sont chargées de manière asynchrone. Vous devriez plutôt vous déplacer qu'il appelle à setdata dans votre getdata : xxx

maintenant l'appel à setData sera Placez le JSON dans l'état, ce qui, à leur tour, réagit pour repeindre l'interface utilisateur avec les nouvelles données.


2 commentaires

Bonjour Frank, j'ai essayé votre suggestion, mais j'ai toujours le même problème, et j'ai eu une erreur d'index lorsque nous le faisons. Comme je l'ai mentionné, je peux voir les données de la console, mais je ne peux pas le montrer dans la liste.


Aucun des indicateurs de ma réponse n'accède à rien avec une gamme, donc si vous obtenez maintenant cette erreur, il s'agit probablement d'un code que vous avez déjà eu. En fait, je m'attends à ce que cela soit un bon signe, car cela signifie probablement que votre code de rendu est maintenant invoqué avec les données de la base de données et que l'erreur provient du code qui n'était pas appelé auparavant.



0
votes

Ciao, fondamentalement, vous avez fait 2 erreur:

  1. getdata ne peut pas ne rien retourner que les données ne seront jamais mises à jour avec des valeurs de Firebase;
  2. useEffect a une implémentation étrange (c'est un appel inutile Settimeout Vous attendez déjà des données de Firebase);

    Ma suggestion est d'appeler getdata à partir de useEffect comme ceci: xxx

    et modifier < Code> getdata comme ceci: xxx


2 commentaires

Bonjour Gio, j'ai essayé votre suggestion, mais j'ai toujours le même problème et j'ai eu une erreur de plage d'index lorsque nous le faisons. Comme je l'ai mentionné, je peux voir les données de la console, mais je ne peux pas le montrer dans la liste. C'est un résultat similaire avec Frank.


CIAO, j'ai essayé de reproduire votre liste de note de note dans Ceci codesendbox. Il est presque égal (à l'exception de la barre de notes, de la noeud et des données). Comme vous pouvez le constater, la flatliste est visible avec des données correctes. En supposant que la barre de notation et les données ne sont pas le problème, peut-être que Notecard échoue ... Je ne sais pas, que pensez-vous?



-1
votes

J'ai trouvé une solution et je veux le partager avec vous les gars. J'ai gardé les données de Firebase en tant qu'enfant à une nouvelle valeur, puis je l'ai mise à Sedata. De cette façon, je peux afficher les données de la liste des plats. XXX

De plus, tandis que Firebase Realtime DB fonctionnait, une nouvelle méthode appelée méthode d'objet aidé lors de la prise de valeurs de l'enfant dans l'arbre JSON.


1 commentaires

Comme je l'ai dit dans ma réponse, ici aussi vous appelez setdata dans le rappel du sur ('valeur' ​​. Bien que ce soit possible, votre message d'origine a eu plusieurs problèmes, il est courant de reconnaître Lorsque vous utilisez la réponse de quelqu'un pour résoudre votre problème.