首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置maze_game软件包的定时器?

如何设置maze_game软件包的定时器?
EN

Stack Overflow用户
提问于 2022-06-13 10:48:26
回答 1查看 32关注 0票数 0

我正在使用迷宫酒吧包:https://pub.dev/packages/maze。我想创造一个小游戏,将计数时间从打开这个屏幕,直到到达终点线。所以我试着在开始的时候设置计时器,但是当我想保存这些数据以共享prefs时,我得到了00:00,而不是显示在屏幕上的时间。

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 11:15:53

您需要将状态中的minute / second作为变量处理,就像处理duration一样,这是它们代表状态的位置。

每次duration更新时计算它们。然后,可以在此调用中显示或使用这些计算值:

await prefs.setString("mazeTimer", ... );

00:00被保存的原因是函数onFinish: ()在开始时被初始化一次,而当final值分钟和秒实际上是00:00时。

试着做这样的事情:

代码语言:javascript
运行
复制
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,这是多余的:

代码语言:javascript
运行
复制
onFinish: () async {  
  reset();
  final prefs = await SharedPreferences.getInstance();
  final min = ... // CALCULATE HERE
  final sec= ... // CALCULATE HERE
  await prefs.setString("mazeTimer", '$min:$sec');
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72601587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档