重启 CircularCountdownTimer flutter onComplete

Restart CircularCountdownTimer flutter onComplete

嘿,我正在尝试让 CircularCountDownTimer 在每次数到 60 时重新启动,

我希望它与 onComplete() 有关,但我不知道如何重新启动它。

感谢任何帮助,谢谢。
这是 CircularTimer 小部件:

                        CircularCountDownTimer(

                          duration: 60,
                          width: MediaQuery.of(context).size.width,
                          height: MediaQuery.of(context).size.height,
                          color: Colors.grey[300],
                          fillColor: Colors.yellow[800],
                          strokeWidth: 4.0,
                          textStyle: TextStyle(
                              fontSize: 0.0,
                              color: Colors.black87,
                              fontWeight: FontWeight.bold),

                          isReverse: false,

                          
                          onComplete: () {

                            setState(() {
                              min --;
                            });
                            
                          },
                        )

您可以使用 provider 包中的 ChangeNotifier 来重建小部件。这是一个例子。

import 'package:circular_countdown_timer/circular_countdown_timer.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => ChangeWidget()),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: Consumer<ChangeWidget>(
            builder: (context, snapshot, _) {
              return snapshot.init;
            },
          ),
        ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){
          Provider.of<ChangeWidget>(context, listen: false)
              .playPause();
        },
        child: Icon(Icons.close),
      ),
    );
  }
}

class ChangeWidget extends ChangeNotifier {
  int _i = 0;
  bool _run = true;
  playPause(){
    if(_run){
      _run = false;
    }else{
      _run = true;
      restart();
    }
  }
  Widget init = Builder(
      key: Key("0"),
      builder: (context) => CircularCountDownTimer(
            duration: 10,
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height,
            color: Colors.grey[300],
            fillColor: Colors.yellow[800],
            strokeWidth: 4.0,
            textStyle: TextStyle(
                fontSize: 0.0,
                color: Colors.black87,
                fontWeight: FontWeight.bold),
            isReverse: false,
            onComplete: () {
              Provider.of<ChangeWidget>(context, listen: false)
                  .restart();
            },
          ));

  restart() {
    _i++;
    init = Builder(
        key: Key(_i.toString()),
        builder: (context) => CircularCountDownTimer(
              duration: 10,
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.height,
              color: Colors.grey[300],
              fillColor: Colors.yellow[800],
              strokeWidth: 4.0,
              textStyle: TextStyle(
                  fontSize: 0.0,
                  color: Colors.black87,
                  fontWeight: FontWeight.bold),
              isReverse: false,
              onComplete: () {
                if(_run){
                  restart();
                }
              },
            ));
    notifyListeners();
  }
}

您可以复制粘贴运行下面的完整代码
您可以在CircularCountDownTimer中添加Key,当在onComplete中调用setState时,CircularCountDownTimer将重新启动,参见工作演示
出于演示目的,我使用 10 秒

第一步:修改circular_countdown_timer.dart的源码,在constructor

中添加Key keysuper(key: key)
    CircularCountDownTimer(
      { Key key,  //add here
        @required this.width,
      @required this.height,
      @required this.duration,
      @required this.fillColor,
      @required this.color,
      this.isReverse,
      this.onComplete,
      this.strokeWidth,
      this.textStyle})  :
        assert(width != null),
  assert(height != null),
  assert(duration != null),
  assert(fillColor != null),
  assert(color != null)
  , super(key: key); //add here

第 2 步:在您的代码中,将 UniqueKey() 提供给 CircularCountDownTimer

child: CircularCountDownTimer(
          key: UniqueKey(),

工作演示

完整代码

import 'package:flutter/material.dart';
import 'package:circular_countdown_timer/circular_countdown_timer.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Circular Countdown Timer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Circular Countdown Timer'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
            child: CircularCountDownTimer(
          key: UniqueKey(),
          duration: 10,
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height,
          color: Colors.grey[300],
          fillColor: Colors.yellow[800],
          strokeWidth: 4.0,
          textStyle: TextStyle(
              fontSize: 0.0,
              color: Colors.black87,
              fontWeight: FontWeight.bold),
          isReverse: false,
          onComplete: () {
            print("complete");
            setState(() {
              //min--;
            });
          },
        )));
  }
}

我更新了我的包 circular_countdown_timer 并添加了名为 controller 的可选 CountDownController 参数,用于控制(即暂停、恢复、重新启动)倒数计时器。您可以进一步检查包的 READ_MEexample.dart 文件以获取详细信息。谢谢