2017-06-01 21 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は "動的に"ビルドされます。 - buildメソッドが呼び出されるたびに、 "ゼロから" UI全体を構築します。新しいウィジェットが作成されます。したがって、「ハードコーディング」と「ダイナミック」ウィジェットを同じ方法で扱います。 –

答えて

1

は、しかし私は、あなたがGridViewウィジェットを使用することができ、あなたはTileWidgetの代わりに、あなたbuildTile機能を作成することができ、これは移動するための方法であると思います。 GridViewを使用するとコードを削除する必要がありますが、ハードコーディングされたウィジェットはどういう意味ですか?

+0

はハードコーディングされていますが、変数に割り当てられておらず、条件に基づいて構築されていることを意味します(for-loopで言えば)。だから私がハードコーディングされているのは、変数なしでパラメータに直接割り当てることです。私はGridViewを気にしませんが、これでスクロール可能になります:/ – OhMad

関連する問題