Передать текст в RaisedButton OnTap - Flutter - PullRequest
0 голосов
/ 27 марта 2019

Я новичок во Флаттере, и у меня много проблем с игрой в крестики-нолики. Он работает в консоли, но я не могу понять, как заставить игру работать в графическом интерфейсе, который я построил.

Я знаю, что мне нужен какой-то массив для кнопок игры, но я не уверен, как это реализовать. Я построил игровую доску со строками и столбцами так:

      body: new Container(
          padding: EdgeInsets.all(14.0),
          child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                Row(
                  //Start of the 1st Row
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[
                      // Button 0 in 1st Row
                      RaisedButton(
                        padding: const EdgeInsets.all(20.0),
                        onPressed: () {
                          _button0();
                        },
                        child: new Text(_mBoard[0],
                            textAlign: TextAlign.center,
                            style: new TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 40.0,
                              fontFamily: 'Roboto',
                            )),
                        color: Colors.grey[300],
                      ),

Это _button0, который вызывается в первой функции RaisedButton onPressed. Они идут до 8.

  void _button0() {
    setState(() {
      if (_mBoard[0] == humanPlayer || _mBoard[0] == computerPlayer) {
        return;
      } else if (win == 0) {
        if (turn == 0) {
          _mBoard[0] = humanPlayer;
          _text = humanPlayer + " MOVED, O's TURN";
          turn = 1;
          win = checkWinner();
          checkGameOver(win);
          displayBoard();
        }
        if ((turn == 1) && (win == 0)) {
          turn = 0;
          computerTurn();
          win = checkWinner();
          checkGameOver(win);
          displayBoard();
        }
      }
    });
  }

Печать с консоли на консоль:

void displayBoard() {
  print(_mBoard[0] + " | " + _mBoard[1] + " | " + _mBoard[2]);
  print("-----------");
  print(_mBoard[3] + " | " + _mBoard[4] + " | " + _mBoard[5]);
  print("-----------");
  print(_mBoard[6] + " | " + _mBoard[7] + " | " + _mBoard[8]);
}

Я ожидаю, что пользовательский выбор RaisedButton отобразит «X», а выбор компьютера - «O».

1 Ответ

0 голосов
/ 27 марта 2019

Вы включили как часть, где обновлено значение _mBoard, так и метод displayBoard () внутри setState ().Как только вы вызовете setState (), он уведомит StatefulWidget об обновлении представления.Но вы вызываете displayBoard () внутри setState, и этот метод еще не обновил значение _mBoard.

Есть два способа решения этой проблемы:

  • Передача_mBoard в качестве параметра для displayBoard (_mBoard), поэтому он будет обращаться к локальному значению _mBoard, а не к состоянию.

  • Вызов displayBoard после вызова setState ().

...