Een dialoog heeft een vertraging om te openen, ik krijg een fout bij het navigeren naar een andere weergave voordat het dialoogvenster wordt gegenereerd. Hoe kan ik ervoor zorgen dat het niet wordt gegenereerd?

stemmen
7

Ik ben nieuw in het fladderen.

In mijn echte probleem is mijn cliënt op plaatsen waar het heel vaak voorkomt dat het internet erg traag is, dus soms wordt er een poging gedaan om een webverzoek te doen en dit kan tijd kosten, dus de gebruiker verlaat het scherm voordat het webverzoek is voltooid. Soms genereert mijn app na het voltooien van een webverzoek eendialog. Dus hier ligt mijn probleem, de gebruiker probeert een webverzoek te doen en terwijl het gedaan is, verlaat hij het scherm en dan wordt het dialoggegenereerd.

Ik probeer dit probleem te simuleren met een delaydialog.

Ik denk niet aan een strategie om het webverzoek te beëindigen, wat ik wil is een manier vinden om, zodra ik het scherm verlaat, ervoor te zorgen dat het dialoogvenster niet meer wordt gegenereerd, zoals een dispose

Ik heb een voorbeeld gemaakt waarbij ik 2 schermen heb. Op het tweede scherm wordt een dialoogvenster gegenereerd met een vertraging van 5 seconden wanneer op de knop wordt geklikt. Als ik naar een ander scherm navigeer voordat het dialoogvenster wordt geopend, krijg ik een fout. Ik ga ervan uit dat dit gebeurt omdat het scherm is vernietigd en het dialoogvenster dus niet kan worden geopend.

enter

Wat kan ik doen om de fout te voorkomen als het dialoogvenster wordt gegenereerd nadat ik in een andere weergave ben geweest? Als ik in een andere weergave ben, wil ik niet dat het dialoogvenster wordt gegenereerd.

id=pre-0
De vraag is gesteld op 07/06/2020 om 07:55
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

In plaats van Future.delayed, moet u gebruik Timermaken van , die kan worden geannuleerd in onDisposemethode

Werkende oplossing:

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);
          },
        ),
      ),
    );
  }
}
antwoordde op 09/06/2020 om 09:54
bron van user

stemmen
0

Probeer deze code

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);
            }),
      ),
    );
  }
}

Ik hoop dat het helpt.

antwoordde op 09/06/2020 om 08:52
bron van user

stemmen
0

gebruik Globalkey in de steiger en controleer dan de context in het dialoogvenster methode is het != null en dan de dialogen te voeren, anders niet...

  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();
            }
         });  
      }
antwoordde op 11/06/2020 om 07:49
bron van user

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