2017-05-19 43 views
2

我想建立一個Widget列表動態撲 - 建立小工具動態

List<Widget> buildGrid(){ 
List<Widget> grid = new List<Widget>(3); 
List<Widget> tiles = []; 
int counter = 0; 

for (int i = 0; i < 3; i++){ 
    tiles = []; 
    for (int j = 0; j < 4; j++){ 
    tiles.add(new GestureDetector(
     onTap:(){ 
     setState((){ 
      toggleColor(counter); 
     }); 
     }, 
     child: new Container(
     color: colors[counter], 
     width: 80.0, 
     height: 80.0, 
     margin: new EdgeInsets.all(11.3), 
    ) 
    )); 
    counter++; 
    } 
    grid[i] = new Row(
    children: tiles, 
); 
    counter = 0; 
} 
return grid; 


} 

這樣做的問題是,新添加的元素的toggleColor總是12.我是想添加一個新的GestureDetector與計數器的當前迭代,所以如果用戶點擊一個元素,它只會給它着色。例如,如果我將counter設置爲3,則所有內容都會被選中,因爲它仍然引用計數器變量,而不是當前的內部變量,如果您知道我的意思。

有關如何有效解決此問題的任何建議?

回答

3

您需要捕獲計數器變量的當前值成封閉:

final _createTapHandler = (value) { 
    setState(() => toggleColor(value)); 
}; 

然後你就可以說:

onTap: _createTapHandler(counter) 

也許更維護的解決方案是創建一個方法構建您的GestureRecognizer。然後你可以用計數器值來配置它。

Widget buildTile(int tileCounter) { 
    return new GestureDetector(
    onTap:(){ 
     setState((){ 
     toggleColor(tileCounter); 
     }); 
    }, 
    child: new Container(
     color: colors[tileCounter], 
     width: 80.0, 
     height: 80.0, 
     margin: new EdgeInsets.all(11.3), 
    ) 
); 
} 

如果你想更加可維護,你可以將構建函數重構到它自己的StatelessWidget中。

+0

我需要放置封口的位置? – OhMad

+0

任何地方,你甚至可以聲明它內聯。 onTap:((value){setState(()=> toggleColor(value));})(counter) –

+0

感謝您的buildTile解決方案。 – OhMad