Ένα παράθυρο διαλόγου έχει καθυστέρηση για άνοιγμα, λαμβάνω ένα σφάλμα κατά την πλοήγηση σε άλλη προβολή πριν από τη δημιουργία του διαλόγου. Πώς μπορώ να το κάνω να μην δημιουργηθεί;

ψήφοι
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 στο ικρίωμα και, στη συνέχεια, ελέγξτε το περιβάλλον στη μέθοδο διαλόγου είναι! = null και, στη συνέχεια, εκτελέστε διάλογο διαφορετικά ....

  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