import 'package:flutter/material.dart'; import 'package:wordguessing/data/fetch_data_helper.dart'; import 'package:wordguessing/models/word.dart'; import 'package:wordguessing/provider/data.dart'; import 'package:wordguessing/ui/games/abstract_game.dart'; class GamePickWordPage extends GameAbstract { const GamePickWordPage({super.key}); @override void pickData(Data myProvider) { Word word; int attempts = 0; do { final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords); word = words.take(1).toList()[0]; if ((words.length >= countWords) && !myProvider.isRecentlyPicked(word.key)) { myProvider.updateWord(word); myProvider.updateOtherWords(words.skip(1).toList()); myProvider.updateImages([word]); } attempts++; } while (myProvider.word != word && attempts < 10); } Widget buildImageContainer(String image) { const double imageSize = 130; String imageAsset = 'assets/placeholder.png'; if (image != '') { imageAsset = 'assets/images/$image'; } return Container( margin: const EdgeInsets.all(2), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), border: Border.all( color: Colors.blue.shade200, width: 8, ), ), child: Image( image: AssetImage(imageAsset), width: imageSize, height: imageSize, fit: BoxFit.fill, ), ); } Widget buildImageItemsBlock(Word? currentWord) { return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ buildImageContainer(currentWord?.images[0] ?? ''), buildImageContainer(currentWord?.images[1] ?? ''), ], ), Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ buildImageContainer(currentWord?.images[2] ?? ''), buildImageContainer(currentWord?.images[3] ?? ''), ], ) ], ); } Widget buildTextContainer(Data myProvider, Word word) { return Container( margin: const EdgeInsets.all(2), decoration: BoxDecoration( color: Colors.blue[800], borderRadius: BorderRadius.circular(6), border: Border.all( color: Colors.white, width: 6, ), ), child: TextButton( style: TextButton.styleFrom( padding: const EdgeInsets.all(15), ), child: Text( word.text, style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w600, color: Colors.white, ), ), onPressed: () { checkWord(myProvider, word); }, ), ); } Widget buildTextItemsBlock(Data myProvider) { Word? word = myProvider.word; List<Word> otherWords = myProvider.otherWords; if ((word == null) || (otherWords.length != (countWords - 1))) { return const Column(); } List<Word> words = [ word, otherWords[0], otherWords[1], otherWords[2], ]; words.sort((a, b) => a.key.compareTo(b.key)); return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ buildTextContainer(myProvider, words[0]), const SizedBox(width: 10), buildTextContainer(myProvider, words[1]), ], ), const SizedBox(height: 5), Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ buildTextContainer(myProvider, words[2]), const SizedBox(width: 10), buildTextContainer(myProvider, words[3]), ], ) ], ); } @override List<Widget> buildPageContent(Data myProvider) { return <Widget>[ (myProvider.images.isNotEmpty) ? buildImageItemsBlock(myProvider.images[0]) : const SizedBox.shrink(), const SizedBox(height: 2), ((myProvider.word == null) || (myProvider.word?.key == '')) ? buildStartGameBlock(myProvider) : buildScoreContainer(myProvider), const SizedBox(height: 2), buildTextItemsBlock(myProvider), ]; } }