重启 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 key
和super(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_ME
和 example.dart
文件以获取详细信息。谢谢
嘿,我正在尝试让 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 key
和super(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_ME
和 example.dart
文件以获取详细信息。谢谢