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 .

Bradley Campbell
quelle

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.

Rahul Sharma
quelle
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,
    );
  }
}
Bradley Campbell
quelle
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");
});
Jai Khambhayta
quelle
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");
  });
jitsm555
quelle
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.

Ovidius Mazuru
quelle
5

Future.delayed(Duration(seconds: 3) , your_function)

SR Keshav
quelle
Dauer kann hinzugefügt werden: Dauer (Sekunden: 3) für neue Biene
Abhishek Thapliyal
2
import 'dart:async';   
Timer timer;

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

autoPress();
Chanuka Gayantha
quelle
1

warte auf Future.delayed (Dauer (Millisekunden: 1000));

Mohammad Hadi
quelle
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");
});
Paresh Mangukiya
quelle
0

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

Future.delayed(Duration(milliseconds: 100), () {
  // Do something
});
Armands L.
quelle