首页 > 解决方案 > 更新设置状态内的变量

问题描述

我对颤动相当陌生,我有一个颜色列表,我希望能够触摸一个容器并在列表中的不同颜色之间切换。这将更新容器的颜色。在这种情况下,我也可以有多个容器 2,因此触摸一个容器不应更新其他容器。

我让它使用一个容器工作,但是在创建了一个返回小部件的方法之后,我可以有多个容器,这不起作用。

 import 'package:flutter/material.dart';

class NewGame extends StatefulWidget {
  final Color team1;
  final Color team2;
  final Color team3;

  NewGame(this.team1, this.team2, this.team3);

  @override
  _NewGameState createState() => _NewGameState();
}

class _NewGameState extends State<NewGame> {
  List<Color> teamColors;
  int team1Index = 0;
  int team2Index = 0;

  @override
  void initState() {
    super.initState();
    teamColors = [widget.team1, widget.team2, widget.team3];
  }

  Widget _buildTeamSelector(int teamIndex) {   
    return GestureDetector(
                onTap: () {
                  setState(() {
                    print('Value of teamColorIndex ${teamIndex.toString()}');
                    if (teamIndex < teamColors.length - 1) {
                      teamIndex++;
                    } else {
                      teamIndex = 0;
                    }
                  });
                },
                child: Container(
                  height: 75,
                  width: 75,
                  decoration: BoxDecoration(
                    color: teamColors[teamIndex],
                    borderRadius: BorderRadius.circular(50),
                  ),
                ),
              );
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 5,
      child: Column(
        children: <Widget>[
          Column(
            children: <Widget>[
              Text('Value of team1Index: :$team1Index'),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Text('Teams:'),
                  _buildTeamSelector(team1Index),
                  _buildTeamSelector(team2Index),
                  Text('Red'),
                ],
              ),
            ],
          ),
        ],
      ),
    );
  }
}

I/flutter (12114): Value of teamColorIndex 0
I/chatty  (12114): uid=10085(com.example.game_tracker) Thread-2 identical 1 line
I/flutter (12114): Value of teamColorIndex 0
I/flutter (12114): Value of teamColorIndex 0
I/chatty  (12114): uid=10085(com.example.game_tracker) Thread-2 identical 4 lines
I/flutter (12114): Value of teamColorIndex 0
I/flutter (12114): Value of teamColorIndex 0

在 setState 中,变量似乎没有得到更新。我知道这是问题,但我不知道为什么。

标签: fluttersetstate

解决方案


您正在更新的变量不是您认为的变量。

您有两个具有相同名称的变量:

  • 的财产State
  • 的一个参数_buildTeamSelector

您在setState调用中更改的不是State属性,而是方法的参数。

代替:

int a;
void foo(int a) {
  a++;
}

做:

int a;
void foo(int a) {
  this.a++; //properly update the instance member instead of the parameter
}

推荐阅读