एक संवाद को खोलने में देरी होती है, मुझे एक त्रुटि मिलती है जब संवाद उत्पन्न होने से पहले किसी अन्य दृश्य पर नेविगेट किया जाता है। मैं इसे कैसे उत्पन्न कर सकता हूं?

वोट
7

मैं झड़ जाने वाला नया हूँ।

मेरी वास्तविक समस्या में, मेरा क्लाइंट उन जगहों पर है जहाँ अक्सर ऐसा होता है कि इंटरनेट बहुत धीमा है, इसलिए कभी-कभी एक वेब अनुरोध करने का प्रयास किया जाता है और इसमें समय लग सकता है, इसलिए उपयोगकर्ता वेब अनुरोध से पहले स्क्रीन छोड़ देता है पूरा कर लिया है। वेब अनुरोध पूरा करने के बाद कभी-कभी मेरा ऐप एक उत्पन्न करता है dialog । तो यहाँ है जहाँ मेरी समस्या है, उपयोगकर्ता एक वेब अनुरोध करने की कोशिश कर रहा है और जब यह किया जाता है, तो वे स्क्रीन छोड़ देते हैं और फिर dialog उत्पन्न होता है।

मैं इस समस्या का अनुकरण करने की कोशिश कर रहा हूं delay वह बाद में उत्पन्न होता है dialog

मैं वेब अनुरोध को समाप्त करने के लिए किसी भी रणनीति के बारे में नहीं सोच रहा हूं, जो मैं चाहता हूं वह एक ऐसा तरीका है जिसे मैं एक बार स्क्रीन पर छोड़ देता हूं, संवाद का कारण बनता है जैसे कुछ dispose

मैंने एक उदाहरण बनाया जहां मेरे पास 2 स्क्रीन हैं। बटन को क्लिक करने पर 5 सेकंड की देरी के साथ दूसरी स्क्रीन पर एक संवाद उत्पन्न होता है। यदि संवाद खुलने से पहले मैं दूसरी स्क्रीन पर जाता हूं तो मुझे एक त्रुटि मिलती है। मुझे लगता है कि ऐसा होता है क्योंकि दृश्य नष्ट हो गया था और इसलिए संवाद नहीं खोला जा सकता है।

यहां

जब दूसरे दृश्य में होने के बाद संवाद उत्पन्न होता है तो मैं त्रुटि से बचने के लिए क्या कर सकता हूं? यदि मैं किसी अन्य दृश्य में हूं तो मैं उत्पन्न होने के लिए संवाद नहीं चाहता।

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print(main);
    return MaterialApp(title: 'Provider Example', initialRoute: '/', routes: {
      '/': (context) => Home(),
      'home': (context) => Home(),
      'dialogpage': (context) => Dialogpage(),
    });
  }
}

class Home extends StatelessWidget {
  Home() {
    print(home);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('home'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.add_alert),
            tooltip: 'Show Snackbar',
            onPressed: () {
              Navigator.pushNamed(context, dialogpage);
            },
          ),
        ],
      ),
      body: const Center(
        child: Text(
          'home',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

class Dialogpage extends StatelessWidget {
  Dialogpage() {
    print(dialogpage);
  }

  dialog(BuildContext context) {
    Future.delayed(const Duration(seconds: 5), () {
      showDialog(
          context: context,
          barrierDismissible: false,
          builder: (context) {
            return AlertDialog(
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(20.0)),
              title: Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.only(
                    topLeft: Radius.circular(19.0),
                    topRight: Radius.circular(19.0),
                  ),
                ),
                padding: EdgeInsets.symmetric(vertical: 10, horizontal: 5),
                child: Text(
                  'Error',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              content: Column(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  Container(
                    margin: EdgeInsets.only(top: 20.0, bottom: 20.0),
                    child: Icon(
                      Icons.error,
                      size: 50,
                    ),
                  ),
                  Text(dialog),
                ],
              ),
              titlePadding: EdgeInsets.all(0),
              actions: <Widget>[
                FlatButton(
                    child: Text('Aceptar'),
                    onPressed: () {
                      return Navigator.of(context).pop();
                    }),
              ],
            );
          });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('dialog'),
      ),
      body: Center(
        child: RaisedButton(
            child: Text(show dialog),
            onPressed: () {
              dialog(context);
            }),
      ),
    );

  }
}
07/06/2020 को 07:55
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

के बजाय Future.delayed , आपको उपयोग करना चाहिए Timer , जिसे रद्द किया जा सकता है onDispose तरीका।

काम कर समाधान:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("main");
    return MaterialApp(
      title: 'Provider Example',
      initialRoute: '/',
      routes: {
        '/': (context) => Home(),
        'home': (context) => Home(),
        'dialogpage': (context) => Dialogpage(),
      },
    );
  }
}

class Home extends StatelessWidget {
  Home() {
    print("home");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('home'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.add_alert),
            tooltip: 'Show Snackbar',
            onPressed: () {
              Navigator.pushNamed(context, "dialogpage");
            },
          ),
        ],
      ),
      body: const Center(
        child: Text(
          'home',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

class Dialogpage extends StatefulWidget {
  @override
  _DialogpageState createState() => _DialogpageState();
}

class _DialogpageState extends State<Dialogpage> {
  Timer _timer;

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }

  dialog(BuildContext context) {
    _timer = Timer(
      const Duration(seconds: 3),
      () {
        showDialog(
          context: context,
          barrierDismissible: false,
          builder: (context) {
            return AlertDialog(
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),
              title: Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.only(
                    topLeft: Radius.circular(19.0),
                    topRight: Radius.circular(19.0),
                  ),
                ),
                padding: EdgeInsets.symmetric(vertical: 10, horizontal: 5),
                child: Text(
                  'Error',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              content: Column(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  Container(
                    margin: EdgeInsets.only(top: 20.0, bottom: 20.0),
                    child: Icon(
                      Icons.error,
                      size: 50,
                    ),
                  ),
                  Text("dialog"),
                ],
              ),
              titlePadding: EdgeInsets.all(0),
              actions: <Widget>[
                FlatButton(
                  child: Text('Aceptar'),
                  onPressed: () {
                    return Navigator.of(context).pop();
                  },
                ),
              ],
            );
          },
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('dialog'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text("show dialog"),
          onPressed: () {
            dialog(context);
          },
        ),
      ),
    );
  }
}
09/06/2020 को 09:54
का स्रोत उपयोगकर्ता

वोट
0

इस कोड को आज़माएं

class Dialogpage extends StatelessWidget {
  ...
  Timer t;

  dialog(BuildContext context) {
    t = Timer(Duration(seconds: 5), () {
      showDialog(...);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('dialog'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back, color: Colors.black),
          onPressed: () {
            t?.cancel();
            Navigator.of(context).pop();
          },
        ),
      ),
      body: Center(
        child: RaisedButton(
            child: Text("show dialog"),
            onPressed: () {
              dialog(context);
            }),
      ),
    );
  }
}

आशा है ये मदद करेगा।

09/06/2020 को 08:52
का स्रोत उपयोगकर्ता

वोट
0

पाड़ में Globalkey का उपयोग करें तो संवाद विधि में संदर्भ की जाँच करें यह है! = शून्य तो संवाद चलाएँ अन्यथा नहीं ....

  GlobalKey _scafolldKey = GlobalKey<ScaffoldState>();

      @override
      Widget build(BuildContext context) {
        return Scaffold(
        key: _scafolldKey,
        appBar: AppBar(
            title: const Text('dialog'),),
            body: Center(
                child: RaisedButton(
                    child: Text("show dialog"),
                    onPressed: () {
                    dialog(context);
               }),
            ),
         );
       }
    }

    dialog(BuildContext context) {
        Future.delayed(const Duration(seconds: 2), () {
          if(_scafolldKey.currentContext !=null){
          showDialog();
            }
         });  
      }
11/06/2020 को 07:49
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more