Flutter - изменить цвет при нажатии другой кнопки - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть 5x5 сетка 5xTableRow -> 5xFitedBox. Нажав на правую верхнюю кнопку, я хочу, чтобы она перемешивала цвета, описанные в массиве (см. Изображение).

Array of boxes

Я пытался с OnChanged и onPressed, но проблема в том, что я не знаю, как получить доступ к каждому элементу индивидуально

Я прочитал, что должен использовать функцию setState, чтобы заставить флаттер перерисовывать определенные элементы, но проблема в том, куда мне поместить указанную функцию?

Также есть ли простой способ дать виджетам и дочерним элементам какой-то идентификатор (например, class = "что-то" или id = "что-то"). который я хочу использовать для l oop, чтобы перекрасить все 25 блоков, и после этого я хочу сохранить эти 25 блоков в массиве, чтобы использовать их для последующей проверки условий.

var colorArr = [0xffd61745, 0xff3569bc, 0xffffffff, 0xfff4862a, 0xffeaed19, 0xff329f64, 
0xff000000];
//playArr is used to store values from 0-5 which corresponds each color => colorArr[playArr[n]]
var playArr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; 
void shuffleBox() {
  for (var i = 0; i<playArr.length;i++) {
    playArr[i] = new Random().nextInt(6);
    print(playArr[i]);
  }
} 

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      centerTitle: true,
      title: Container(
        child: Text(
          'Table Widget',
          style: TextStyle(
            fontSize: 20.0,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
      actions: <Widget>[
        IconButton(
          icon: Icon(Icons.shuffle),
          onPressed: shuffleBox,
        ),
      ],
    ),
    body: SingleChildScrollView(
      padding: EdgeInsets.only(top: 12),
      child: Table(
        border: null,
        defaultVerticalAlignment: TableCellVerticalAlignment.top,
        children: <TableRow>[
          TableRow(children: <Widget>[ 
            //this is what i want recolored and/or redrawn
            FittedBox(
              fit: BoxFit.contain,
              child: Container(
                margin: EdgeInsets.all(2),
                color: Color(a),
                width: 48.0,
                height: 48.0,
              ),
            ),
            FittedBox -> repeated 5x, then TableRow again

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Это рабочее решение

final colorArr = [0xffd61745, 0xff3569bc, 0xffffffff, 0xfff4862a, 0xffeaed19, 0xff329f64, 
0xff000000];
//playArr is used to store values from 0-5 which corresponds each color => colorArr[playArr[n]]
var playArr = [];

  @override
 void  initState(){
   _genereateList();
   super.initState();
 }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(icon: Icon(Icons.shuffle),onPressed: _shuffle,)
        ]
      ),
      body: Center(
        child : GridView.builder(
          itemCount: 25,
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 5),
          itemBuilder : (ctx, index)=>Card(
            child: Text(playArr[index].toString()),
            color: Color(colorArr[playArr[index]])
          )
        )
      ),
    );
  }

  _genereateList(){
    playArr = List.generate(25,(int index)=>Random().nextInt(colorArr.length-1));
    setState((){});
  }
  _shuffle(){
     playArr.shuffle(Random());
    setState((){});
  }

РЕДАКТИРОВАТЬ: , если вы хотите обновить ячейку, просто измените его значение. Допустим, вы хотите изменить элемент в 3-й колонке 5-го ряда

update(int index){
setState((){
playArr[index] = 3; //Index of the new color you want to switch to
});
}

Затем просто назовите его следующим образом:

update(22); //3rd Column 5th raw
1 голос
/ 20 февраля 2020

Вы можете вызывать функцию setState () из любого места в вашем Stateful Widget (классе).

Код должен выглядеть следующим образом:

void shuffleBox() {
   // 1- you can execute your code here
   setState((){
     // 2- or here, inside the setState
   });
   // at this point your code executes after refresh
   print("Refresh ends.");
} 

Также вы можете использовать метод shuffle () для перетасовывать список в Dart: https://api.dart.dev/stable/2.7.1/dart-core/List/shuffle.html

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