import 'package:flutter/material.dart'; import 'package:solitaire_game/provider/data.dart'; import 'package:solitaire_game/utils/game_utils.dart'; class Tile { int currentRow; int currentCol; bool hasPeg; Tile( this.currentRow, this.currentCol, this.hasPeg, ); Widget render(Data myProvider) { List<Widget> stack = [ this.hole(myProvider), ]; if (this.hasPeg) { stack.add(this.draggable(myProvider)); } return Stack( alignment: Alignment.center, children: stack, ); } Widget hole(Data myProvider) { String image = 'assets/skins/' + myProvider.parameterSkin + '_hole.png'; return DragTarget<List<int>>( builder: ( BuildContext context, List<dynamic> accepted, List<dynamic> rejected, ) { return Container( child: Image( image: AssetImage(image), width: myProvider.tileSize, height: myProvider.tileSize, fit: BoxFit.fill, ), ); }, onAccept: (List<int> source) { List<int> target = [this.currentCol, this.currentRow]; // print('(drag) Pick from ' + source.toString() + ' and drop on ' + target.toString()); if (GameUtils.isMoveAllowed(myProvider, source, target)) { GameUtils.move(myProvider, source, target); } }, ); } Widget draggable(Data myProvider) { return Draggable<List<int>>( data: [this.currentCol, this.currentRow], // Widget when draggable is stationary child: this.peg(myProvider), // Widget when draggable is being dragged feedback: this.peg(myProvider), // Widget to display on original place when being dragged childWhenDragging: Container(), ); } Widget peg(Data myProvider) { String image = 'assets/skins/' + myProvider.parameterSkin + '_peg.png'; return Image( image: AssetImage(image), width: myProvider.tileSize, height: myProvider.tileSize, fit: BoxFit.fill, ); } }