2017-06-01 121 views
2

我基本上是在创建一个网格动态生成的游戏。它创建图块,将它们添加到列表并将该列表用作children参数的参数。然而,我发现很难将它与固定的小部件结合起来。Flutter - 将动态生成的元素与硬编码的元素结合起来

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

... 
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()), 
     ) 
    ), 
    ); 
    } 

它有点儿工作,但一旦非常繁琐的,因为我弄清楚我想添加另一个硬编码的小部件。有关我如何解决此问题的任何建议? 感谢

+0

所有扑翼UI都是“动态”构建的 - 每次调用“构建”方法时,都会从头开始构建整个UI - 创建新的小部件等等,只保留状态。因此,以同样的方式对待“硬编码”和“动态”小部件。 –

回答

1

我想这是要走的路,但是你可以使用GridView小部件,你可以创建一个TileWidget而不是你buildTile功能。使用GridView应该清理你的代码,但是你的意思是硬编码的小部件?

+0

硬编码我的意思是他们没有分配给一个变量,并基于条件(比如说for循环)来构建。所以对我来说,硬编码是如果我将它们直接分配给没有变量的参数。我担心GridView,但是这会让它滚动:/ – OhMad