จะเรียกใช้โค้ดหลังจากเกิดความล่าช้าใน 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 คุณสามารถเขียนโค้ดที่เกี่ยวข้องกับ UI ของแอพได้เช่นข้อมูลหน้าจอรีเฟรชเปลี่ยนข้อความฉลาก ฯลฯ


เพื่อหลีกเลี่ยงการเตือนให้ตรวจสอบว่าวิดเจ็ตของคุณยังคงติดตั้งอยู่ก่อนที่จะเรียกใช้ setState
Tom

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 การแก้ปัญหาสำหรับความล่าช้าจะดีกว่ามาก
Andris

คำตอบของราหุลไม่ได้ยกเลิกตัวจับเวลาดังนั้นหากวิดเจ็ตของคุณหายไปคุณมีการรั่วไหลหรือไม่? (หมายเหตุ: ฉันไม่ใช่นักพัฒนาที่กระพือปีกฉันเคยใช้สิ่งนี้เมื่อสองสามปีก่อน!)
Bradley Campbell

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

เพียงแค่เพิ่มคำอธิบายมากกว่าคำตอบข้างต้น

ฟังก์ชัน Timer ทำงานร่วมกับช่วงเวลาด้านล่างด้วย:

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

คุณสามารถทำได้ 2 วิธีคือ 1 Future.delayedและ 2 คือTimer

การใช้ Timer

Timer เป็นคลาสที่แสดงถึงตัวจับเวลานับถอยหลังที่กำหนดค่าให้ทริกเกอร์การดำเนินการเมื่อถึงเวลาสิ้นสุดและสามารถเริ่มทำงานหนึ่งครั้งหรือซ้ำ ๆ

อย่าลืมนำเข้า  dart:async แพ็กเกจเพื่อเริ่มโปรแกรมที่จะใช้ Timer

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

ใช้ Future.delayed

Future.delayed สร้างอนาคตที่ดำเนินการคำนวณหลังจากความล่าช้า

ตรวจสอบให้แน่ใจว่าได้จัด 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
});


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.