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 = [ hole(myProvider), ]; if (hasPeg) { stack.add(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 Image( image: AssetImage(image), width: myProvider.tileSize, height: myProvider.tileSize, fit: BoxFit.fill, ); }, onAcceptWithDetails: (DragTargetDetails<List<int>> source) { List<int> target = [currentCol, currentRow]; // printlog('(drag) Pick from ' + source.toString() + ' and drop on ' + target.toString()); if (GameUtils.isMoveAllowed(myProvider, source.data, target)) { GameUtils.move(myProvider, source.data, target); } }, ); } Widget draggable(Data myProvider) { return Draggable<List<int>>( data: [currentCol, currentRow], // Widget when draggable is being dragged feedback: peg(myProvider), // Widget to display on original place when being dragged childWhenDragging: Container(), // Widget when draggable is stationary child: peg(myProvider), ); } 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, ); } }