我在玩Flutter 打中的蛇游戏,但我有个问题.我正在改变我在GameTick方法中的蛇形位置(蛇形变量)--工作得很好,然后我在Build方法(网格变量)中生成新的网格--工作得很好,最后Build方法应该返回窗口小部件树.但我在屏幕上看不到变化.看起来构建方法正在使用旧的网格变量构建应用程序.

我删除了一些无关的代码.谢谢你的帮助.

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:swipe/swipe.dart';

void main() {
  runApp(
    MaterialApp(
      title: 'snake',
      theme: ThemeData(
        brightness: Brightness.dark,
        primaryColor: Colors.blueGrey,
      ),
      home: Game(),
    ),
  );
}

class Game extends StatefulWidget {
  const Game({Key? key}) : super(key: key);

  @override
  State<Game> createState() => _GameState();
}

class _GameState extends State<Game> {
  List<List<int>> snake = [
    [5, 5],
    [6, 5],
    [7, 5]
  ];
  List<Container> grid = List.filled(121, Container());
  Timer? timer;

  @override
  void initState() {
    Timer.periodic(Duration(seconds: 1), (Timer t) => gameTick());
    super.initState();
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }

  void gameTick() {
    for (List<int> pair in snake) {
      setState(
        () {
          pair[0]--;
        },
      );
    }
  }

  @override
  Widget build(BuildContext context) {

    for (int i = 0; i < 121; i++) {
      int row = (i / 11).floor();
      int col = i % 11;

      for (List<int> pair in snake) {
        int snakeRow = pair[0];
        int snakeCol = pair[1];

        if ((snakeRow == row) && (snakeCol == col)) {
          grid[i] = Container(
            decoration: BoxDecoration(
              color: Colors.greenAccent,
              border: Border.all(color: Color(0xFF383434), width: 2),
            ),
          );
          break;
        } else {
          grid[i] = Container(
            decoration: BoxDecoration(
              border: Border.all(color: Colors.greenAccent, width: 2),
            ),
          );
        }
      }
    }

    return Scaffold(
      body: SizedBox.expand(
        child: Swipe(
          onSwipeUp: () {SOMECODE});
            }
          },
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                child: GridView.count(
                  physics: NeverScrollableScrollPhysics(),
                  crossAxisCount: 11,
                  children: grid,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

推荐答案

我认为不缓存容器会更容易一些.创建121个新的,并标记为蛇的部分.你甚至可以在"Gametick"中做到这一点,因为它只在"Gametick"上改变,没有必要在每个版本上都这样做.

此外,Gametick只需要一个setState,而不是循环中的多个1.您不想多次调用您的Build方法while您正在构造新的游戏状态.

您的Gametick方法应该可以完成所有计算.然后创建一个新的网格(可能从头开始比修改旧网格更容易).然后,它应该拨打setState once.

Flutter相关问答推荐

ListTile未正确显示在flutter中

如何防止alert 对话框在收到通知时出现在某个flutter页面中

Flutter -使用最小高度展开

如何在Flutter 中不从getX库中初始化GetxController中的变量

在框中保存对象列表时,类型推断无法正常工作

如何在应用程序中使用Fflight显示表情包

我想在Flutter中画一个箭头,但我似乎无法填满空间

我怎样才能在Ffltter中显示html布局链接?

在VSCode中运行应用程序而不进行调试时,控制台仍显示为调试模式

如何在巡逻测试期间重新启动dart 侧应用程序状态?

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

使用 riverpod 提供 GoRouter 实例的正确方法是什么?

如何从另一个页面访问 Firebase 值?

在 flutter 的另一个类中使用变量值

我在弹出框中编辑后无法保存日期

如何在 flutter 中制作这种类型的扩展瓦片

我可以使用 Future 来填充Text() 小部件而不是在 Flutter 中使用 FutureBuilder 吗?

运行Flutter 测试时出现 FirebaseAppPlatform.verifyExtends 错误

如何在 CircleAvatar 中使用 Stack

如何在Flutter 中一次判断共享首选项中是否存在多个值