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ść.

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.


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

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

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

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.



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

4

Zostawiam tutaj fragment, którego wszyscy szukają:

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

2
import 'dart:async';   
Timer timer;

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

autoPress();

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.