Skip to content
Snippets Groups Projects
Commit 215ce8de authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Put words list in code instead of asset. Update dependencies.

parent cb4b367f
No related branches found
No related tags found
1 merge request!76Resolve "Put words list in code instead of assets"
Pipeline #5626 passed
......@@ -37,7 +37,7 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 33
compileSdkVersion 34
namespace "org.benoitharrault.wordguessing"
defaultConfig {
......
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.1.39
app.versionCode=63
app.versionName=0.1.40
app.versionCode=64
Put words list in code instead of asset file. Update dependencies.
Liste des mots dans le code plutôt qu'en fichier ressource. Mise à jour des dépendances.
import 'package:wordguessing/data/game_data.dart';
import 'package:wordguessing/models/word.dart';
import 'package:wordguessing/utils/tools.dart';
class FetchDataHelper {
FetchDataHelper();
List<Word> _words = [];
String _lang = '';
void init(String lang) {
_words = [];
_lang = lang;
try {
const gameData = GameData.data;
final Map<String, dynamic> rawWords = gameData['words'] as Map<String, dynamic>;
rawWords.forEach((String key, rawWord) {
final String text = rawWord[_lang] as String;
final List<String> images = [];
for (var rawImage in rawWord['images'] as List<dynamic>) {
images.add(rawImage.toString());
}
images.shuffle();
if (images.isNotEmpty) {
_words.add(Word(
key: key,
text: text,
images: images,
));
}
});
} catch (e) {
printlog("$e");
}
}
List<Word> getWords(String lang, int count) {
if (_words.isEmpty || lang != _lang) {
init(lang);
}
List<Word> words = _words;
words.shuffle();
return words.take(count).toList();
}
}
This diff is collapsed.
......@@ -8,19 +8,19 @@ class GameAbstract extends StatelessWidget {
final int countWords = 4;
Future<void> startGame(Data myProvider, String lang) async {
void startGame(Data myProvider, String lang) {
myProvider.updateLang(lang);
await nextWord(myProvider);
nextWord(myProvider);
}
Future<void> nextWord(Data myProvider) async {
await pickData(myProvider);
void nextWord(Data myProvider) {
pickData(myProvider);
myProvider.updateQuestionsCount(myProvider.questionsCount + 1);
}
Future<void> pickData(Data myProvider) async {}
void pickData(Data myProvider) {}
Future<void> checkWord(Data myProvider, word) async {
void checkWord(Data myProvider, word) {
if (myProvider.word?.key == word.key) {
myProvider.updateGoodAnswers(myProvider.goodAnswers + 1);
nextWord(myProvider);
......
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';
import 'package:wordguessing/utils/random_pick_words.dart';
class GamePickImagePage extends GameAbstract {
const GamePickImagePage({super.key});
@override
Future<void> pickData(Data myProvider) async {
final RandomPickWords randomPickWords = RandomPickWords();
pickData(Data myProvider) {
Word word;
int attempts = 0;
do {
await randomPickWords.init(myProvider.lang, countWords);
final List<Word> words = randomPickWords.words;
final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords);
word = words.take(1).toList()[0];
......
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';
import 'package:wordguessing/utils/random_pick_words.dart';
class GamePickWordPage extends GameAbstract {
const GamePickWordPage({super.key});
@override
Future<void> pickData(Data myProvider) async {
final RandomPickWords randomPickWords = RandomPickWords();
void pickData(Data myProvider) {
Word word;
int attempts = 0;
do {
await randomPickWords.init(myProvider.lang, countWords);
final List<Word> words = randomPickWords.words;
final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords);
word = words.take(1).toList()[0];
......
import 'dart:async';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:wordguessing/models/word.dart';
import 'package:wordguessing/utils/tools.dart';
class RandomPickWords {
RandomPickWords();
List<Word> _words = [];
init(String lang, int count) async {
await wordsFromLocalFile(lang, count);
}
Future<void> wordsFromLocalFile(String lang, int count) async {
List<Word> wordList = [];
try {
final String jsonString = await rootBundle.loadString('assets/words.json');
final jsonResponse = await json.decode(jsonString);
final Map<String, dynamic> wordsMap = jsonResponse['words'] as Map<String, dynamic>;
wordsMap.forEach((key, data) {
final List<String> images = [];
for (var image in (data['images'] as List<dynamic>)) {
images.add(image as String);
}
images.shuffle();
if (images.isNotEmpty) {
wordList.add(Word(
key: key,
text: data[lang] ?? '',
images: images,
));
}
});
} catch (e) {
printlog("$e");
}
// Check we have enough words
if (wordList.length < count) {
printlog('Not enough words in list.');
}
// Remove empty words
wordList.removeWhere((word) => (word.text == ''));
// Randomize words list
wordList.shuffle();
// Pick first words from shuffled list
_words = wordList.take(count).toList();
}
List<Word> get words => _words;
}
......@@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: args
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.5.0"
async:
dependency: transitive
description:
......@@ -21,10 +21,10 @@ packages:
dependency: transitive
description:
name: bloc
sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e
sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev"
source: hosted
version: "8.1.3"
version: "8.1.4"
characters:
dependency: transitive
description:
......@@ -61,10 +61,10 @@ packages:
dependency: "direct main"
description:
name: easy_localization
sha256: c145aeb6584aedc7c862ab8c737c3277788f47488bfdf9bae0fe112bd0a4789c
sha256: "432698c31a488dd64c56d4759f20d04844baba5e9e4f2cb1abb9676257918b17"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.6"
easy_logger:
dependency: transitive
description:
......@@ -106,18 +106,18 @@ packages:
dependency: "direct main"
description:
name: flutter_bloc
sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1"
sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
url: "https://pub.dev"
source: hosted
version: "8.1.4"
version: "8.1.5"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.0.2"
flutter_localizations:
dependency: transitive
description: flutter
......@@ -148,10 +148,10 @@ packages:
dependency: transitive
description:
name: http
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.2.1"
http_parser:
dependency: transitive
description:
......@@ -164,10 +164,10 @@ packages:
dependency: "direct main"
description:
name: hydrated_bloc
sha256: "00a2099680162e74b5a836b8a7f446e478520a9cae9f6032e028ad8129f4432d"
sha256: af35b357739fe41728df10bec03aad422cdc725a1e702e03af9d2a41ea05160c
url: "https://pub.dev"
source: hosted
version: "9.1.4"
version: "9.1.5"
intl:
dependency: transitive
description:
......@@ -212,18 +212,18 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79"
sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0
url: "https://pub.dev"
source: hosted
version: "5.0.1"
version: "8.0.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6"
sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "3.0.0"
path:
dependency: "direct main"
description:
......@@ -236,18 +236,18 @@ packages:
dependency: "direct main"
description:
name: path_provider
sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.3"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.2.4"
path_provider_foundation:
dependency: transitive
description:
......@@ -308,18 +308,18 @@ packages:
dependency: transitive
description:
name: shared_preferences
sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
version: "2.2.2"
shared_preferences_foundation:
dependency: transitive
description:
......@@ -348,10 +348,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_web
sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.3.0"
shared_preferences_windows:
dependency: transitive
description:
......@@ -425,18 +425,18 @@ packages:
dependency: transitive
description:
name: web
sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05"
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "0.4.2"
version: "0.5.1"
win32:
dependency: transitive
description:
name: win32
sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480"
sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
url: "https://pub.dev"
source: hosted
version: "5.3.0"
version: "5.5.0"
xdg_directories:
dependency: transitive
description:
......@@ -447,4 +447,4 @@ packages:
version: "1.0.4"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.16.0"
flutter: ">=3.19.0"
name: wordguessing
description: A wordguessing game application.
publish_to: 'none'
version: 0.1.39+63
publish_to: "none"
version: 0.1.40+64
environment:
sdk: '^3.0.0'
sdk: "^3.0.0"
dependencies:
flutter:
......@@ -17,7 +17,7 @@ dependencies:
flutter_swipe: ^1.0.1
hive: ^2.2.3
hydrated_bloc: ^9.0.0
package_info_plus: ^5.0.1
package_info_plus: ^8.0.0
path: ^1.9.0
path_provider: ^2.0.11
provider: ^6.0.5
......@@ -29,7 +29,6 @@ dev_dependencies:
flutter:
uses-material-design: true
assets:
- assets/words.json
- assets/images/
- assets/menu/
- assets/placeholder.png
......@@ -46,4 +45,3 @@ flutter:
weight: 400
- asset: assets/fonts/Nunito-Light.ttf
weight: 300
......@@ -10,7 +10,7 @@ SOURCE_CSV_FILE="${CURRENT_DIR}/words.csv"
ASSETS_BASE_FOLDER="${BASE_DIR}/assets"
OUTPUT_WORDS_LIST="${ASSETS_BASE_FOLDER}/words.json"
OUTPUT_WORDS_LIST="${CURRENT_DIR}/words.json"
touch "${OUTPUT_WORDS_LIST}"
TARGET_IMAGES_ASSETS_FOLDER="${ASSETS_BASE_FOLDER}/images"
......@@ -83,4 +83,12 @@ echo "}" >> "${OUTPUT_WORDS_LIST_TMP}"
cat "${OUTPUT_WORDS_LIST_TMP}" | jq > "${OUTPUT_WORDS_LIST}"
rm "${OUTPUT_WORDS_LIST_TMP}"
# inject json file in app code
GAME_DATA_DART_FILE="${BASE_DIR}/lib/data/game_data.dart"
echo "class GameData {" >"${GAME_DATA_DART_FILE}"
echo " static const Map<String, dynamic> data = $(cat "${OUTPUT_WORDS_LIST}");" >>"${GAME_DATA_DART_FILE}"
echo "}" >>"${GAME_DATA_DART_FILE}"
dart format "${GAME_DATA_DART_FILE}"
echo "done."
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment