मैं यह पता लगाने की कोशिश कर रहा हूं कि उपयोगकर्ता अब प्रमाणित नहीं है और उपयोगकर्ता को लॉगिन करने के लिए रीडायरेक्ट करता है। मैं इसे इस तरह से कर रहा हूँ

  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _getData(context),
        builder: (context, snapshot) {
          try {
            if (snapshot.hasError && _isAuthenticationError(snapshot.error)) {
                Navigator.push(context, MaterialPageRoute(builder: (context) => LoginView()));
            }

दुर्भाग्य से निर्माण पर नेविगेशन काम नहीं कर रहा है। यह इस त्रुटि को फेंकता है

flutter: setState() or markNeedsBuild() called during build.
flutter: This Overlay widget cannot be marked as needing to build because the framework is already in the
flutter: process of building widgets.  A widget can be marked as needing to be built during the build 

मैं सिर्फ LoginView विजेट वापस नहीं कर सकता क्योंकि पैरेंट विजेट में ऐप बार और फ्लोटिंग बटन है और लॉगिन व्यू को इन नियंत्रणों के बिना प्रदर्शित करने की आवश्यकता है .. मुझे नेविगेट करने की आवश्यकता है।

क्या यह करना संभव है?

12
StackOverflower 18 जिंदा 2020, 22:31
उपयोगकर्ता कैसे लॉग इन करते हैं? क्या यह फायरबेस द्वारा है?
 – 
DomingoMG
18 जिंदा 2020, 22:35

3 जवाब

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

इसे Future.microtask में लपेटें। यह इसे अगले async कार्य चक्र पर होने के लिए शेड्यूल करेगा (अर्थात build पूरा होने के बाद)।

Future.microtask(() => Navigator.push(
  context, 
  MaterialPageRoute(builder: (context) => LoginView())
));
19
Abion47 18 जिंदा 2020, 22:36
लेकिन इस मामले में, मेरे पास एक अंतहीन पाश है। क्या कोई अन्य तरीके हैं जो आप कर सकते हैं?
 – 
Valary o
7 मई 2020, 22:28
1
Future.microtask केवल एक बार फायर करता है, इसलिए यदि आप इसे सही तरीके से कर रहे हैं तो लूप असंभव है। जिस तरह से मैं कल्पना कर सकता हूं कि यह अंतहीन लूप पैदा कर रहा है, यदि आप इसका उपयोग उस पृष्ठ पर नेविगेट करने के लिए कर रहे हैं जिस पर आप पहले से हैं और पृष्ठ लोड करना नेविगेशन को ट्रिगर करता है। एक समस्या यह भी हो सकती है कि यदि आप build विधि के दौरान नेविगेट करने का प्रयास कर रहे हैं और विजेट कई बार पुनर्निर्माण कर रहा है, तो आप पहले से ही ट्रिगर होने के बाद नेविगेशन को कतारबद्ध करना जारी रखेंगे। (यही कारण है कि build पद्धति में गैर-यूआई सामग्री करना आम तौर पर एक बुरा विचार है।)
 – 
Abion47
7 मई 2020, 22:39
हाँ, जाहिरा तौर पर मैं वास्तव में वह गलत कर रहा हूँ। मैं इस समय इसके बारे में निश्चित से अधिक हूं। मैं बस स्पंदन के साथ चीजों के रास्ते में आ रहा हूं। मैंने इसे पूरा करने के सभी संभावित तरीकों का प्रयास किया है, लेकिन मुझे या तो सेटस्टेट से संबंधित कोई त्रुटि है या उसके साथ कुछ या MediaQuery के साथ कुछ है। संक्षेप में, मेरे पास एक रैपर है जिसमें तीन घटक होते हैं: शीर्षलेख, पाद लेख और एक व्यूवापर (पृष्ठ दृश्य के साथ)। और यहाँ तुम सही हो। मैं पृष्ठों के माध्यम से स्क्रॉल कर रहा हूं और मेरा अंतिम पृष्ठ एक लॉगिन विजेट है, लेकिन उस तक पहुंचने के बाद मैं पेज व्यू मोड से बाहर निकलना चाहता हूं (जहां मेरे पास पाद लेख और शीर्षलेख है)
 – 
Valary o
7 मई 2020, 22:46
इसलिए मैं इसे पूर्णस्क्रीन और थोड़े स्थिर रखने के लिए एक लॉगिन पृष्ठ पर रीडायरेक्ट करने का प्रयास करता हूं। लेकिन मेरा लॉगिन लॉगिन पेज पर नहीं है, लेकिन मैंने पहले से ही अंदर पाद लेख और शीर्ष-स्तरीय आवरण डालने की कोशिश की है।
 – 
Valary o
7 मई 2020, 22:48
मैं राज्य देखने के लिए प्रदाता का उपयोग करता हूं। क्या आपके पास कोई विचार है कि मैं इसे कैसे हल कर सकता हूं?
 – 
Valary o
7 मई 2020, 22:50

स्ट्रीम में स्पंदन

सामान्य बात एक प्रवाह का उपयोग करना है जहां उपयोगकर्ता परिवर्तन होते हैं। जब उपयोगकर्ता लॉग ऑफ करता है, तो वह उस परिवर्तन का पता लगाता है और उसे दूसरी विंडो पर निर्देशित कर सकता है।

यहाँ मैं अधिक जानकारी संलग्न करता हूँ जितना मैं समझाने की कोशिश करता हूँ:
https://codingwithjoe.com/flutter-authentication/

0
DomingoMG 18 जिंदा 2020, 22:38

यहाँ समस्या:

snapshot.hasError && _isAuthenticationError(snapshot.error)

इसके बजाय OR . का प्रयोग करें

snapshot.hasError || _isAuthenticationError(snapshot.error)
-1
Roshin Raphel 4 मार्च 2021, 15:49