2017-05-19 2 views
2

나는 위젯의 목록을 구축을 위해 노력하고 동적플러터 - 빌드 위젯은 동적으로

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를 사용하면 사용자가 요소를 클릭하면 색상 만 표시됩니다. 예를 들어 카운터를 3으로 설정하면, 내가 무엇을 의미하는지 알 경우, 현재의 인터 레션 대신 카운터 변수를 계속 참조하기 때문에 모든 것이 선택됩니다.

이 문제를 효과적으로 해결할 수있는 방법에 대한 제안 사항이 있으십니까?

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

이 그럼 당신은 말할 수 :

답변

3

당신은 폐쇄로 카운터 변수의 현재 값을 캡처해야

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));}) (카운터) –

+0

덕분에, buildTile 솔루션이 완벽하게 작동합니다. – OhMad