FirebaseUser से .reload() किस विधि के लिए उपयोग किया जाता है?
स्थानीय रूप से फ़ंक्शन किसी भी डेटा को नहीं बदलता है, और Firestore.instance.currentUser() के साथ मुझे हमेशा वर्तमान डेटा मिलेगा, है ना?

डॉक्स से:

सार्वजनिक कार्य पुनः लोड () वर्तमान उपयोगकर्ता के डेटा को मैन्युअल रूप से ताज़ा करता है (उदाहरण के लिए, संलग्न प्रदाता, प्रदर्शन नाम, और इसी तरह)।

तो मैंने मूल रूप से user.reload() को कॉल करने के बाद सोचा था कि आउटपुट होगा: "उपयोगकर्ता का नाम: बार" और "उपयोगकर्ता का नाम: foo" नहीं। तो मेरे लिए ऐसा लगता है कि यह वास्तव में कुछ नहीं करता है?

संबंधित पक्ष-प्रश्न:
इसका मतलब यह भी है कि उपयोगकर्ता की वर्तमान जानकारी सुनिश्चित करने के लिए मुझे हमेशा FirebaseAuth.instance.currentUser() को कॉल करना होगा? फ़ायरबेस यूज़र की स्ट्रीम रखने का कोई तरीका नहीं है, जो उपयोगकर्ता की जानकारी बदलने पर एक नया फ़ायरबेस यूज़र उत्सर्जित करता है? (मेरा मतलब Firebase.instance.onAuthStateChanged() नहीं है)

उदाहरण:

 static stackOverflowProblem() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    print("Name of User: ${user.displayName}"); //prints foo

    //Renaming the name from "foo" to "bar"
    UserUpdateInfo userInfo = UserUpdateInfo();
    userInfo.displayName = "bar";
    await _auth.updateProfile(userInfo);

    print("\nBefore calling user.reload:");
    print("Name of user: ${user.displayName}"); //prints foo
    print("Name of FirebaseAuth.instance.currentUser: ${(await FirebaseAuth.instance.currentUser()).displayName}"); //prints bar

    await user.reload();

    print("\nAfter calling user.reload:");
    print("Name of user: ${user.displayName}"); //prints foo
    print("Name of FirebaseAuth.instance.currentUser: ${(await FirebaseAuth.instance.currentUser()).displayName}"); //prints bar
  }

कंसोल आउटपुट:

I/flutter (19989): Name of User: Foo
I/flutter (19989): 
I/flutter (19989): Before calling user.reload:
I/flutter (19989): Name of user: Foo
I/flutter (19989): Name of FirebaseAuth.instance.currentUser: bar
I/flutter (19989): 
I/flutter (19989): After calling user.reload:
I/flutter (19989): Name of user: Foo
I/flutter (19989): Name of FirebaseAuth.instance.currentUser: bar
11
JSAN L. 6 अगस्त 2018, 17:16
इस पर उत्तर दें कि reload() को नीचे कैसे काम करना चाहिए। मुझे यकीन नहीं है कि आपके मामले में दूसरा प्रिंट अभी भी पुराना उपयोगकर्ता नाम क्यों दिखाता है। मुझे आशा है कि कोई और वहां समस्या का पता लगाएगा।
 – 
Frank van Puffelen
6 अगस्त 2018, 17:23
तो मेरा सिद्धांत यह कैसे काम करना चाहिए चाहिए सही है, लेकिन कार्यान्वयन शायद गलत है?
 – 
JSAN L.
6 अगस्त 2018, 18:23

5 जवाब

सबसे बढ़िया उत्तर

यह इच्छित व्यवहार प्रतीत होता है।

जैसा कि पहले ही कहा गया था कि केवल .reload को कॉल करने से काम नहीं चलता।

await user.reload();
print(user.emailVerified) // false

इसके बजाय आपको currentUser फिर से प्राप्त करना होगा।

await user.reload();
// `currentUser` is synchronous since FirebaseAuth rework
user = firebaseAuth.currentUser;
print(user.emailVerified) // true

पुनर्विक्रय के साथ (firebase_auth: ^0.18.0) FirebaseAuth एक .userChanges()-स्ट्रीम को भी उजागर करता है। उपयोगकर्ता जानकारी को मैन्युअल रूप से पुनः लोड करने के बजाय यह पसंदीदा समाधान प्रतीत होता है।

FirebaseAuth.userChanges() के दस्तावेज़ीकरण से:

यह [authStateChanges] और [idTokenChanges] दोनों का सुपरसेट है। यह सभी उपयोगकर्ता परिवर्तनों पर ईवेंट प्रदान करता है, जैसे कि जब क्रेडेंशियल लिंक किए जाते हैं, अनलिंक किए जाते हैं और जब उपयोगकर्ता प्रोफ़ाइल में अपडेट किए जाते हैं। इस स्ट्रीम का उद्देश्य उपयोगकर्ता को [रीलोड] को मैन्युअल रूप से कॉल किए बिना रीयलटाइम अपडेट सुनना और फिर आपके एप्लिकेशन में परिवर्तनों को रीहाइड्रेट करना है।

इसमें .isEmailVerified afaik भी शामिल है (संपादित करें: सच नहीं हो सकता है, टिप्पणियां देखें)।

firebaseAuth.userChanges().listen((user) {
  // Your logic
});
3
JSAN L. 17 मई 2021, 00:06
जब मैं ईमेल सत्यापित करता हूं, userChanges() ट्रिगर नहीं होता है। हालांकि, user.reload (), ईमेल सत्यापित = सत्य देता है।
 – 
bounxye
10 फरवरी 2021, 11:45
मेरे लिए भी ऐसा। मुझे user.reload() का उपयोग करना है शायद हम कुछ गलत कर रहे हैं?
 – 
progNewbie
4 मई 2021, 00:07

आपको लॉग आउट किए बिना और फिर से लॉग इन किए बिना ईमेल सत्यापित करने देता है। लेकिन यह एक बग हो सकता है, लेकिन जब आप user.reload() को कॉल करते हैं, तो आपको currentUser() को फिर से कॉल करना होगा।

यह काम नहीं करता:

await user.reload();
user.isEmailVerified => still false

आपको:

await user.reload();
user = await _auth.currentUser();
user.isEmailVerified => now it is true
8
Gabeloooooo 23 अगस्त 2018, 02:55
उपयोगकर्ता = _auth.currentUser; मेरे लिए काम किया। धन्यवाद।
 – 
Kamlesh
13 जून 2021, 22:58

User.reload() को कॉल करने से उस उपयोगकर्ता का प्रोफ़ाइल डेटा सर्वर से पुनः लोड हो जाता है।

इसके लिए एक सामान्य उपयोग-मामला तब होता है जब आप उपयोगकर्ता को एक ईमेल भेजते हैं उनका ईमेल पता सत्यापित करें। जब उपयोगकर्ता उस ईमेल में लिंक पर क्लिक करता है तो वह फायरबेस प्रमाणीकरण सर्वर पर वापस चला जाता है, जो उनके ईमेल पते को सत्यापित के रूप में चिह्नित करता है। लेकिन जब ऐसा होता है, तो आपके ऐप को इसके बारे में जानने का कोई तरीका नहीं है, क्योंकि कॉल सीधे ईमेल क्लाइंट से सर्वर पर जाती है। अक्सर आप एक तथाकथित URL जारी रखें जोड़ देंगे लिंक, जो ईमेल पते की पुष्टि के बाद आपके ऐप में वापस कॉल कर सकता है। फिर आपका ऐप सर्वर से अपडेट की गई स्थिति को लोड करने के लिए reload() पर कॉल कर सकता है।

5
Frank van Puffelen 6 अगस्त 2018, 17:21
आपके स्पष्टीकरण के लिए आभार। ठीक है तो user.reload() का उपयोग उपयोगकर्ता डेटा को अपडेट करने के लिए किया जाता है, जिसमें बदलाव की संभावना होती है, उदा। displayName, photoUrl, isEmailVerified, आदि, और केवल वही, जैसे अन्य डेटा उदा. uid स्थिर है? तो यह सिर्फ एक नया उपयोगकर्ता प्राप्त करने से बेहतर है, क्योंकि यह बैंडविड्थ को मामूली रूप से बचाता है? क्योंकि आपके उदाहरण में कोई भी reload() को कॉल करने के बजाय सिर्फ currentUser() का अनुरोध कर सकता था, है ना?
 – 
JSAN L.
6 अगस्त 2018, 18:22
यदि उपयोगकर्ता पहले से साइन इन था, तो auth.currentUser() का अनुरोध करने से सर्वर से उनका प्रोफ़ाइल डेटा रीफ़्रेश नहीं होता है।
 – 
Frank van Puffelen
6 अगस्त 2018, 18:31
1
आह ठीक है, मुझे यह नहीं पता था, धन्यवाद। लेकिन ऐसा क्यों लगता है कि यह मेरे उदाहरण में उस तरह से काम करता है ?? मेरा मतलब है कि पहले Name of FirebaseAuth.instance.currentUser: को "फू" होना चाहिए था न कि "बार", अगर auth.currentUser() प्रोफाइल डेटा को रीफ्रेश नहीं करता है, क्योंकि मैंने अभी तक user.reload() को कॉल नहीं किया है, चाहिए' यह?
 – 
JSAN L.
6 अगस्त 2018, 18:44

यह कोई बग नहीं है, लेकिन Firebase Auth के काम करने का अजीब तरीका है, और वे कहते हैं कि यह अभी के लिए नहीं बदलेगा, इसलिए मैंने इसे ठीक करने के लिए एक पैकेज बनाया, इसे यहां पकड़ें: firebase_user_stream

रीडमी में मैं मुद्दों की व्याख्या करता हूं और पैकेज उन्हें कैसे ठीक करता है, उदाहरण हैं और आदि, आनंद लें!

0
Michel Feinstein 24 जिंदा 2020, 23:56

हो सकता है कि आपको नवीनतम सामग्री प्राप्त करने के लिए .then या जब पूर्ण का उपयोग करने की आवश्यकता हो, उदाहरण के लिए:

await _auth.updateProfile().then((retornedValueFromTheMethod) {
  print(retornedValueFromTheMethod);
}).whenComplete(() {
  print("TODO something if you want");
});

आपको चाहिए अपडेटप्रोफाइल Future<retornedValueType> updateProfile() {...}

-1
Floricel Hernández 5 सितंबर 2020, 00:25
प्रतीक्षा करें और वह और कबएक अभिव्यक्ति में पूर्ण - एक अच्छा विचार नहीं है
 – 
Vadim Popov
19 मार्च 2021, 11:53