I am trying to use the method periodic
of the class Timer
inside a class which extends of the class ChangeNotifier
(of the package
On the other hand, if I uncomment the NotifyListeners
method, the code starts executing more and more times per second exponentially (for example, first it executes once, then twice, then 5, then 9 and so on):
Here is the code where I call the method chronometer
:
class PriceWithClock extends StatelessWidget {
@override
Widget build(BuildContext context) {
PriceProvider priceProvider = Provider.of<PriceProvider>(context);
priceProvider.chronometer();
return CircularPercentIndicator(
radius: 100.0,
lineWidth: 5.0,
percent: 1-priceProvider.time/60,
center: Text("00:${priceProvider.time}"),
),
);
}
}
CodePudding user response:
You should not put the priceProvider.chronometer();
inside the build method since it will be executed on every PriceWithClock
widget build. And in your case, it would happen every second.
What you can do, is create a Stateful widget and trigger the chronometer inside the initState()
method:
class PriceWithClock extends StatefulWidget {
@override
State<StatefulWidget> createState() => _PriceWithClockState();
}
class _PriceWithClockState extends State<PriceWithClock> {
@override
void initState() {
super.initState();
context.read<PriceProvider>().chronometer();
}
@override
Widget build(BuildContext context) {
...
}
}
As for the build
method, you could use the context.watch
Provider extension method to listen to the updated time
value:
class _PriceWithClockState extends State<PriceWithClock> {
...
@override
Widget build(BuildContext context) {
final time = context.watch<PriceProvider>().time;
return CircularPercentIndicator(
radius: 100.0,
lineWidth: 5.0,
percent: 1 - time / 60,
center: Text("00:$time"),
);
}
}
The final result looks like this:
class PriceWithClock extends StatefulWidget {
@override
State<StatefulWidget> createState() => _PriceWithClockState();
}
class _PriceWithClockState extends State<PriceWithClock> {
@override
void initState() {
super.initState();
context.read<PriceProvider>().chronometer();
}
@override
Widget build(BuildContext context) {
final time = context.watch<PriceProvider>().time;
return CircularPercentIndicator(
radius: 100.0,
lineWidth: 5.0,
percent: 1 - time / 60,
center: Text("00:$time"),
);
}
}