Flutter'da biraz gecikmeden sonra kod nasıl çalıştırılır?


115

Widget'ım oluşturulduktan sonra belirli bir gecikmeden sonra bir işlevi yürütmek istiyorum. Flutter'da bunu yapmanın deyimsel yolu nedir?

Başarmaya çalıştığım şey: Varsayılan bir FlutterLogoWidget ile başlamak ve bir stylesüre sonra özelliğini değiştirmek istiyorum .

Yanıtlar:


212

Future.delayedKodunuzu bir süre sonra çalıştırmak için kullanabilirsiniz . Örneğin:

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

// Here you can write your code

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

});

SetState işlevinde, uygulama kullanıcı arayüzüyle ilgili bir kod yazabilirsiniz, ör. Ekran verilerini yenileme, etiket metnini değiştirme vb.


66

Anladım 😎

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
nerede içe mi Timerdan?
Lucem

4
anladımimport 'dart:async'
Lucem

bir değişiklik timer = ..., initStategeçersiz kılmaya koymak olacaktır . Bu şekilde, yapıcıda widgetayarlanmış olana erişiminiz olur State<>.
stevenspiel

Bunun kabul edilmesi gerektiğini düşünmüyorum, çünkü gecikmeden sonra kodu çalıştırmakla kalmıyor, aynı zamanda kodu da tekrar ediyor. @Rahul Sharma sadece gecikme için çözüm çok daha iyi.
Andris

Rahul'un cevabı zamanlayıcıyı iptal etmez, bu yüzden widget'ınız kaybolursa bir sızıntı var mı? (Not: Flutter geliştiricisi değilim, bunu birkaç yıl önce bir kez kullandım!)
Bradley Campbell

53

Geri sayımdan sonra eylemleri tetikleyin

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

Eylemleri tekrarlayın

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

Zamanlayıcıyı hemen tetikle

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

10

Sadece yukarıdaki cevapların üzerine daha fazla açıklama eklemek

Zamanlayıcı işlevi aynı zamanda aşağıdaki sürelerde de çalışır:

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

Misal:

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

6

(Google'daki en iyi sonuç olduğu için eski q'ya yanıt ekleniyor)

Bir blok içindeki geri aramada yeni bir durum sağlamayı denedim ve işe yaramadı. Timer ve Future.delayed ile denendi.

Ancak, işe yarayan şey ...

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

yield newState;

Boş bir gelecek bekliyor ve ardından işlevi çalıştırmak.



2
import 'dart:async';   
Timer timer;

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

autoPress();

2

1 eşittir Future.delayedve 2 eşittir iki şekilde yapabilirsinizTimer

Zamanlayıcıyı Kullanma

Timer Zamanın sonuna gelindiğinde bir eylemi tetiklemek üzere yapılandırılmış bir geri sayım zamanlayıcısını temsil eden bir sınıftır ve bir veya tekrar tekrar tetiklenebilir.

dart:async Kullanılacak programın başlangıcına paketi içe aktardığınızdan  emin olun Timer

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

Future.delayed kullanma

Future.delayed hesaplamasını bir gecikmeden sonra çalıştıran bir gelecek yaratır.

Kullanılacak import "dart:async"; programı başlatmak için paketlediğinizden  emin olun Future.delayed

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


0

Burada herkesin aradığı pasajı bırakalım:

Future.delayed(Duration(milliseconds: 100), () {
  // Do something
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.