如何使用React Native从Firebase实时数据库中获取数据?

时间:2020-07-25 13:46:52

标签: javascript firebase react-native firebase-realtime-database react-native-firebase

我正在尝试获取数据Firebase实时数据库。我可以使用console.log()显示数据,但不能在平面列表中显示。我尝试了不同的方法来解决此问题。但是,我找不到任何解决方案。 在这里,我的Firebase中的JSON树:

json tree

在这里,我的代码:

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>
  );
};

我尝试了许多不同的方法,但是没有建议可以解决问题。如果您能帮助我,我会很高兴。

3 个答案:

答案 0 :(得分:0)

您的*(**bmap)不会返回数据,因为数据是异步加载的。您应该改为将他对getData的呼叫转移到您的setData中:

getData

现在,对 const getData = () => { firebase.database().ref(`notes/`).on('value', function (snapshot) { setData(snapshot.val()); }); } useEffect(() => { setTimeout(() => { getData() setLoading(true); }, 1000); }, []); 的调用会将JSON置于状态,这反过来又迫使React使用新数据重新绘制UI。

答案 1 :(得分:0)

Ciao,基本上您犯了两个错误:

  1. getData不返回任何内容,因此永远不会使用firebase中的值更新数据;
  2. useEffect有一个奇怪的实现(它是无用的调用setTimeout,您已经在等待来自firebase的数据);

我的建议是像这样从getData呼叫useEffect

   useEffect(() => {
      getData()
   }, []);

并像这样修改getData

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

答案 2 :(得分:-1)

我找到了解决方案,并希望与大家分享。 我将孩子的Firebase数据保留为新值,然后将其放入setData中。这样,我可以在平面列表中显示数据。

 const getData = () => {
firebase.database().ref(`notes/`).on('value', snapshot => {
    let responselist = Object.values(snapshot.val())
    setData(responselist)
    console.log(snapshot.val())
    setLoading(true);
});
}

useEffect(() => {
  getData();
}, []);

此外,当Firebase实时数据库正在工作时,一种名为Object方法的新方法在JSON树中获取子值时会有所帮助。