颤振-在另一个按钮上点击更改颜色

时间:2020-02-20 09:55:26

标签: flutter dart identifier

我有5x5的5xTableRow网格-> 5xFittedBox。点击右上角的按钮,我希望它可以随机排列数组中描述的颜色(参见图片)。

Array of boxes

我尝试使用“ OnChanged”和“ onPressed”,但是问题是我不知道如何单独访问每个元素

我读到我应该使用“ setState”函数来强制Flutter重绘某些元素,但是问题是我应该把那个函数放在哪里?

还有一种简单的方法可以给小部件和子项某种标识符(例如,class =“ something”或id =“ something”) 关键是我想使用for循环为所有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 个答案:

答案 0 :(得分:1)

您可以在有状态窗口小部件(类)中的任何位置调用setState()函数。

代码应类似于;

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

答案 1 :(得分:1)

这是可行的解决方案

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