Wie kann man Code nach einer Verzögerung in Flutter ausführen?


111

Ich möchte eine Funktion nach einer bestimmten Verzögerung ausführen, nachdem mein Widget erstellt wurde. Was ist die idiomatische Art, dies in Flutter zu tun?

Was ich erreichen möchte: Ich möchte mit einem Standard- FlutterLogoWidget beginnen und dessen styleEigenschaft nach einiger Zeit ändern .

Antworten:


208

Sie können Future.delayedIhren Code nach einiger Zeit ausführen. z.B:

Future.delayed(const Duration(milliseconds: 500), () {

// Here you can write your code

  setState(() {
    // Here you can write your code for open new view
  });

});

In der setState-Funktion können Sie einen Code schreiben, der sich auf die App-Benutzeroberfläche bezieht, z. B. Bildschirmdaten aktualisieren, Beschriftungstext ändern usw.


66

Ich habe es herausgefunden 😎

class AnimatedFlutterLogo extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _AnimatedFlutterLogoState();
}

class _AnimatedFlutterLogoState extends State<AnimatedFlutterLogo> {
  Timer _timer;
  FlutterLogoStyle _logoStyle = FlutterLogoStyle.markOnly;

  _AnimatedFlutterLogoState() {
    _timer = new Timer(const Duration(milliseconds: 400), () {
      setState(() {
        _logoStyle = FlutterLogoStyle.horizontal;
      });
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return new FlutterLogo(
      size: 200.0,
      textColor: Palette.white,
      style: _logoStyle,
    );
  }
}

1
Woher hast du importiert Timer?
Lucem

4
bekam esimport 'dart:async'
Lucem

Eine Modifikation wäre, timer = ...den initStateOverride einzufügen. Auf diese Weise haben Sie Zugriff darauf, widgetwas im State<>Konstruktor festgelegt ist.
Stevenspiel

Ich denke nicht, dass diese Antwort akzeptiert werden sollte, da sie nicht nur Code nach Verzögerung ausführt, sondern auch Code wiederholt. @ Rahul Sharma Lösung nur für Verzögerung ist viel besser.
Andris

Rahuls Antwort bricht den Timer nicht ab. Wenn Ihr Widget nicht mehr funktioniert, haben Sie sicher ein Leck? (Hinweis: Ich bin kein Flatterentwickler, ich habe dies vor ein paar Jahren einmal verwendet!)
Bradley Campbell

52

Aktionen nach dem Countdown auslösen

Timer(Duration(seconds: 3), () {
  print("Yeah, this line is printed after 3 seconds");
});

Aktionen wiederholen

Timer.periodic(Duration(seconds: 5), (timer) {
  print(DateTime.now());
});

Timer sofort auslösen

Timer(Duration(seconds: 0), () {
  print("Yeah, this line is printed immediately");
});

10

Fügen Sie einfach mehr Beschreibung zu den obigen Antworten hinzu

Die Timer-Funktion funktioniert auch mit der folgenden Zeitdauer:

const Duration(
      {int days = 0,
      int hours = 0,
      int minutes = 0,
      int seconds = 0,
      int milliseconds = 0,
      int microseconds = 0})

Beispiel:

  Timer(Duration(seconds: 3), () {
    print("print after every 3 seconds");
  });

6

(Hinzufügen einer Antwort auf altes q, da dies das Top-Ergebnis bei Google ist)

Ich habe versucht, innerhalb eines Blocks einen neuen Status im Rückruf zu erhalten, aber es hat nicht funktioniert. Versucht mit Timer und Future.delayed.

Was jedoch funktionierte, war ...

await Future.delayed(const Duration(milliseconds: 500));

yield newState;

Warten auf eine leere Zukunft und anschließende Ausführung der Funktion.



2
import 'dart:async';   
Timer timer;

void autoPress(){
  timer = new Timer(const Duration(seconds:2),(){
    print("This line will print after two seconds");
 });
}

autoPress();


1

Sie können es auf zwei Arten tun: 1 ist Future.delayedund 2 istTimer

Timer verwenden

Timer ist eine Klasse, die einen Countdown-Timer darstellt, der so konfiguriert ist, dass er nach Erreichen des Zeitendes eine Aktion auslöst und einmal oder wiederholt ausgelöst werden kann.

Stellen Sie sicher, dass Sie das dart:async Paket importieren  , um das zu verwendende Programm zu starten Timer

Timer(Duration(seconds: 5), () {
  print(" This line is execute after 5 seconds");
});

Verwenden von Future.delayed

Future.delayed Dies schafft eine Zukunft, die ihre Berechnung nach einer Verzögerung ausführt.

Stellen Sie sicher, dass Sie das import "dart:async"; Paket zum Starten des zu verwendenden Programms verpacken Future.delayed

Future.delayed(Duration(seconds: 5), () {
   print(" This line is execute after 5 seconds");
});

0

Lassen Sie hier einfach den Ausschnitt, nach dem jeder sucht:

Future.delayed(Duration(milliseconds: 100), () {
  // Do something
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.