使用给定数据创建计时器
Create Timer With Given Data
我有一个应用程序可以从后端获取小时和分钟数。每次调用应用程序时,来自后端的数据都会保存在共享首选项中。当他的用户没有互联网连接时,我会显示与用户在互联网上看到的相同的屏幕,只是使用保存在共享首选项中的数据。数据的一部分是一个计时器,我从后端获取小时和分钟,每次我进行 API 调用时,小时和分钟都会更新。我现在想要的是从共享首选项中获取数据来创建一个计时器,其中的数据保存在共享首选项中。我需要更新分钟和小时,就像使用具有互联网连接的普通数据一样工作。因此,当没有互联网连接时,我们会显示数据,我需要创建计时器来更新分钟和小时,这样即使没有互联网,用户也可以看到计时器更新。因此,如果共享首选项中的分钟和小时保存为:1 小时:6 分钟。我需要做到这一点,这样时间才会继续,分钟和小时也会不断更新。所以 60 秒后分钟将是 7 分钟,54 分钟后将是 2 小时,并且在没有任何开始按钮的情况下打开屏幕时该过程立即开始。
// Saving data from api in shared preferences
body: FutureBuilder<Response>(
future: futureDataForStatus,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
accountInfo = WorkingLocationStatus.fromJson(
json.decode(snapshot.data!.body),
);
final duration = IsoDuration.parse(
accountInfo!.duration.toString(),
);
prefs.setDouble('workingHours', duration.hours);
prefs.setDouble('workingMinutes', duration.minutes);
return Column(
// Displaying the saved data
class OffilneWorkingHoursMinutes extends StatefulWidget {
const OffilneWorkingHoursMinutes({Key? key}) : super(key: key);
@override
State<OffilneWorkingHoursMinutes> createState() =>
_OffilneWorkingHoursMinutesState();
}
class _OffilneWorkingHoursMinutesState
extends State<OffilneWorkingHoursMinutes> {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'${prefs.getDouble('workingHours')!.toStringAsFixed(0)} hrs - '
'${prefs.getDouble('workingMinutes')!.toStringAsFixed(0)} mins ',
style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
);
}
}
看看这个例子,我认为它可能有所帮助,只需根据您的需要进行调整:
class OffilneWorkingHoursMinutes extends StatefulWidget {
const OffilneWorkingHoursMinutes({Key? key}) : super(key: key);
@override
State<OffilneWorkingHoursMinutes> createState() =>
_OffilneWorkingHoursMinutesState();
}
class _OffilneWorkingHoursMinutesState
extends State<OffilneWorkingHoursMinutes> {
var time = Time(hours: 1, minutes: 6, seconds: 0); // pass your time from backend here
@override
void initState() {
Timer.periodic(const Duration(seconds: 1), (timer) { // use timer when you are offline and cancel it when you are back online
setState(() {
if (time.seconds < 59) {
time.seconds++;
} else {
if (time.minutes < 59) {
time.minutes++;
} else {
time.minutes = 0;
time.hours++;
}
time.seconds = 0;
}
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'${time.hours} hrs - '
'${time.minutes} mins - '
'${time.seconds} sec ',
style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
);
}
}
class Time {
int hours;
int minutes;
int seconds;
Time({
this.hours = 0,
this.minutes = 0,
this.seconds = 0,
});
}
我有一个应用程序可以从后端获取小时和分钟数。每次调用应用程序时,来自后端的数据都会保存在共享首选项中。当他的用户没有互联网连接时,我会显示与用户在互联网上看到的相同的屏幕,只是使用保存在共享首选项中的数据。数据的一部分是一个计时器,我从后端获取小时和分钟,每次我进行 API 调用时,小时和分钟都会更新。我现在想要的是从共享首选项中获取数据来创建一个计时器,其中的数据保存在共享首选项中。我需要更新分钟和小时,就像使用具有互联网连接的普通数据一样工作。因此,当没有互联网连接时,我们会显示数据,我需要创建计时器来更新分钟和小时,这样即使没有互联网,用户也可以看到计时器更新。因此,如果共享首选项中的分钟和小时保存为:1 小时:6 分钟。我需要做到这一点,这样时间才会继续,分钟和小时也会不断更新。所以 60 秒后分钟将是 7 分钟,54 分钟后将是 2 小时,并且在没有任何开始按钮的情况下打开屏幕时该过程立即开始。
// Saving data from api in shared preferences
body: FutureBuilder<Response>(
future: futureDataForStatus,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
accountInfo = WorkingLocationStatus.fromJson(
json.decode(snapshot.data!.body),
);
final duration = IsoDuration.parse(
accountInfo!.duration.toString(),
);
prefs.setDouble('workingHours', duration.hours);
prefs.setDouble('workingMinutes', duration.minutes);
return Column(
// Displaying the saved data
class OffilneWorkingHoursMinutes extends StatefulWidget {
const OffilneWorkingHoursMinutes({Key? key}) : super(key: key);
@override
State<OffilneWorkingHoursMinutes> createState() =>
_OffilneWorkingHoursMinutesState();
}
class _OffilneWorkingHoursMinutesState
extends State<OffilneWorkingHoursMinutes> {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'${prefs.getDouble('workingHours')!.toStringAsFixed(0)} hrs - '
'${prefs.getDouble('workingMinutes')!.toStringAsFixed(0)} mins ',
style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
);
}
}
看看这个例子,我认为它可能有所帮助,只需根据您的需要进行调整:
class OffilneWorkingHoursMinutes extends StatefulWidget {
const OffilneWorkingHoursMinutes({Key? key}) : super(key: key);
@override
State<OffilneWorkingHoursMinutes> createState() =>
_OffilneWorkingHoursMinutesState();
}
class _OffilneWorkingHoursMinutesState
extends State<OffilneWorkingHoursMinutes> {
var time = Time(hours: 1, minutes: 6, seconds: 0); // pass your time from backend here
@override
void initState() {
Timer.periodic(const Duration(seconds: 1), (timer) { // use timer when you are offline and cancel it when you are back online
setState(() {
if (time.seconds < 59) {
time.seconds++;
} else {
if (time.minutes < 59) {
time.minutes++;
} else {
time.minutes = 0;
time.hours++;
}
time.seconds = 0;
}
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'${time.hours} hrs - '
'${time.minutes} mins - '
'${time.seconds} sec ',
style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
);
}
}
class Time {
int hours;
int minutes;
int seconds;
Time({
this.hours = 0,
this.minutes = 0,
this.seconds = 0,
});
}