Dart 颤振-将动态生成的元素与硬编码元素相结合

Dart 颤振-将动态生成的元素与硬编码元素相结合,dart,flutter,Dart,Flutter,我基本上是在创建一个动态生成网格的游戏。它创建平铺,将其添加到列表中,并将该列表用作children参数的参数。然而,我发现很难将它与固定小部件结合起来 让我们说,在一切之上,我想要一个文本元素。我现在遇到的问题是,如果我像这样分配动态生成的内容: ... children: mycontent, ... 那我就没有地方放硬编码的小部件了。我希望你明白我的意思。到目前为止,我通过创建一个larget列表并复制动态生成的元素,然后添加我的硬编码小部件来解决这个问题: Widget bui

我基本上是在创建一个动态生成网格的游戏。它创建平铺,将其添加到列表中,并将该列表用作children参数的参数。然而,我发现很难将它与固定小部件结合起来

让我们说,在一切之上,我想要一个文本元素。我现在遇到的问题是,如果我像这样分配动态生成的内容:

...
children: mycontent,
...
那我就没有地方放硬编码的小部件了。我希望你明白我的意思。到目前为止,我通过创建一个larget列表并复制动态生成的元素,然后添加我的硬编码小部件来解决这个问题:

    Widget buildTile(int counter) {
    return new GestureDetector(
      onTap: (){
        setState((){
          toggleColor(counter);
        });
      },
      child: new Container(
        color: colors[counter],
        foregroundDecoration: new BoxDecoration(
          border: new Border(),
        ),
        width: 75.0,
        height: 75.0,
        margin: new EdgeInsets.all(2.0),
      )
    );
  }

  List<Widget> buildGrid(){
    Map dimensions = {"width" : 4, "height" : 6};
    List<Widget> grid = new List<Widget>(dimensions["height"]);
    List<Widget> tiles = [];

    int counter = 0;

    for (int i = 0; i < dimensions["height"]; i++){
      tiles = [];
      for (int j = 0; j < dimensions["width"]; j++){
        tiles.add(buildTile(counter));
        counter++;
      }
      grid[i] = new Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: tiles,
      );
    }
    return grid;
  }

  List<Widget> copyElements(List<Widget> from){
    List<Widget> to = [];
    for (int i = 0; i < from.length; i++){
      to.add(from[i]);
    }
    return to;
  }

  List<Widget> buildPlayground(List<Widget> grid){
    List<Widget> playground = [];

    playground = copyElements(grid);

    playground.add(new Padding(
      padding: new EdgeInsets.all(20.0),
      child: new RaisedButton(
        color: Colors.purple,
        child: new Container(
          width: 100.0,
          child: new Center(
            child: new Text("Done", style: new TextStyle(fontSize: 20.0)),
          ),
        ),
        onPressed: (){

        }
      ),
    ));
    return playground;
  }

  @override
  build(BuildContext context){
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Game"),
      ),
      body: new Container(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: buildPlayground(buildGrid()),
        )
      ),
    );
  }
Widget buildTile(int计数器){
返回新的手势检测器(
onTap:(){
设置状态(){
切换颜色(计数器);
});
},
子容器:新容器(
颜色:颜色[计数器],
前场装饰:新盒子装饰(
边框:新边框(),
),
宽度:75.0,
身高:75.0,
边距:所有新边距(2.0),
)
);
}
列表buildGrid(){
地图尺寸={“宽度”:4,“高度”:6};
列表网格=新列表(尺寸[“高度]);
列表分幅=[];
int计数器=0;
对于(int i=0;i
它有点工作,但当我发现我想添加另一个硬编码的小部件时,它就非常乏味了。对我如何解决这个问题有什么建议吗?
谢谢

我想这是一种方法,但是你可以使用这个小部件,你可以创建一个
TileWidget
而不是
buildTile
函数。使用
GridView
应该可以清理代码,但硬编码的小部件是什么意思?

所有的flatter UI都是“动态”构建的-每次调用
build
方法时,您“从头开始”构建整个UI-创建新的小部件等等,只保留状态。所以,同样对待“硬编码”和“动态”小部件。您可以看到如何使用硬编码创建元素programmattically,我的意思是它们没有分配给变量,而是基于条件构建(比如在for循环中)。因此,对我来说,硬编码是如果我直接将它们分配给参数,而不使用变量。我想到了GridView,但是这会使它可以滚动:/