我正在使用迷宫酒吧包:https://pub.dev/packages/maze。我想创造一个小游戏,将计数时间从打开这个屏幕,直到到达终点线。所以我试着在开始的时候设置计时器,但是当我想保存这些数据以共享prefs时,我得到了00:00,而不是显示在屏幕上的时间。
class MazeScreen extends StatefulWidget {
const MazeScreen({Key? key}) : super(key: key);
@override
_MazeScreenState createState() => _MazeScreenState();
}
class _MazeScreenState extends State<MazeScreen> {
Duration duration = Duration();
Timer? timer ;
@override
void initState() {
super.initState();
startTimer();
}
void reset() {
setState(() {
timer?.cancel();
});
}
void addTime() {
const addSeconds = 1;
setState(() {
final seconds = duration.inSeconds + addSeconds;
duration = Duration(seconds: seconds);
});
}
void startTimer() {
timer = Timer.periodic(Duration(seconds: 1), (_) => addTime());
}
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
String twoDigits(int n) => n.toString().padLeft(2, '0');
final minutes = twoDigits(duration.inMinutes.remainder(60));
final seconds = twoDigits(duration.inSeconds.remainder(60));
return Scaffold(
body: Stack(children: <Widget>[
Container(
// Here the height of the container is 45% of our total height
height: size.height * .35,
decoration: const BoxDecoration(
color: Color(0xFF3d405b),
),
),
SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
MemoryCard("time", "$minutes:$seconds"),
],
),
Expanded(
flex: 2,
child: Container(
alignment: AlignmentDirectional.center,
padding: const EdgeInsets.all(10.0),
child: const Text(
'Maze game',
style: TextStyle(
color: Color(0xFFe07a5f),
fontSize: 25.0,
fontStyle: FontStyle.italic,
),
),
),
),
Expanded(
flex: 9,
child: Stack(
children: [
Container(
margin: const EdgeInsets.symmetric(vertical: 20.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.0),
color: const Color(0xFFf4f1de),
),
),
Maze(
player: MazeItem(
'assets/start.png',
ImageType.asset,
),
columns: 7,
rows: 7,
wallThickness: 3.0,
wallColor: const Color(0xFF81b29a),
finish: MazeItem(
'assets/finish.png',
ImageType.asset,
),
onFinish: () async {
reset();
final prefs = await SharedPreferences.getInstance();
await prefs.setString("mazeTimer", '$minutes:$seconds');
},
),
],
),
),
],
),
),
),
]),
);
}
}
当我这样做的时候我得到了00:00。
发布于 2022-06-13 11:15:53
您需要将状态中的minute / second
作为变量处理,就像处理duration
一样,这是它们代表状态的位置。
每次duration
更新时计算它们。然后,可以在此调用中显示或使用这些计算值:
await prefs.setString("mazeTimer", ... );
00:00
被保存的原因是函数onFinish: ()
在开始时被初始化一次,而当final
值分钟和秒实际上是00:00
时。
试着做这样的事情:
class _MazeScreenState extends State<MazeScreen> {
Duration duration = Duration();
Timer? timer ;
String minutes = '00'; // it may be better to store an int, not a String
String seconds = '00'; // it may be better to store an int, not a String
...
void addTime() {
const addSeconds = 1;
setState(() {
final seconds = duration.inSeconds + addSeconds;
duration = Duration(seconds: seconds);
minutes = ... // ADD CALCULATION HERE
seconds = ... // ADD CALCULATION HERE
});
}
}
第二种方法是在这里计算分钟和秒,但最终代码中会出现多次minutes / seconds
,这是多余的:
onFinish: () async {
reset();
final prefs = await SharedPreferences.getInstance();
final min = ... // CALCULATE HERE
final sec= ... // CALCULATE HERE
await prefs.setString("mazeTimer", '$min:$sec');
}
https://stackoverflow.com/questions/72601587
复制相似问题