Firebase 反应本机数据显示在console.log上,但不显示在屏幕上

Firebase 反应本机数据显示在console.log上,但不显示在屏幕上,firebase,react-native,google-cloud-firestore,Firebase,React Native,Google Cloud Firestore,有时应用程序运行良好。 但我不知道为什么,有时候firebase的数据给我的是空白屏幕而不是数据。 在我重新打开应用程序后,它会工作 比如说,, 我的其中一页: useEffect( () => { const subscriber = firestore() .collection('Trails') .onSnapshot(querySnapshot => { //const querySnapshot = await f

有时应用程序运行良好。 但我不知道为什么,有时候firebase的数据给我的是空白屏幕而不是数据。 在我重新打开应用程序后,它会工作

比如说,, 我的其中一页:

useEffect( () => {
        const subscriber =  firestore()
          .collection('Trails')
          .onSnapshot(querySnapshot => { //const querySnapshot = await firebase.firestore().collection('users').get();
            const trails = [];
            console.log('subscribe')
            if (querySnapshot)
              querySnapshot.forEach(async documentSnapshot => {
                trails.push({
                  ...documentSnapshot.data(),
                  key: documentSnapshot.id,

                });
                console.log("trails test", trails)
                
              });

            
            setTrails(trails);
            setLoading(false);
          });
        return () => {subscriber()};
      }, []);
我使用useEffect从数据库中获取数据,然后将其显示出来,同样-有时给我空白,有时效果很好

我想发布应用程序,但我对这个bug不满意

对不起我的英语,我甚至不知道如何更好地描述这个问题


有人能给我指点迷津吗?也许我的useEffect做得不好?

我认为你应该使用调试


我认为使用中的return有一个问题,component卸载时会调用effect return。以下是我如何处理异步数据获取的示例:

...
const [data, setData] = useState([]);

const isCurrentView = useRef(true);

useEffect(() => {
  if (isCurrentView.current === true) {

    const asyncFetch = async () => {
      const response = await fetch(...something) //here some Asynchronous Call Like(axios, fetch)
      setData([...response]);
    };

    asyncFetch();
  }

  return () => {
    isCurrentView.current = false;
  };
}, []);
...
我不能100%确定这是否是最好的方法,但我在一些地方看到过类似的代码,所以我选择了这种方法。

问题解决了: setTrails在作用域下,它不断刷新空数据

querySnapshot.forEach(async documentSnapshot => {
                trails.push({
                  ...documentSnapshot.data(),
                  key: documentSnapshot.id,

                });
              setTrails(trails);  // <<<~~~~ put the set in this scope.
            });
              setLoading(false);
          });
querySnapshot.forEach(异步文档快照=>{
推({
…documentSnapshot.data(),
关键字:documentSnapshot.id,
});

setTrails(trails);//谢谢,我会试试这个,标记也会出现问题,但一旦用户重新启动应用程序,它就会工作:它会抓取,出现,然后消失(就像我做了两次asyncFetch()一样?)