Я хотел сделать простую настольную игру Шульте во флаттере. Я создал виджет с сохранением состояния 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 и использовал его элементы. Вы можете запустить его без комментариев, и я надеюсь, что вы поймете, в чем моя проблема. Что бы вы предложили в качестве решения? Пожалуйста, помогите мне