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

Merge branch '42-normalize-game-architecture' into 'master'

Resolve "Normalize game architecture"

Closes #42

See merge request !42
parents 520e1b60 5b4999f0
Branches 44-improve-app-metadata
Tags Release_0.2.0_41
1 merge request!42Resolve "Normalize game architecture"
Pipeline #5819 passed
Showing
with 443 additions and 347 deletions
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:minehunter/provider/data.dart';
import 'package:minehunter/ui/layout/game.dart';
import 'package:minehunter/ui/layout/parameters.dart';
class GamePage extends StatefulWidget {
const GamePage({super.key});
@override
GamePageState createState() => GamePageState();
}
class GamePageState extends State<GamePage> {
@override
void initState() {
super.initState();
final Data myProvider = Provider.of<Data>(context, listen: false);
myProvider.initParametersValues();
}
List<String> getImagesAssets(Data myProvider) {
final List<String> assets = [];
final List<String> gameImages = [
'button_back',
'button_start',
'game_fail',
'game_win',
];
for (String level in myProvider.availableLevelValues) {
gameImages.add('level_$level');
}
for (String size in myProvider.availableSizeValues) {
gameImages.add('size_$size');
}
for (String image in gameImages) {
assets.add('${'assets/icons/$image'}.png');
}
final List<String> skinImages = [
'button_mark_mine_off',
'button_mark_mine_on',
'indicator_report_on',
'indicator_report_off',
'indicator_walk_on',
'indicator_walk_off',
'tile_flag_ko',
'tile_flag_ok',
'tile_flag',
'tile_mine_not_found',
'tile_mine',
'tile_unknown',
];
for (int value = 0; value < 9; value++) {
skinImages.add('tile_$value');
}
for (String image in skinImages) {
assets.add('${'assets/skins/default_$image'}.png');
}
assets.add('assets/skins/default_empty.png');
return assets;
}
@override
Widget build(BuildContext context) {
final Data myProvider = Provider.of<Data>(context);
if (!myProvider.assetsPreloaded) {
final List<String> assets = getImagesAssets(myProvider);
for (String asset in assets) {
precacheImage(AssetImage(asset), context);
}
myProvider.updateAssetsPreloaded(true);
}
return SafeArea(
child: Center(
child: myProvider.gameIsRunning
? Game(myProvider: myProvider)
: Parameters(myProvider: myProvider),
),
);
}
}
...@@ -2,10 +2,10 @@ import 'package:easy_localization/easy_localization.dart'; ...@@ -2,10 +2,10 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:minehunter/ui/widgets/header_app.dart'; import 'package:minehunter/ui/helpers/app_titles.dart';
class AboutPage extends StatelessWidget { class PageAbout extends StatelessWidget {
const AboutPage({super.key}); const PageAbout({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -17,7 +17,7 @@ class AboutPage extends StatelessWidget { ...@@ -17,7 +17,7 @@ class AboutPage extends StatelessWidget {
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
const SizedBox(height: 8), const SizedBox(height: 8),
const AppHeader(text: 'about_title'), const AppTitle(text: 'about_title'),
const Text('about_content').tr(), const Text('about_content').tr(),
FutureBuilder<PackageInfo>( FutureBuilder<PackageInfo>(
future: PackageInfo.fromPlatform(), future: PackageInfo.fromPlatform(),
......
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
import 'package:minehunter/ui/layouts/game_layout.dart';
import 'package:minehunter/ui/layouts/parameters_layout.dart';
class PageGame extends StatelessWidget {
const PageGame({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
return currentGame.isRunning
? const GameLayout()
: ParametersLayout(canResume: currentGame.canBeResumed);
},
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:minehunter/ui/widgets/header_app.dart'; import 'package:minehunter/ui/helpers/app_titles.dart';
import 'package:minehunter/ui/widgets/settings/settings_form.dart'; import 'package:minehunter/ui/settings/settings_form.dart';
class SettingsPage extends StatelessWidget { class PageSettings extends StatelessWidget {
const SettingsPage({super.key}); const PageSettings({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -16,7 +16,7 @@ class SettingsPage extends StatelessWidget { ...@@ -16,7 +16,7 @@ class SettingsPage extends StatelessWidget {
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
SizedBox(height: 8), SizedBox(height: 8),
AppHeader(text: 'settings_title'), AppTitle(text: 'settings_title'),
SizedBox(height: 8), SizedBox(height: 8),
SettingsForm(), SettingsForm(),
], ],
......
...@@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; ...@@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart'; import 'package:unicons/unicons.dart';
import 'package:minehunter/ui/widgets/settings/theme_card.dart'; import 'package:minehunter/ui/settings/theme_card.dart';
class SettingsForm extends StatefulWidget { class SettingsForm extends StatefulWidget {
const SettingsForm({super.key}); const SettingsForm({super.key});
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:minehunter/config/menu.dart'; import 'package:minehunter/config/menu.dart';
import 'package:minehunter/cubit/bottom_nav_cubit.dart'; import 'package:minehunter/cubit/nav_cubit.dart';
import 'package:minehunter/provider/data.dart'; import 'package:minehunter/ui/widgets/global_app_bar.dart';
import 'package:minehunter/ui/widgets/app_bar.dart';
import 'package:minehunter/ui/widgets/bottom_nav_bar.dart';
class SkeletonScreen extends StatefulWidget { class SkeletonScreen extends StatelessWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
@override
State<SkeletonScreen> createState() => _SkeletonScreenState();
}
class _SkeletonScreenState extends State<SkeletonScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final Data myProvider = Provider.of<Data>(context);
return Scaffold( return Scaffold(
appBar: const GlobalAppBar(),
extendBodyBehindAppBar: false, extendBodyBehindAppBar: false,
appBar: StandardAppBar(myProvider: myProvider), body: Material(
body: BlocBuilder<BottomNavCubit, int>( color: Theme.of(context).colorScheme.surface,
child: BlocBuilder<NavCubit, int>(
builder: (BuildContext context, int pageIndex) { builder: (BuildContext context, int pageIndex) {
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
...@@ -35,8 +27,8 @@ class _SkeletonScreenState extends State<SkeletonScreen> { ...@@ -35,8 +27,8 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
); );
}, },
), ),
),
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
bottomNavigationBar: const BottomNavBar(),
); );
} }
} }
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
class DeleteSavedGameButton extends StatelessWidget {
const DeleteSavedGameButton({super.key});
@override
Widget build(BuildContext context) {
return TextButton(
child: const Image(
image: AssetImage('assets/ui/button_delete_saved_game.png'),
fit: BoxFit.fill,
),
onPressed: () {
BlocProvider.of<GameCubit>(context).deleteSavedGame();
},
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/provider/data.dart'; import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/utils/game_utils.dart';
class RestartGameButton extends StatelessWidget { class QuitGameButton extends StatelessWidget {
const RestartGameButton({super.key, required this.myProvider}); const QuitGameButton({super.key});
final Data myProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return TextButton( return TextButton(
child: const Image( child: const Image(
image: AssetImage('assets/icons/button_back.png'), image: AssetImage('assets/ui/button_back.png'),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
onPressed: () => GameUtils.quitGame(myProvider), onPressed: () {
BlocProvider.of<GameCubit>(context).quitGame();
},
); );
} }
} }
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/cubit/settings_game_cubit.dart';
import 'package:minehunter/cubit/settings_global_cubit.dart';
class StartNewGameButton extends StatelessWidget {
const StartNewGameButton({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<GameSettingsCubit, GameSettingsState>(
builder: (BuildContext context, GameSettingsState gameSettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
return TextButton(
child: const Image(
image: AssetImage('assets/ui/button_start.png'),
fit: BoxFit.fill,
),
onPressed: () {
BlocProvider.of<GameCubit>(context).startNewGame(
gameSettings: gameSettingsState.settings,
globalSettings: globalSettingsState.settings,
);
},
);
},
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
class ResumeSavedGameButton extends StatelessWidget {
const ResumeSavedGameButton({super.key});
@override
Widget build(BuildContext context) {
return TextButton(
child: const Image(
image: AssetImage('assets/ui/button_resume_game.png'),
fit: BoxFit.fill,
),
onPressed: () {
BlocProvider.of<GameCubit>(context).resumeSavedGame();
},
);
}
}
import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import 'package:minehunter/ui/widgets/header_app.dart';
import 'package:minehunter/utils/game_utils.dart';
class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
const StandardAppBar({super.key, required this.myProvider});
final Data myProvider;
@override
Widget build(BuildContext context) {
final List<Widget> menuActions = [];
if (myProvider.gameIsRunning) {
menuActions.add(TextButton(
onPressed: null,
onLongPress: () => GameUtils.quitGame(myProvider),
child: const Image(
image: AssetImage('assets/icons/button_back.png'),
fit: BoxFit.fill,
),
));
}
return AppBar(
title: const AppHeader(text: 'app_name'),
actions: menuActions,
);
}
@override
Size get preferredSize => const Size.fromHeight(50);
}
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/config/menu.dart';
import 'package:minehunter/cubit/bottom_nav_cubit.dart';
class BottomNavBar extends StatelessWidget {
const BottomNavBar({super.key});
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.all(0),
elevation: 4,
shadowColor: Theme.of(context).colorScheme.shadow,
color: Theme.of(context).colorScheme.surfaceContainerHighest,
shape: const ContinuousRectangleBorder(),
child: BlocBuilder<BottomNavCubit, int>(
builder: (BuildContext context, int state) {
return BottomNavigationBar(
currentIndex: state,
onTap: (int index) {
context.read<BottomNavCubit>().updateIndex(index);
},
type: BottomNavigationBarType.fixed,
elevation: 0,
backgroundColor: Colors.transparent,
selectedItemColor: Theme.of(context).colorScheme.primary,
unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color,
items: Menu.getMenuItems(),
);
},
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/cell.dart';
import 'package:minehunter/models/game/game.dart';
import 'package:minehunter/utils/board_animate.dart';
class CellWidget extends StatelessWidget {
const CellWidget({
super.key,
required this.cell,
required this.row,
required this.col,
});
final Cell cell;
final int row;
final int col;
@override
Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
final GameCubit gameCubit = BlocProvider.of<GameCubit>(context);
String imageAsset = getImageAssetName(
currentGame: currentGame,
);
return Container(
decoration: BoxDecoration(
color: getBackgroundColor(currentGame),
border: getCellBorders(
currentGame: currentGame,
row: row,
col: col,
),
),
child: GestureDetector(
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 100),
transitionBuilder: (Widget child, Animation<double> animation) {
return ScaleTransition(scale: animation, child: child);
},
child: Image(
image: AssetImage(imageAsset),
fit: BoxFit.fill,
key: ValueKey<int>(imageAsset.hashCode),
),
),
onTap: () {
// Set mines on board after first player try
if (!currentGame.isBoardMined) {
gameCubit.addMines(forbiddenRow: row, forbiddenCol: col);
}
if (!(currentGame.gameWin || currentGame.gameFail)) {
if (currentGame.reportMode) {
gameCubit.reportCell(
row: row,
col: col,
);
} else {
gameCubit.walkOnCell(
row: row,
col: col,
);
}
if (gameCubit.checkGameIsFinished()) {
gameCubit.updateReportMode(false);
BoardAnimate.startAnimation(
gameCubit: gameCubit,
currentGame: currentGame,
animationType: currentGame.gameWin ? 'win' : 'fail',
);
}
}
},
),
);
},
);
}
/*
* Compute image asset name, from skin and cell value/state
*/
String getImageAssetName({
required Game currentGame,
}) {
final String skin = currentGame.globalSettings.skin;
String imageAsset = 'assets/skins/${skin}_tile_unknown.png';
bool showSolution = currentGame.gameWin || currentGame.gameFail;
if (!showSolution) {
// Running game
if (cell.isExplored) {
if (cell.isMined) {
// Boom
imageAsset = 'assets/skins/${skin}_tile_mine.png';
} else {
// Show mines count around
imageAsset = 'assets/skins/${skin}_tile_${cell.minesCountAround}.png';
}
} else {
if (cell.isMarked) {
// Danger!
imageAsset = 'assets/skins/${skin}_tile_flag.png';
}
}
} else {
// Finished game
if (cell.isMined) {
if (cell.isExploded) {
// Mine exploded
imageAsset = 'assets/skins/${skin}_tile_mine.png';
} else {
// Mine not found
imageAsset = 'assets/skins/${skin}_tile_mine_not_found.png';
}
} else {
// Show all mines counts
imageAsset = 'assets/skins/${skin}_tile_${cell.minesCountAround}.png';
}
}
return imageAsset;
}
// Compute cell background color, from cell state
Color getBackgroundColor(currentGame) {
if (currentGame.gameWin) {
return cell.isAnimated ? Colors.green.shade400 : Colors.green.shade500;
}
if (currentGame.gameFail) {
return cell.isAnimated ? Colors.pink.shade200 : Colors.pink.shade400;
}
return cell.isAnimated ? Colors.white : Colors.grey.shade200;
}
// Compute cell borders, from board size and cell state
Border getCellBorders({
required Game currentGame,
required int row,
required int col,
}) {
Color cellBorderColor = Colors.grey.shade500;
double cellBorderWidth = 4;
// Reduce cell border width on big boards
int boardSize = currentGame.sizeHorizontal;
if (boardSize > 8) {
cellBorderWidth = 2;
if (boardSize > 10) {
cellBorderWidth = 1;
}
}
if (currentGame.gameWin) {
cellBorderColor = Colors.green.shade700;
} else if (currentGame.gameFail) {
cellBorderColor = Colors.pink.shade300;
}
Border borders = Border.all(
color: cellBorderColor,
width: cellBorderWidth,
);
return borders;
}
}
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
import 'package:minehunter/models/types.dart';
import 'package:minehunter/ui/widgets/game/cell.dart';
class GameBoardWidget extends StatelessWidget {
const GameBoardWidget({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
final Board board = currentGame.board;
final Color borderColor = currentGame.reportMode ? Colors.blue : Colors.black;
return Container(
margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: borderColor,
borderRadius: BorderRadius.circular(2),
border: Border.all(
color: borderColor,
width: 2,
),
),
child: Table(
defaultColumnWidth: const IntrinsicColumnWidth(),
children: [
for (int row = 0; row < currentGame.sizeVertical; row++)
TableRow(
children: [
for (int col = 0; col < currentGame.sizeHorizontal; col++)
Column(
children: [
CellWidget(cell: board[row][col], row: row, col: col)
],
),
],
),
],
),
),
],
),
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import 'package:minehunter/utils/board_utils.dart';
class TopIndicator extends StatelessWidget {
const TopIndicator({super.key, required this.myProvider});
final Data myProvider;
@override
Widget build(BuildContext context) {
final int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.board);
final int minesCount = myProvider.minesCount;
const double blockSize = 40;
final Image flagIconBlock = Image(
image: AssetImage('assets/skins/${myProvider.parameterSkin}_tile_flag.png'),
fit: BoxFit.fill,
height: blockSize,
width: blockSize,
);
final Image mineIconBlock = Image(
image: AssetImage('assets/skins/${myProvider.parameterSkin}_tile_mine.png'),
fit: BoxFit.fill,
height: blockSize,
width: blockSize,
);
final Text markedMinesCountBlock = Text(
flaggedCellsCount.toString(),
style: TextStyle(
fontSize: blockSize,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
);
final Text placedMinesCountBlock = Text(
minesCount.toString(),
style: TextStyle(
fontSize: blockSize,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
markedMinesCountBlock,
flagIconBlock,
const SizedBox(width: blockSize * 2),
mineIconBlock,
placedMinesCountBlock,
],
)
],
);
}
}
import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import 'package:minehunter/ui/widgets/home/button_game_restart.dart';
class EndGameMessage extends StatelessWidget {
const EndGameMessage({super.key, required this.myProvider});
final Data myProvider;
@override
Widget build(BuildContext context) {
final Image decorationImage = Image(
image: AssetImage(myProvider.gameWin
? 'assets/icons/game_win.png'
: myProvider.gameFail
? 'assets/icons/game_fail.png'
: ''),
fit: BoxFit.fill,
);
return Container(
margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2),
child: Table(
defaultColumnWidth: const IntrinsicColumnWidth(),
children: [
TableRow(
children: [
Column(
children: [decorationImage],
),
Column(
children: [
myProvider.animationInProgress
? decorationImage
: RestartGameButton(myProvider: myProvider)
],
),
Column(
children: [decorationImage],
),
],
),
],
),
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/provider/data.dart'; import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
class ToggleGameModeButton extends StatelessWidget { class ToggleGameModeButton extends StatelessWidget {
const ToggleGameModeButton({super.key, required this.myProvider}); const ToggleGameModeButton({super.key});
final Data myProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
final String skin = currentGame.globalSettings.skin;
final String reportModeSuffix = currentGame.reportMode ? 'on' : 'off';
return TextButton( return TextButton(
child: Image( child: Image(
image: AssetImage( image: AssetImage('assets/skins/${skin}_button_mark_mine_$reportModeSuffix.png'),
'assets/skins/${myProvider.parameterSkin}_button_mark_mine_$reportModeSuffix.png'),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
onPressed: () => myProvider.updateReportMode(!myProvider.reportMode), onPressed: () {
BlocProvider.of<GameCubit>(context).updateReportMode(!currentGame.reportMode);
},
);
},
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/provider/data.dart'; import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
class GameModeIndicatorReport extends StatelessWidget { class GameModeIndicatorReport extends StatelessWidget {
const GameModeIndicatorReport({super.key, required this.myProvider}); const GameModeIndicatorReport({super.key});
final Data myProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
final String skin = currentGame.globalSettings.skin;
final String reportModeSuffix = currentGame.reportMode ? 'on' : 'off';
return TextButton( return TextButton(
child: Image( child: Image(
image: AssetImage( image: AssetImage('assets/skins/${skin}_indicator_report_$reportModeSuffix.png'),
'assets/skins/${myProvider.parameterSkin}_indicator_report_$reportModeSuffix.png'),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
onPressed: () => myProvider.updateReportMode(true), onPressed: () {
BlocProvider.of<GameCubit>(context).updateReportMode(true);
},
);
},
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:minehunter/provider/data.dart'; import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
class GameModeIndicatorWalk extends StatelessWidget { class GameModeIndicatorWalk extends StatelessWidget {
const GameModeIndicatorWalk({super.key, required this.myProvider}); const GameModeIndicatorWalk({super.key});
final Data myProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String reportModeSuffix = myProvider.reportMode ? 'off' : 'on'; return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
final String skin = currentGame.globalSettings.skin;
final String reportModeSuffix = currentGame.reportMode ? 'off' : 'on';
return TextButton( return TextButton(
child: Image( child: Image(
image: AssetImage( image: AssetImage('assets/skins/${skin}_indicator_walk_$reportModeSuffix.png'),
'assets/skins/${myProvider.parameterSkin}_indicator_walk_$reportModeSuffix.png'),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
onPressed: () => myProvider.updateReportMode(false), onPressed: () {
BlocProvider.of<GameCubit>(context).updateReportMode(false);
},
);
},
); );
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment