Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React native-函数CollectionReference.doc()需要其第一个参数_Javascript_Firebase_React Native_Google Cloud Firestore - Fatal编程技术网

Javascript React native-函数CollectionReference.doc()需要其第一个参数

Javascript React native-函数CollectionReference.doc()需要其第一个参数,javascript,firebase,react-native,google-cloud-firestore,Javascript,Firebase,React Native,Google Cloud Firestore,我有以下资料: function HomeScreen({navigation}) { const uid = firebase.auth().currentUser?.uid; const [user, setUser] = useState({}); useEffect(() => { const subscriber = firebase.firestore() .collection('users') .doc(uid) .onSna

我有以下资料:

function HomeScreen({navigation}) {

const uid = firebase.auth().currentUser?.uid;
const [user, setUser] = useState({});

useEffect(() => {
    const subscriber = firebase.firestore()
      .collection('users')
      .doc(uid)
      .onSnapshot(documentSnapshot => {
        setUser(documentSnapshot.data());
      });
    return () => subscriber();
  }, [uid]);

return (
    <Screen style={styles.screen}>
        <View>
            <Text>Hello</Text>
            <Text style={styles.nameText}>{user.username}</Text>
            <Text>hello</Text>
            <View style={{paddingBottom:20, marginRight:200, paddingTop:40}}>
                <DefaultButton 
                    title="Edit your profile" 
                    onPress={() => navigation.navigate("EditProfileScreen")}
                    color='#F9CDAD' 
                />
            </View>
        </View>
    </Screen>
)
}
功能主屏幕({navigation}){
const uid=firebase.auth().currentUser?.uid;
const[user,setUser]=useState({});
useffect(()=>{
const subscriber=firebase.firestore()
.collection('用户')
.doc(uid)
.onSnapshot(文档快照=>{
setUser(documentSnapshot.data());
});
return()=>subscriber();
},[uid]);
返回(
你好
{user.username}
你好
导航。导航(“EditProfileScreen”)}
颜色=“#F9CDAD”
/>
)
}
我正在尝试显示用户名:

<Text style={styles.nameText}>{user.username}</Text>
{user.username}
但是我得到了以下错误:

FirebaseError:函数CollectionReference.doc()要求其第一个参数的类型为非空字符串,但它是:未定义


当我记录上面定义的
uid
const uid=firebase.auth().currentUser?.uid
,它返回
undefined

问题是,实际上,您在
useffect()
部分中使用了引用
uid
中的
未定义的

您已经正确地将其设置为依赖项数组中的依赖项,但是您没有检查该值是否已实际定义,以便以后安全使用

useEffect(() => {
    // this will run two times, first when 'uid' is initialized (as undefined) -> which will give your error
    // and then, when it gets defined with actual value.
    // --> fix: check 'uid' to be defined before using it.
    if(!uid) {
      // uid not defined yet, just return.
      return
    }
    // uid is defined here, it's safe to use.
    const subscriber = firebase.firestore()
      .collection('users')
      .doc(uid)
      .onSnapshot(documentSnapshot => {
        setUser(documentSnapshot.data());
      });
    return () => subscriber();
  }, [uid]);

问题在于,实际上,您在
useffect()
部分中使用了引用
uid
中的
未定义的

您已经正确地将其设置为依赖项数组中的依赖项,但是您没有检查该值是否已实际定义,以便以后安全使用

useEffect(() => {
    // this will run two times, first when 'uid' is initialized (as undefined) -> which will give your error
    // and then, when it gets defined with actual value.
    // --> fix: check 'uid' to be defined before using it.
    if(!uid) {
      // uid not defined yet, just return.
      return
    }
    // uid is defined here, it's safe to use.
    const subscriber = firebase.firestore()
      .collection('users')
      .doc(uid)
      .onSnapshot(documentSnapshot => {
        setUser(documentSnapshot.data());
      });
    return () => subscriber();
  }, [uid]);

在触发
userEffect
时,似乎还没有设置
uid

要解决此问题,请响应身份验证状态更改:

  useEffect(() => {
    let subscriber;
    firebase.auth().onAuthStateChanged((user) => {
      if (user && !subscriber) {
        subscriber = firebase.firestore()
          .collection('users')
          .doc(user.uid)
          .onSnapshot(documentSnapshot => {
            setUser(documentSnapshot.data());
        });
    });
    return () => subscriber();
  }, [uid]);

您可能需要在最后调整
返回
,因为
订户
现在是异步设置的。

您的
用户效果
触发时,
uid
似乎还没有设置

要解决此问题,请响应身份验证状态更改:

  useEffect(() => {
    let subscriber;
    firebase.auth().onAuthStateChanged((user) => {
      if (user && !subscriber) {
        subscriber = firebase.firestore()
          .collection('users')
          .doc(user.uid)
          .onSnapshot(documentSnapshot => {
            setUser(documentSnapshot.data());
        });
    });
    return () => subscriber();
  }, [uid]);
您可能需要调整结尾处的
返回
,因为
订户
现在是异步设置的