Як запустити код після деякої затримки у Flutter?


123

Я хотів би виконати функцію через певну затримку після побудови мого віджета. Який ідіоматичний спосіб зробити це у Flutter?

Чого я намагаюся досягти: я хотів би розпочати з FlutterLogoвіджета за замовчуванням, а потім змінити його styleвластивість через деякий час.

Відповіді:


236

Ви можете використовувати Future.delayedдля запуску свого коду через деякий час. наприклад:

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

// Here you can write your code

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

});

У функції setState ви можете написати код, який пов'язаний з інтерфейсом програми, наприклад, оновити дані екрана, змінити текст мітки тощо.


Щоб уникнути попередження, перед викликом setState перевірте, що ваш віджет все ще встановлений
Том

68

Розібрався 😎

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
звідки ви імпортували Timer?
Lucem

4
зрозумівimport 'dart:async'
Lucem

однією модифікацією було б помістити timer = ...в initStateзаміну. Таким чином, ви маєте доступ до widgetякого встановлений у State<>конструкторі.
stevenspiel

Я не думаю, що цю відповідь слід прийняти, оскільки вона не просто запускає код після затримки, а й повторює код. Рішення @Rahul Sharma лише для затримки набагато краще.
Андріс

Відповідь Рахула не скасовує таймер, отже, якщо ваш віджет зникне, у вас є витік? (Примітка: Я не розробник пурхань, я використовував це один раз пару років тому!)
Бредлі Кемпбелл,

59

Тригерні дії після зворотного відліку

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

Повторіть дії

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

Таймер спрацьовування негайно

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

10

Просто додайте більше опису до наведених вище відповідей

Функція таймера працює також із часом тривалості нижче:

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

Приклад:

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

7

(Додавання відповіді на старий q, оскільки це найкращий результат у google)

Я спробував отримати новий стан у зворотному виклику в блоці, і це не спрацювало. Спробував з Таймером і Майбутнім. Затримано.

Однак те, що вдалося, було ...

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

yield newState;

Чекаючи порожнього майбутнього, а потім запустивши функцію згодом.



4

Ви можете зробити це двома способами 1 є Future.delayedі 2 єTimer

Використання таймера

Timer - це клас, який представляє таймер зворотного відліку, який налаштований на активацію дії після досягнення кінця часу, і він може запускатися один раз або кілька разів.

Не забудьте імпортувати  dart:async пакет для запуску програми для використання Timer

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

Використання Future.delayed

Future.delayed is створює майбутнє, яке виконує свої обчислення після затримки.

Переконайтеся, що import "dart:async"; упаковано до початку програми для використання Future.delayed

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

4

Просто залишаючи тут фрагмент, який усі шукають:

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();

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.