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

Merge branch '37-use-flutter-linter-and-apply-lints' into 'master'

Resolve "Use flutter linter and apply lints"

Closes #37

See merge request !34
parents 0c769ba5 3e1548fc
No related branches found
No related tags found
1 merge request!34Resolve "Use flutter linter and apply lints"
Pipeline #5107 passed
Showing with 308 additions and 272 deletions
include: package:flutter_lints/flutter.yaml
...@@ -44,7 +44,7 @@ android { ...@@ -44,7 +44,7 @@ android {
defaultConfig { defaultConfig {
applicationId "org.benoitharrault.hangman" applicationId "org.benoitharrault.hangman"
minSdkVersion 16 minSdkVersion flutter.minSdkVersion
targetSdkVersion 30 targetSdkVersion 30
versionCode appVersionCode.toInteger() versionCode appVersionCode.toInteger()
versionName appVersionName versionName appVersionName
......
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=1.2.11 app.versionName=1.2.12
app.versionCode=22 app.versionCode=23
...@@ -7,9 +7,11 @@ import 'screens/game.dart'; ...@@ -7,9 +7,11 @@ import 'screens/game.dart';
import 'screens/scores.dart'; import 'screens/scores.dart';
import 'utils/constants.dart'; import 'utils/constants.dart';
void main() => runApp(Hangman()); void main() => runApp(const Hangman());
class Hangman extends StatelessWidget { class Hangman extends StatelessWidget {
const Hangman({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ChangeNotifierProvider( return ChangeNotifierProvider(
...@@ -19,14 +21,14 @@ class Hangman extends StatelessWidget { ...@@ -19,14 +21,14 @@ class Hangman extends StatelessWidget {
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
primaryColor: Color(darkGreen), primaryColor: const Color(darkGreen),
visualDensity: VisualDensity.adaptivePlatformDensity, visualDensity: VisualDensity.adaptivePlatformDensity,
), ),
home: Home(), home: const Home(),
routes: { routes: {
Home.id: (context) => Home(), Home.id: (context) => const Home(),
Game.id: (context) => Game(), Game.id: (context) => const Game(),
Scores.id: (context) => Scores(), Scores.id: (context) => const Scores(),
}, },
); );
}, },
......
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import '../utils/shared_prefs.dart'; import '../utils/shared_prefs.dart';
import '../utils/constants.dart'; import '../utils/constants.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../provider/data.dart'; import '../provider/data.dart';
import '../utils/constants.dart'; import '../utils/constants.dart';
import '../utils/random_pick.dart'; import '../utils/random_pick.dart';
import '../widgets/letters.dart'; import '../widgets/letters.dart';
class Game extends StatelessWidget { class Game extends StatelessWidget {
const Game({super.key});
static const String id = 'game'; static const String id = 'game';
Future<void> pickWord(BuildContext context, Data myProvider) async { Future<void> pickWord(BuildContext context, Data myProvider) async {
...@@ -32,11 +35,11 @@ class Game extends StatelessWidget { ...@@ -32,11 +35,11 @@ class Game extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Orientation orientation = MediaQuery.of(context).orientation; Orientation orientation = MediaQuery.of(context).orientation;
Data _myProvider = Provider.of<Data>(context); Data myProvider = Provider.of<Data>(context);
return Scaffold( return Scaffold(
backgroundColor: Color(board), backgroundColor: const Color(board),
floatingActionButton: _myProvider.levelPref == defaultLevel floatingActionButton: myProvider.levelPref == defaultLevel
? FloatingActionButton( ? FloatingActionButton(
foregroundColor: Colors.white, foregroundColor: Colors.white,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
...@@ -46,11 +49,11 @@ class Game extends StatelessWidget { ...@@ -46,11 +49,11 @@ class Game extends StatelessWidget {
context: context, context: context,
builder: (context) { builder: (context) {
return AlertDialog( return AlertDialog(
title: Text('Indice'), title: const Text('Indice'),
content: Text(_myProvider.clue), content: Text(myProvider.clue),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: Text('Revenir au jeu'), child: const Text('Revenir au jeu'),
onPressed: () => Navigator.of(context).pop(), onPressed: () => Navigator.of(context).pop(),
) )
], ],
...@@ -58,30 +61,30 @@ class Game extends StatelessWidget { ...@@ -58,30 +61,30 @@ class Game extends StatelessWidget {
}, },
); );
}, },
child: Icon(Icons.help_outline), child: const Icon(Icons.help_outline),
) )
: null, : null,
floatingActionButtonLocation: orientation == Orientation.portrait floatingActionButtonLocation: orientation == Orientation.portrait
? FloatingActionButtonLocation.endTop ? FloatingActionButtonLocation.endTop
: FloatingActionButtonLocation.centerTop, : FloatingActionButtonLocation.centerTop,
body: orientation == Orientation.portrait body: orientation == Orientation.portrait
? Column( ? const Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Flexible( Flexible(
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 60.0, left: 30.0, right: 30.0, bottom: 10.0), padding: EdgeInsets.only(top: 60.0, left: 30.0, right: 30.0, bottom: 10.0),
child: const ImgGallow(), child: ImgGallow(),
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 30.0), padding: EdgeInsets.symmetric(horizontal: 30.0),
child: const HiddenWord(), child: HiddenWord(),
), ),
const LetterButtons(), LetterButtons(),
], ],
) )
: Row( : const Row(
children: [ children: [
Expanded( Expanded(
flex: 2, flex: 2,
...@@ -89,13 +92,13 @@ class Game extends StatelessWidget { ...@@ -89,13 +92,13 @@ class Game extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 40.0), padding: EdgeInsets.only(top: 40.0),
child: ImgGallow(), child: ImgGallow(),
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
child: const HiddenWord(), child: HiddenWord(),
), ),
], ],
), ),
...@@ -108,16 +111,16 @@ class Game extends StatelessWidget { ...@@ -108,16 +111,16 @@ class Game extends StatelessWidget {
} }
class ImgGallow extends StatelessWidget { class ImgGallow extends StatelessWidget {
const ImgGallow({Key? key}) : super(key: key); const ImgGallow({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context); Data myProvider = Provider.of<Data>(context);
return Stack( return Stack(
children: [ children: [
for (int error = 0; error < 9; error++) for (int error = 0; error < 9; error++)
AnimatedOpacity( AnimatedOpacity(
opacity: _myProvider.errors >= error ? 1.0 : 0.0, opacity: myProvider.errors >= error ? 1.0 : 0.0,
duration: Duration(milliseconds: _myProvider.errors >= error ? 800 : 0), duration: Duration(milliseconds: myProvider.errors >= error ? 800 : 0),
child: Image.asset('assets/images/img${error + 1}.png'), child: Image.asset('assets/images/img${error + 1}.png'),
) )
], ],
...@@ -126,16 +129,16 @@ class ImgGallow extends StatelessWidget { ...@@ -126,16 +129,16 @@ class ImgGallow extends StatelessWidget {
} }
class HiddenWord extends StatelessWidget { class HiddenWord extends StatelessWidget {
const HiddenWord({Key? key}) : super(key: key); const HiddenWord({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context); Data myProvider = Provider.of<Data>(context);
return FittedBox( return FittedBox(
child: Text( child: Text(
(_myProvider.hiddenWord.isEmpty || _myProvider.hiddenWord == '') (myProvider.hiddenWord.isEmpty || myProvider.hiddenWord == '')
? 'UNEXPECTED ERROR' ? 'UNEXPECTED ERROR'
: _myProvider.hiddenWord, : myProvider.hiddenWord,
style: TextStyle( style: const TextStyle(
fontFamily: 'Tiza', fontFamily: 'Tiza',
color: Colors.white, color: Colors.white,
fontSize: 34.0, fontSize: 34.0,
......
...@@ -8,22 +8,24 @@ import '../widgets/dialog_fetch_error.dart'; ...@@ -8,22 +8,24 @@ import '../widgets/dialog_fetch_error.dart';
import '../utils/constants.dart'; import '../utils/constants.dart';
class Home extends StatelessWidget { class Home extends StatelessWidget {
const Home({super.key});
static const String id = 'home'; static const String id = 'home';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context); final Data myProvider = Provider.of<Data>(context);
void _errorWord(context) { void errorWord(context) {
showDialog( showDialog(
context: context, context: context,
builder: (_) => AlertDialog( builder: (_) => AlertDialog(
title: Text('Erreur inattendue'), title: const Text('Erreur inattendue'),
content: Text('Erreur inattendue à la récupération d\'un mot aléatoire.\n' content: const Text('Erreur inattendue à la récupération d\'un mot aléatoire.\n'
'Installer une nouvelle version de l\'application pourrait corriger cette anomalie.'), 'Installer une nouvelle version de l\'application pourrait corriger cette anomalie.'),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: Text('Fermer'), child: const Text('Fermer'),
onPressed: () => Navigator.of(context).pop(), onPressed: () => Navigator.of(context).pop(),
) )
], ],
...@@ -35,22 +37,23 @@ class Home extends StatelessWidget { ...@@ -35,22 +37,23 @@ class Home extends StatelessWidget {
appBar: MyAppBar(appBar: AppBar()), appBar: MyAppBar(appBar: AppBar()),
body: Builder( body: Builder(
builder: (context) => Center( builder: (context) => Center(
child: _myProvider.searching == true child: myProvider.searching == true
? WillPopScope( ? WillPopScope(
onWillPop: () async => false, onWillPop: () async => false,
child: Center( child: const Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
) )
: Container( : SingleChildScrollView(
child: SingleChildScrollView( padding: const EdgeInsets.all(15.0),
child: SizedBox( child: SizedBox(
height: MediaQuery.of(context).size.height / 1.25, height: MediaQuery.of(context).size.height / 1.25,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), padding:
const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
child: FittedBox( child: FittedBox(
fit: BoxFit.fitWidth, fit: BoxFit.fitWidth,
child: Text( child: Text(
...@@ -68,12 +71,11 @@ class Home extends StatelessWidget { ...@@ -68,12 +71,11 @@ class Home extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text('Mode en ligne'), const Text('Mode en ligne'),
Switch( Switch(
value: _myProvider.gameModeValue, value: myProvider.gameModeValue,
onChanged: (bool value) => onChanged: (bool value) => myProvider.updateGameMode = value,
_myProvider.updateGameMode = value, activeTrackColor: const Color(board),
activeTrackColor: Color(board),
activeColor: Colors.greenAccent[400], activeColor: Colors.greenAccent[400],
), ),
], ],
...@@ -81,12 +83,12 @@ class Home extends StatelessWidget { ...@@ -81,12 +83,12 @@ class Home extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text('Niveau'), const Text('Niveau'),
DropdownButton<String>( DropdownButton<String>(
value: _myProvider.levelValue != '' value: myProvider.levelValue != ''
? _myProvider.levelValue ? myProvider.levelValue
: onlineGameMode[_myProvider.gameModeValue]?.first, : onlineGameMode[myProvider.gameModeValue]?.first,
items: onlineGameMode[_myProvider.gameModeValue] items: onlineGameMode[myProvider.gameModeValue]
?.map<DropdownMenuItem<String>>((String value) { ?.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>( return DropdownMenuItem<String>(
value: value, value: value,
...@@ -94,60 +96,61 @@ class Home extends StatelessWidget { ...@@ -94,60 +96,61 @@ class Home extends StatelessWidget {
); );
}).toList(), }).toList(),
onChanged: (String? value) => onChanged: (String? value) =>
_myProvider.updateLevel = value ?? '', myProvider.updateLevel = value ?? '',
), ),
], ],
), ),
], ],
), ),
ElevatedButton.icon( TextButton.icon(
style: ElevatedButton.styleFrom( style: TextButton.styleFrom(
foregroundColor: Colors.white, foregroundColor: Colors.white,
backgroundColor: Color(board), backgroundColor: const Color(board),
padding: EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
), ),
onPressed: () async { onPressed: () async {
_myProvider.resetGame(); myProvider.resetGame();
_myProvider.searching = true; myProvider.searching = true;
bool control = true; bool control = true;
await Game().pickWord(context, _myProvider); await const Game().pickWord(context, myProvider);
if (_myProvider.secretWord == '' || if (myProvider.secretWord == '' || myProvider.hiddenWord == '') {
_myProvider.hiddenWord == '') {
control = false; control = false;
var response = await Navigator.push( var response = await Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => DialogFetchError()), MaterialPageRoute(
builder: (context) => const DialogFetchError(),
),
); );
if (response == false) { if (response == false) {
_myProvider.searching = false; myProvider.searching = false;
_myProvider.resetGame(); myProvider.resetGame();
} else { } else {
_myProvider.setPrefGameMode = false; myProvider.setPrefGameMode = false;
_myProvider.setPrefLevel = defaultLevel; myProvider.setPrefLevel = defaultLevel;
await Game().pickWord(context, _myProvider); await const Game().pickWord(context, myProvider);
control = true; control = true;
} }
} }
if (_myProvider.secretWord == 'UNEXPECTED ERROR') { if (myProvider.secretWord == 'UNEXPECTED ERROR') {
control = false; control = false;
_myProvider.resetGame(); myProvider.resetGame();
_errorWord(context); errorWord(context);
} }
if (control) { if (control) {
Navigator.pushNamed(context, Game.id) Navigator.pushNamed(context, Game.id)
.then((value) => _myProvider.searching = false); .then((value) => myProvider.searching = false);
} }
}, },
icon: Icon( icon: const Icon(
Icons.check_box, Icons.check_box,
color: Colors.white, color: Colors.white,
size: 60.0, size: 60.0,
), ),
label: Column( label: Column(
children: [ children: [
Text( const Text(
'JOUER', 'JOUER',
style: TextStyle( style: TextStyle(
fontSize: 22.0, fontSize: 22.0,
...@@ -155,8 +158,8 @@ class Home extends StatelessWidget { ...@@ -155,8 +158,8 @@ class Home extends StatelessWidget {
), ),
), ),
Text( Text(
'Mode de jeu: ${_myProvider.levelPref}', 'Mode de jeu: ${myProvider.levelPref}',
style: TextStyle( style: const TextStyle(
fontSize: 10.0, fontSize: 10.0,
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
), ),
...@@ -170,7 +173,6 @@ class Home extends StatelessWidget { ...@@ -170,7 +173,6 @@ class Home extends StatelessWidget {
), ),
), ),
), ),
),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../provider/data.dart'; import '../provider/data.dart';
import '../utils/constants.dart'; import '../utils/constants.dart';
class Scores extends StatelessWidget { class Scores extends StatelessWidget {
const Scores({super.key});
static const String id = 'scores'; static const String id = 'scores';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context); final Data myProvider = Provider.of<Data>(context);
return Scaffold( return Scaffold(
backgroundColor: Color(board), backgroundColor: const Color(board),
appBar: AppBar( appBar: AppBar(
title: Text('Scores'), title: const Text('Scores'),
actions: [ actions: [
IconButton( IconButton(
icon: Icon(Icons.delete_forever), icon: const Icon(Icons.delete_forever),
onPressed: () => _myProvider.resetScores(), onPressed: () => myProvider.resetScores(),
), ),
], ],
), ),
...@@ -24,11 +28,11 @@ class Scores extends StatelessWidget { ...@@ -24,11 +28,11 @@ class Scores extends StatelessWidget {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Flexible( const Flexible(
child: FractionallySizedBox(heightFactor: 0.6), child: FractionallySizedBox(heightFactor: 0.6),
), ),
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: FittedBox( child: FittedBox(
fit: BoxFit.fitWidth, fit: BoxFit.fitWidth,
child: Text( child: Text(
...@@ -41,7 +45,7 @@ class Scores extends StatelessWidget { ...@@ -41,7 +45,7 @@ class Scores extends StatelessWidget {
), ),
), ),
), ),
Flexible(child: FractionallySizedBox(heightFactor: 0.2)), const Flexible(child: FractionallySizedBox(heightFactor: 0.2)),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
...@@ -51,15 +55,15 @@ class Scores extends StatelessWidget { ...@@ -51,15 +55,15 @@ class Scores extends StatelessWidget {
color: Colors.grey[200], color: Colors.grey[200],
size: 60.0, size: 60.0,
), ),
'${_myProvider.victoryCount}', '${myProvider.victoryCount}',
), ),
CardBox( CardBox(
ImageIcon( ImageIcon(
AssetImage('assets/images/gameover.png'), const AssetImage('assets/images/gameover.png'),
color: Colors.grey[200], color: Colors.grey[200],
size: 60.0, size: 60.0,
), ),
'${_myProvider.defeatCount}', '${myProvider.defeatCount}',
), ),
], ],
), ),
...@@ -74,21 +78,21 @@ class CardBox extends StatelessWidget { ...@@ -74,21 +78,21 @@ class CardBox extends StatelessWidget {
final Widget imagen; final Widget imagen;
final String text; final String text;
CardBox(this.imagen, this.text); const CardBox(this.imagen, this.text, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Flexible( return Flexible(
child: Card( child: Card(
elevation: 10.0, elevation: 10.0,
margin: EdgeInsets.symmetric(horizontal: 10.0), margin: const EdgeInsets.symmetric(horizontal: 10.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
color: Color(darkGreen), color: const Color(darkGreen),
child: Column( child: Column(
children: [ children: [
Container( Container(
padding: EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
decoration: BoxDecoration( decoration: const BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
color: Colors.grey, color: Colors.grey,
...@@ -102,7 +106,7 @@ class CardBox extends StatelessWidget { ...@@ -102,7 +106,7 @@ class CardBox extends StatelessWidget {
), ),
), ),
Container( Container(
padding: EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
child: Text( child: Text(
text, text,
style: TextStyle( style: TextStyle(
......
...@@ -15,23 +15,23 @@ const int board = 0xff004D00; ...@@ -15,23 +15,23 @@ const int board = 0xff004D00;
const int accent = 0xffD81B60; const int accent = 0xffD81B60;
// GameOver // GameOver
enum GameOver { VICTORY, DEFEAT } enum GameOver { victory, defeat }
extension GameOverExtension on GameOver { extension GameOverExtension on GameOver {
static const titles = { static const titles = {
GameOver.VICTORY: 'Victoire !', GameOver.victory: 'Victoire !',
GameOver.DEFEAT: 'Pendu !', GameOver.defeat: 'Pendu !',
}; };
String get title => titles[this] ?? '?'; String get title => titles[this] ?? '?';
static const icons = { static const icons = {
GameOver.VICTORY: Icons.military_tech, GameOver.victory: Icons.military_tech,
GameOver.DEFEAT: Icons.gavel, GameOver.defeat: Icons.gavel,
}; };
IconData get icon => icons[this] ?? Icons.error; IconData get icon => icons[this] ?? Icons.error;
} }
const victory = GameOver.VICTORY; const victory = GameOver.victory;
const defeat = GameOver.DEFEAT; const defeat = GameOver.defeat;
...@@ -77,8 +77,8 @@ class RandomPick { ...@@ -77,8 +77,8 @@ class RandomPick {
Future _waitList() => Future(() { Future _waitList() => Future(() {
final completer = Completer(); final completer = Completer();
int indexRandom = random.nextInt(list_french_words.length); int indexRandom = random.nextInt(listFrenchWords.length);
completer.complete(list_french_words.sublist(indexRandom, indexRandom + 1).join('\n')); completer.complete(listFrenchWords.sublist(indexRandom, indexRandom + 1).join('\n'));
return completer.future; return completer.future;
}); });
......
...@@ -8,9 +8,7 @@ class SharedPrefs { ...@@ -8,9 +8,7 @@ class SharedPrefs {
static const String _prefsDefeatCount = 'defeatCount'; static const String _prefsDefeatCount = 'defeatCount';
init() async { init() async {
if (_sharedPrefs == null) { _sharedPrefs ??= await SharedPreferences.getInstance();
_sharedPrefs = await SharedPreferences.getInstance();
}
} }
bool get gameMode => _sharedPrefs?.getBool(_prefsGameMode) ?? false; bool get gameMode => _sharedPrefs?.getBool(_prefsGameMode) ?? false;
......
...@@ -2,17 +2,17 @@ import 'package:hangman/utils/constants.dart'; ...@@ -2,17 +2,17 @@ import 'package:hangman/utils/constants.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DialogFetchError extends StatelessWidget { class DialogFetchError extends StatelessWidget {
const DialogFetchError({Key? key}) : super(key: key); const DialogFetchError({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Color(board), backgroundColor: const Color(board),
body: WillPopScope( body: WillPopScope(
onWillPop: () async => false, onWillPop: () async => false,
child: AlertDialog( child: AlertDialog(
title: Text('Connexion impossible'), title: const Text('Connexion impossible'),
content: Text('Impossible de récupérer un mot aléatoire. ' content: const Text('Impossible de récupérer un mot aléatoire. '
'La connexion internet est peut-être inaccessible.\n' 'La connexion internet est peut-être inaccessible.\n'
'Changer vers un mode de jeu hors-ligne ?'), 'Changer vers un mode de jeu hors-ligne ?'),
actions: [ actions: [
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../screens/home.dart'; import '../screens/home.dart';
import '../screens/game.dart'; import '../screens/game.dart';
import '../provider/data.dart'; import '../provider/data.dart';
...@@ -7,22 +8,23 @@ import '../utils/constants.dart'; ...@@ -7,22 +8,23 @@ import '../utils/constants.dart';
class DialogGameOver extends StatelessWidget { class DialogGameOver extends StatelessWidget {
final GameOver gameOver; final GameOver gameOver;
const DialogGameOver(this.gameOver); const DialogGameOver(this.gameOver, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context); final Data myProvider = Provider.of<Data>(context);
return Scaffold( return Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: _myProvider.searching == true body: myProvider.searching == true
? Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: WillPopScope( : WillPopScope(
onWillPop: () async => false, onWillPop: () async => false,
child: AlertDialog( child: AlertDialog(
title: Row( title: Row(
children: [ children: [
Icon(gameOver.icon), Icon(gameOver.icon),
SizedBox(width: 10.0), const SizedBox(width: 10.0),
Text(gameOver.title), Text(gameOver.title),
], ],
), ),
...@@ -31,9 +33,9 @@ class DialogGameOver extends StatelessWidget { ...@@ -31,9 +33,9 @@ class DialogGameOver extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (gameOver == GameOver.DEFEAT) if (gameOver == GameOver.defeat)
Text('Le mot secret était ${_myProvider.secretWord}'), Text('Le mot secret était ${myProvider.secretWord}'),
Text('Rejouer ?'), const Text('Rejouer ?'),
], ],
), ),
), ),
...@@ -47,8 +49,8 @@ class DialogGameOver extends StatelessWidget { ...@@ -47,8 +49,8 @@ class DialogGameOver extends StatelessWidget {
TextButton( TextButton(
child: const Text('REJOUER'), child: const Text('REJOUER'),
onPressed: () async { onPressed: () async {
_myProvider.resetSuccessAndErrors(); myProvider.resetSuccessAndErrors();
await Game().pickWord(context, _myProvider); await const Game().pickWord(context, myProvider);
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../provider/data.dart'; import '../provider/data.dart';
import '../utils/constants.dart'; import '../utils/constants.dart';
import '../widgets/dialog_gameover.dart'; import '../widgets/dialog_gameover.dart';
class LetterButtons extends StatelessWidget { class LetterButtons extends StatelessWidget {
const LetterButtons({Key? key}) : super(key: key); const LetterButtons({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Orientation orientation = MediaQuery.of(context).orientation; final Orientation orientation = MediaQuery.of(context).orientation;
var size = MediaQuery.of(context).size; var size = MediaQuery.of(context).size;
final double paddingTop = MediaQuery.of(context).padding.top; final double paddingTop = MediaQuery.of(context).padding.top;
final double itemHeight = (size.height - paddingTop) / 2; final double itemHeight = (size.height - paddingTop) / 2;
final double itemWidth = size.width / 2; final double itemWidth = size.width / 2;
Data _myProvider = Provider.of<Data>(context); final Data myProvider = Provider.of<Data>(context);
final List<String> lettersList = letters.split('');
final List<Widget> keys = [];
List<String> lettersList = letters.split(''); for (var key in lettersList) {
List<Widget> keys = [];
lettersList.forEach((key) {
keys.add( keys.add(
Padding( Padding(
padding: const EdgeInsets.all(2.0), padding: const EdgeInsets.all(2.0),
child: ElevatedButton( child: TextButton(
style: ElevatedButton.styleFrom( style: TextButton.styleFrom(
backgroundColor: Colors.grey, backgroundColor: Colors.grey,
foregroundColor: Colors.white, foregroundColor: Colors.white,
shadowColor: Color(accent), shadowColor: const Color(accent),
), ),
onPressed: _myProvider.usedLetters.contains(key) onPressed: myProvider.usedLetters.contains(key)
? null ? null
: () async { : () async {
_myProvider.updateUsedLetters(key); myProvider.updateUsedLetters(key);
if (_myProvider.secretWord.contains(key)) { if (myProvider.secretWord.contains(key)) {
for (int index = 0; index < _myProvider.secretWord.length; index++) { for (int index = 0; index < myProvider.secretWord.length; index++) {
if (key == _myProvider.secretWord[index]) { if (key == myProvider.secretWord[index]) {
_myProvider.updateHiddenWord(index, key); myProvider.updateHiddenWord(index, key);
} }
} }
if (_myProvider.hiddenWord == _myProvider.secretWord) { if (myProvider.hiddenWord == myProvider.secretWord) {
_myProvider.addVictory(); myProvider.addVictory();
showDialog( showDialog(
context: context, context: context,
builder: (context) => DialogGameOver(victory), builder: (context) => const DialogGameOver(victory),
); );
} }
} else { } else {
_myProvider.addError(); myProvider.addError();
if (_myProvider.errors == 8) { if (myProvider.errors == 8) {
await Future.delayed(Duration(milliseconds: 900)); //???? await Future.delayed(const Duration(milliseconds: 900)); //????
_myProvider.addDefeat(); myProvider.addDefeat();
showDialog( showDialog(
context: context, context: context,
builder: (context) => DialogGameOver(defeat), builder: (context) => const DialogGameOver(defeat),
); );
} }
} }
...@@ -66,12 +68,13 @@ class LetterButtons extends StatelessWidget { ...@@ -66,12 +68,13 @@ class LetterButtons extends StatelessWidget {
), ),
), ),
); );
}); }
return Container( return Container(
alignment: alignment:
orientation == Orientation.portrait ? Alignment.bottomCenter : Alignment.center, orientation == Orientation.portrait ? Alignment.bottomCenter : Alignment.center,
color: Color(darkGreen), color: const Color(darkGreen),
padding: EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
margin: EdgeInsets.only(top: orientation == Orientation.portrait ? 0.0 : paddingTop), margin: EdgeInsets.only(top: orientation == Orientation.portrait ? 0.0 : paddingTop),
child: GridView.count( child: GridView.count(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
......
...@@ -4,8 +4,9 @@ import 'package:flutter/services.dart' show SystemNavigator; ...@@ -4,8 +4,9 @@ import 'package:flutter/services.dart' show SystemNavigator;
import '../screens/scores.dart'; import '../screens/scores.dart';
class MyAppBar extends StatelessWidget implements PreferredSizeWidget { class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
const MyAppBar({super.key, this.appBar});
final AppBar? appBar; final AppBar? appBar;
const MyAppBar({Key? key, this.appBar}) : super(key: key);
@override @override
Size get preferredSize => Size.fromHeight(appBar?.preferredSize.height ?? 0.0); Size get preferredSize => Size.fromHeight(appBar?.preferredSize.height ?? 0.0);
...@@ -13,7 +14,7 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget { ...@@ -13,7 +14,7 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppBar( return AppBar(
title: Text('Hangman'), title: const Text('Hangman'),
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
actions: [ actions: [
PopupMenuButton<String>( PopupMenuButton<String>(
......
/// The list of french words, ~340,000 words in total /// The list of french words, ~340,000 words in total
const List<String> list_french_words = [ const List<String> listFrenchWords = [
'a', 'a',
'à', 'à',
'abaissa', 'abaissa',
...@@ -21,10 +21,10 @@ packages: ...@@ -21,10 +21,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.2" version: "1.18.0"
csslib: csslib:
dependency: transitive dependency: transitive
description: description:
...@@ -37,31 +37,39 @@ packages: ...@@ -37,31 +37,39 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: diacritic name: diacritic
sha256: a84e03ec2779375fb86430dbe9d8fba62c68376f2499097a5f6e75556babe706 sha256: "96db5db6149cbe4aa3cfcbfd170aca9b7648639be7e48025f9d458517f807fe4"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.4" version: "0.1.5"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "2.1.2"
file: file:
dependency: transitive dependency: transitive
description: description:
name: file name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.4" version: "7.0.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
url: "https://pub.dev"
source: hosted
version: "3.0.1"
flutter_web_plugins: flutter_web_plugins:
dependency: transitive dependency: transitive
description: flutter description: flutter
...@@ -79,10 +87,10 @@ packages: ...@@ -79,10 +87,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: http name: http
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.2.1"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
...@@ -91,22 +99,30 @@ packages: ...@@ -91,22 +99,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.2" version: "4.0.2"
lints:
dependency: transitive
description:
name: lints
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev"
source: hosted
version: "3.0.0"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.5.0" version: "0.8.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.11.0"
nested: nested:
dependency: transitive dependency: transitive
description: description:
...@@ -119,10 +135,10 @@ packages: ...@@ -119,10 +135,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.3" version: "1.9.0"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
...@@ -135,10 +151,10 @@ packages: ...@@ -135,10 +151,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
...@@ -151,34 +167,34 @@ packages: ...@@ -151,34 +167,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: platform name: platform
sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.2" version: "3.1.4"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.6" version: "2.1.8"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: provider name: provider
sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.5" version: "6.1.1"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.1" version: "2.2.2"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
...@@ -191,42 +207,42 @@ packages: ...@@ -191,42 +207,42 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_foundation name: shared_preferences_foundation
sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.4" version: "2.3.5"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_linux name: shared_preferences_linux
sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.2"
shared_preferences_platform_interface: shared_preferences_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.2"
shared_preferences_web: shared_preferences_web:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.1" version: "2.3.0"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_windows name: shared_preferences_windows
sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.2"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
...@@ -276,26 +292,26 @@ packages: ...@@ -276,26 +292,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: web name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.4-beta" version: "0.5.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.9" version: "5.2.0"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.3" version: "1.0.4"
sdks: sdks:
dart: ">=3.1.0-185.0.dev <4.0.0" dart: ">=3.3.0 <4.0.0"
flutter: ">=3.7.0" flutter: ">=3.19.0"
name: hangman name: hangman
description: Hangman game, have fun with words and letters! description: Hangman game, have fun with words and letters!
publish_to: 'none' publish_to: 'none'
version: 1.2.11+22 version: 1.2.12+23
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
...@@ -15,6 +15,9 @@ dependencies: ...@@ -15,6 +15,9 @@ dependencies:
http: ^1.1.0 http: ^1.1.0
diacritic: ^0.1.4 diacritic: ^0.1.4
dev_dependencies:
flutter_lints: ^3.0.1
flutter: flutter:
uses-material-design: true uses-material-design: true
assets: assets:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment