Почему объект с состоянием flutter's List не работает должным образом - PullRequest
0 голосов
/ 11 ноября 2019

Я хотел сделать простую настольную игру Шульте во флаттере. Я создал виджет с сохранением состояния OneNumber, чтобы изменить его фон с помощью onPanStart GestureDetector. Это сработало, но когда я создал список чисел = [];и добавил его элементы и показал числа [0] вместо непосредственного помещения OneNumber, он не меняет свой фон, я думаю, что функция onPanStart не работает. Почему? ,Что ты предлагаешь? Я хотел создать список, чтобы перемешать номера. Вот мой код

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class SchulteTable extends StatefulWidget {
  @override
  _SchulteTableState createState() => _SchulteTableState();
}

int current = 1;
Color textColor = Colors.white;
Color acceptedNumber = Colors.green;
Color rejectedNumber = Colors.red;
Color borderColor = Colors.white;
List<Color> buttonDefault = [];
List<OneNumber>numbers=[];

class _SchulteTableState extends State<SchulteTable> {
  @override
  Widget build(BuildContext context) {
    for(int i=0; i<25; i++) {
      buttonDefault.add(Colors.transparent);
    }
//    for(int i=0; i<25; i++){
//      numbers.add(
//        OneNumber(
//          number: i+1,
//          checkFunction: (DragStartDetails details) {
//            setState(() {
//              if (i+1 == current) {
//                buttonDefault[i] = acceptedNumber;
//                current++;
//              } else {
//                buttonDefault[i] = rejectedNumber;
//              }
//            });
//          },
//          backFunction: (DragEndDetails details) {
//            setState(() {
//              buttonDefault[i] = Colors.transparent;
//            });
//          },
//          buttonColor: buttonDefault[i],
//        ),
//      );
//    }
    return Scaffold(
      backgroundColor: Colors.lightBlue,
      appBar: AppBar(
        centerTitle: true,
        title: Text(
          'Schulte Table',
        ),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Row(
              children: <Widget>[
                OneNumber(
                  number: 1,
                  checkFunction: (DragStartDetails details) {
                    setState(() {
                      if (1 == current) {
                        buttonDefault[0] = acceptedNumber;
                        current++;
                      } else {
                        buttonDefault[0] = rejectedNumber;
                      }
                    });
                  },
                  backFunction: (DragEndDetails details) {
                    setState(() {
                      buttonDefault[0] = Colors.transparent;
                    });
                  },
                  buttonColor: buttonDefault[0],
                ),
                OneNumber(
                  number: 2,
                  checkFunction: (DragStartDetails details) {
                    setState(() {
                      if (2 == current) {
                        buttonDefault[1] = acceptedNumber;
                        current++;
                      } else {
                        buttonDefault[1] = rejectedNumber;
                      }
                    });
                  },
                  backFunction: (DragEndDetails details) {
                    setState(() {
                      buttonDefault[1] = Colors.transparent;
                    });
                  },
                  buttonColor: buttonDefault[1],
                ),
                OneNumber(
                  number: 3,
                  checkFunction: (DragStartDetails details) {
                    setState(() {
                      if (3 == current) {
                        buttonDefault[2] = acceptedNumber;
                        current++;
                      } else {
                        buttonDefault[2] = rejectedNumber;
                      }
                    });
                  },
                  backFunction: (DragEndDetails details) {
                    setState(() {
                      buttonDefault[2] = Colors.transparent;
                    });
                  },
                  buttonColor: buttonDefault[2],
                ),

//                numbers[0],
//                numbers[1],
//                numbers[2],
              ],
            ),

          ],
        ),
      ),
    );
  }
}

class OneNumber extends StatefulWidget {
  final int number;
  final Function checkFunction;
  final Function backFunction;
  final Color buttonColor;

  OneNumber(
      {Key key,
      this.number,
      this.backFunction,
      this.buttonColor,
      this.checkFunction})
      : super(key: key);

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

class _OneNumberState extends State<OneNumber> {
  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: GestureDetector(
        onPanStart: widget.checkFunction,
        onPanEnd: widget.backFunction,
        child: Container(
          height: 70.0,
          decoration: BoxDecoration(
            color: widget.buttonColor,
            border: Border.all(
              color: borderColor,
              width: 0.4,
              style: BorderStyle.solid,
            ),
          ),
          child: Center(
            child: Text(
              (widget.number).toString(),
              style: TextStyle(
                fontSize: 20.0,
                color: textColor,
              ),
            ),
          ),
        ),
      ),
    );
  }
}

Я прокомментировал строки, которые я создал List и использовал его элементы. Вы можете запустить его без комментариев, и я надеюсь, что вы поймете, в чем моя проблема. Что бы вы предложили в качестве решения? Пожалуйста, помогите мне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...