Flutter 构建方法使用的是旧版本的变量?

Flutter build method is using old version of variable?

提问人:DR4NKR1D3R 提问时间:1/14/2023 更新时间:1/14/2023 访问量:45

问:

我正在制作 flutter 中的蛇游戏,但我遇到了一个问题。我正在 gameTick 方法(蛇变量)中更改我的蛇位置 - 工作正常,然后我在构建方法(网格变量)中生成新的网格 - 工作正常,最后构建方法应该返回小部件树。但是我在屏幕上看不到变化。看起来构建方法正在使用旧的网格变量构建应用程序。

我删除了一些不相关的代码。谢谢你的帮助。

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,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
颤飞

评论


答:

1赞 nvoigt 1/14/2023 #1

我认为不缓存容器会更容易。创建 121 个新部分并标记蛇形部分。你甚至可以在“gametick”中做到这一点,因为它只会在“gametick”上真正改变,没有必要在每次构建时都这样做。

此外,gametick 只需要一个,而不是一个循环中的多个。您不希望在构建新游戏状态多次调用生成方法。setState

您的 gametick 方法应该执行所有计算。然后创建一个新网格(可能从头开始比修改旧网格更容易)。然后,它应该调用一次setState

评论

1赞 DR4NKR1D3R 1/14/2023
做了你说的一切。网格正在更新。我有一些错误,但没有什么是我无法修复的。谢谢。