Reactjs 如何在应用程序的顶层设置firebase db listener,为导航子组件提供道具

Reactjs 如何在应用程序的顶层设置firebase db listener,为导航子组件提供道具,reactjs,react-native,expo,Reactjs,React Native,Expo,我希望整个应用程序只有一个侦听器,所以我想我可以在应用程序的顶层设置一个侦听器,然后将数据传递给子道具。但我做错了,有人能帮我吗?目前,我在两个不同的地方有监听器调用相同的数据,这就是为什么我想集中它。我查看了React上下文,但我不需要编辑数据,只需要读取它 代码如下: export default function App() { // Set an initializing state whilst Firebase connects const [initializing

我希望整个应用程序只有一个侦听器,所以我想我可以在应用程序的顶层设置一个侦听器,然后将数据传递给子道具。但我做错了,有人能帮我吗?目前,我在两个不同的地方有监听器调用相同的数据,这就是为什么我想集中它。我查看了React上下文,但我不需要编辑数据,只需要读取它

代码如下:

    export default function App() {
  // Set an initializing state whilst Firebase connects
  const [initializing, setInitializing] = useState(true);
  const [user, setUser] = useState();
  const [userData, setUserData] = useState();
  // Handle user state changes
  function onAuthStateChanged(user) {
    setUser(user);
    if (initializing) setInitializing(false);
  }

  useEffect(() => {
    const subscriber = Firebase.auth().onAuthStateChanged(onAuthStateChanged);
    return subscriber; // unsubscribe on unmount
  }, []);

  if (initializing) return null;

  if (!user) {
    return (
      <SignUp/>
    );
  }
  else{
    
    Firebase.database().ref(
      '/Users/' + Firebase.auth().currentUser.uid + '/userData'
      ).orderByKey().on('value',snapshot => {
        setUserData(snapshot.val())
        
      })
    
    return (
      <ErrorBoundary>
      <SafeAreaProvider>
      <NavigationContainer>
        <Tab.Navigator
            tabBarOptions={{
              activeTintColor:'orange',
              inactiveTintColor:'black',
              labelStyle:{ fontSize: 20 }
              
            }}>
          <Tab.Screen name="New" component={FormIn} />
          
          <Tab.Screen name="Logs" children={() => <Logs data={userData}/>} />
          
          
        </Tab.Navigator>
      </NavigationContainer>
      </SafeAreaProvider>
      </ErrorBoundary>
    );
  }
}
导出默认函数App(){
//在Firebase连接时设置初始化状态
const[initializing,setInitializing]=useState(true);
const[user,setUser]=useState();
const[userData,setUserData]=useState();
//处理用户状态更改
函数onAuthStateChanged(用户){
setUser(用户);
if(初始化)setInitializing(false);
}
useffect(()=>{
const subscriber=Firebase.auth().onAuthStateChanged(onAuthStateChanged);
返回订阅服务器;//卸载时取消订阅
}, []);
如果(初始化)返回null;
如果(!用户){
返回(
);
}
否则{
Firebase.database().ref(
'/Users/'+Firebase.auth().currentUser.uid+'/userData'
).orderByKey().on('value',快照=>{
setUserData(snapshot.val())
})
返回(
} />
);
}
}
我得到了太多的错误重新渲染,但我不知道为什么