Jak uruchomić kod po pewnym opóźnieniu we Flutterze?

123

Chciałbym wykonać funkcję po pewnym opóźnieniu po zbudowaniu mojego Widżetu. Jaki jest idiomatyczny sposób na zrobienie tego we Flutterze?

Co próbuję osiągnąć: chciałbym zacząć od domyślnego FlutterLogoWidżetu, a stylepo pewnym czasie zmienić jego właściwość.

Bradley Campbell
źródło

Odpowiedzi:

236

Możesz użyć Future.delayeddo uruchomienia kodu po pewnym czasie. na przykład:

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

// Here you can write your code

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

});

W funkcji setState możesz napisać kod powiązany z interfejsem aplikacji, np. Odświeżyć dane ekranu, zmienić tekst etykiety itp.

Rahul Sharma
źródło
Aby uniknąć ostrzeżenia, przed wywołaniem setState
Tom
68

Rozgryzłem to 😎

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
źródło
1
skąd importowałeś Timer?
Lucem
4
got itimport 'dart:async'
lucem
jedna modyfikacja byłoby umieścić timer = ...w initStateręcznym. W ten sposób masz dostęp do tego, widgetktóry jest ustawiony w State<>konstruktorze.
stevenspiel
Nie sądzę, aby ta odpowiedź była akceptowana, ponieważ nie tylko uruchamia kod z opóźnieniem, ale także powtarza kod. Rozwiązanie @Rahul Sharma tylko dla opóźnienia jest znacznie lepsze.
Andris
Odpowiedź Rahula nie anuluje timera, więc na pewno, jeśli twój widget zniknie, masz wyciek? (Uwaga: nie jestem programistą flutter, użyłem tego raz kilka lat temu!)
Bradley Campbell
59

Wyzwalaj akcje po odliczaniu

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

Powtórz czynności

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

Natychmiast uruchom licznik czasu

Timer(Duration(seconds: 0), () {
  print("Yeah, this line is printed immediately");
});
jai khambhayta
źródło
10

Dodam tylko więcej opisu do powyższych odpowiedzi

Funkcja Timer działa również z poniższym czasem trwania:

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

Przykład:

  Timer(Duration(seconds: 3), () {
    print("print after every 3 seconds");
  });
jitsm555
źródło
7

(Dodawanie odpowiedzi na stary q, ponieważ jest to najlepszy wynik w google)

Próbowałem uzyskać nowy stan w wywołaniu zwrotnym w bloku i to nie zadziałało. Próbowałem z Timerem i Future. Opóźnione.

Jednak zadziałało ...

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

yield newState;

Oczekiwanie na pustą przyszłość, a następnie uruchomienie funkcji.

Ovidius Mazuru
źródło
6

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

SR Keshav
źródło
czas trwania można dodać: Czas trwania (sekundy: 3) dla nowej pszczoły
Abhishek Thapliyal
4

Możesz to zrobić na dwa sposoby: 1 to Future.delayedi 2 toTimer

Korzystanie z timera

Timer to klasa reprezentująca licznik czasu, który jest skonfigurowany do wyzwalania akcji po osiągnięciu końca czasu i może uruchamiać się raz lub wielokrotnie.

Pamiętaj, aby zaimportować  dart:async pakiet, aby uruchomić program do użycia Timer

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

Korzystanie z Future.delayed

Future.delayed tworzy przyszłość, która wykonuje obliczenia z opóźnieniem.

Upewnij się, że import "dart:async"; pakiet, aby uruchomić program do użycia Future.delayed

Future.delayed(Duration(seconds: 5), () {
   print(" This line is execute after 5 seconds");
});
Paresh Mangukiya
źródło
4

Zostawiam tutaj fragment, którego wszyscy szukają:

Future.delayed(Duration(milliseconds: 100), () {
  // Do something
});
Armands L.
źródło
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
źródło
1

await Future.delayed (Duration (milliseconds: 1000));

Mohammad Hadi
źródło