Skip to content

Commit a18f059

Browse files
committed
fix: замена stateful виджета с настройками игры на change notifier для более удобного доступа из любой части поддерева виджетов
1 parent 027fab5 commit a18f059

6 files changed

Lines changed: 267 additions & 262 deletions

File tree

frontend/lib/router/router.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ final shellRoutes = [
7070
parentNavigatorKey: shellNavigatorKey,
7171
builder: (BuildContext context, GoRouterState state) {
7272
return GameSettingsView(
73-
state.extra as GameModel,
74-
key: gameSettingsViewStateKey,
73+
gameModel: state.extra as GameModel,
7574
);
7675
},
7776
),

frontend/lib/views/setting_view/components/settings_rows_section.dart

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
22
import 'package:frontend/common/shared_functions.dart';
33
import 'package:frontend/exports.dart';
44
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
5+
import 'package:frontend/views/setting_view/providers/game_settings_provider.dart';
6+
import 'package:provider/provider.dart';
57

68
class SettingsRowsSection extends StatelessWidget {
79
const SettingsRowsSection({
@@ -10,7 +12,6 @@ class SettingsRowsSection extends StatelessWidget {
1012

1113
@override
1214
Widget build(BuildContext context) {
13-
final settingsState = gameSettingsViewStateKey.currentState;
1415
final l10n = AppLocalizations.of(context)!;
1516
return Column(
1617
crossAxisAlignment: CrossAxisAlignment.start,
@@ -27,28 +28,29 @@ class SettingsRowsSection extends StatelessWidget {
2728
),
2829
),
2930
),
30-
Column(
31-
children: [
32-
SettingsRow(
33-
chose: settingsState?.isMoveBack,
34-
text: l10n.undoMoves,
35-
modalHeader: l10n.undoMovesDescription,
36-
onChanged: settingsState?.setIsMoveBack,
37-
),
38-
SettingsRow(
39-
chose: settingsState?.isThreats,
40-
text: l10n.threats,
41-
modalHeader: l10n.threatsDescription,
42-
onChanged: settingsState?.setIsThreats,
43-
),
44-
SettingsRow(
45-
chose: settingsState?.isHints,
46-
text: l10n.hints,
47-
modalHeader: l10n.hintsDescription,
48-
onChanged: settingsState?.setIsHints,
49-
)
50-
],
51-
),
31+
Consumer<GameSettingsProvider>(
32+
builder: (_, provider, __) => Column(
33+
children: [
34+
SettingsRow(
35+
chose: provider.isMoveBack,
36+
text: l10n.undoMoves,
37+
modalHeader: l10n.undoMovesDescription,
38+
onChanged: provider.setIsMoveBack,
39+
),
40+
SettingsRow(
41+
chose: provider.isThreats,
42+
text: l10n.threats,
43+
modalHeader: l10n.threatsDescription,
44+
onChanged: provider.setIsThreats,
45+
),
46+
SettingsRow(
47+
chose: provider.isHints,
48+
text: l10n.hints,
49+
modalHeader: l10n.hintsDescription,
50+
onChanged: provider.setIsHints,
51+
)
52+
],
53+
)),
5254
],
5355
);
5456
}

frontend/lib/views/setting_view/game_settings_mobile.dart

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ class GameSettingsMobile extends StatelessWidget {
88
@override
99
Widget build(BuildContext context) {
1010
final scheme = Theme.of(context).colorScheme;
11-
final settingsState = gameSettingsViewStateKey.currentState;
1211
return DefaultTabController(
1312
length: 2,
1413
child: Scaffold(
@@ -26,40 +25,43 @@ class GameSettingsMobile extends StatelessWidget {
2625
child: Padding(
2726
padding:
2827
const EdgeInsets.only(left: 24, right: 24, top: 24),
29-
child: Column(
30-
crossAxisAlignment: CrossAxisAlignment.center,
31-
children: [
32-
AppBarSettings(label: GameSettingConsts.appBarLabel),
33-
CustomTabBar(
34-
initialIndex: settingsState!.withoutTime ? 0 : 1,
35-
header: GameSettingConsts.timeText,
36-
subTitles: [
37-
GameSettingConsts.gameWithoutTimeText,
38-
GameSettingConsts.gameWithTimeText,
39-
],
40-
isSettingsPage: true,
41-
onTap: (dynamic index) => gameSettingsViewStateKey
42-
.currentState
43-
?.setIsTime(index as int),
44-
),
45-
if (!settingsState.withoutTime) ...[
46-
SetTimeSection(
47-
minutesStartValue: settingsState.durationOfGame,
48-
minutesOnChanged: (dynamic value) =>
49-
gameSettingsViewStateKey.currentState
50-
?.setMinutes(value as int),
51-
secondsStartValue: settingsState.addingOfMove == 0
52-
? GameSettingConsts.longDashSymbol
53-
: settingsState.addingOfMove,
54-
secondsOnChanged: (dynamic value) =>
55-
gameSettingsViewStateKey.currentState
56-
?.setSeconds(value as int),
57-
)
58-
],
59-
const SettingsRowsSection(),
60-
const SizedBox(height: 100),
61-
],
62-
),
28+
child: Consumer<GameSettingsProvider>(
29+
builder: (_, settingsProvider, __) => Column(
30+
crossAxisAlignment: CrossAxisAlignment.center,
31+
children: [
32+
AppBarSettings(
33+
label: GameSettingConsts.appBarLabel),
34+
CustomTabBar(
35+
initialIndex:
36+
settingsProvider.withoutTime ? 0 : 1,
37+
header: GameSettingConsts.timeText,
38+
subTitles: [
39+
GameSettingConsts.gameWithoutTimeText,
40+
GameSettingConsts.gameWithTimeText,
41+
],
42+
isSettingsPage: true,
43+
onTap: (dynamic index) => settingsProvider
44+
.setIsTime(index as int),
45+
),
46+
if (!settingsProvider.withoutTime) ...[
47+
SetTimeSection(
48+
minutesStartValue:
49+
settingsProvider.durationOfGame,
50+
minutesOnChanged: (dynamic value) =>
51+
settingsProvider
52+
.setMinutes(value as int),
53+
secondsStartValue:
54+
settingsProvider.addingOfMove == 0
55+
? GameSettingConsts.longDashSymbol
56+
: settingsProvider.addingOfMove,
57+
secondsOnChanged: (dynamic value) =>
58+
settingsProvider.setSeconds(value),
59+
)
60+
],
61+
const SettingsRowsSection(),
62+
const SizedBox(height: 100),
63+
],
64+
)),
6365
),
6466
),
6567
),
@@ -80,7 +82,9 @@ class GameSettingsMobile extends StatelessWidget {
8082
textColor: ColorsConst.primaryColor0,
8183
buttonColor: scheme.secondaryContainer,
8284
isClickable: true,
83-
onTap: () => settingsState.handleStartGame(context),
85+
onTap: () => context
86+
.read<GameSettingsProvider>()
87+
.handleStartGame(context),
8488
),
8589
),
8690
),

frontend/lib/views/setting_view/game_settings_tablet.dart

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ class GameSettingsTablet extends StatelessWidget {
77
@override
88
Widget build(BuildContext context) {
99
final scheme = Theme.of(context).colorScheme;
10-
final settingsState = gameSettingsViewStateKey.currentState;
1110
return DefaultTabController(
1211
length: 2,
1312
child: Scaffold(
@@ -23,39 +22,46 @@ class GameSettingsTablet extends StatelessWidget {
2322
child: Padding(
2423
padding:
2524
const EdgeInsets.only(left: 24, right: 24, top: 24),
26-
child: Column(
27-
crossAxisAlignment: CrossAxisAlignment.center,
28-
children: [
29-
AppBarSettings(label: GameSettingConsts.appBarLabel),
30-
CustomTabBar(
31-
initialIndex: settingsState!.withoutTime ? 0 : 1,
32-
header: GameSettingConsts.timeText,
33-
subTitles: [
34-
GameSettingConsts.gameWithoutTimeText,
35-
GameSettingConsts.gameWithTimeText,
25+
child: Consumer<GameSettingsProvider>(
26+
builder: (_, settingsProvider, __) {
27+
return Column(
28+
crossAxisAlignment: CrossAxisAlignment.center,
29+
children: [
30+
AppBarSettings(
31+
label: GameSettingConsts.appBarLabel),
32+
CustomTabBar(
33+
initialIndex:
34+
settingsProvider.withoutTime ? 0 : 1,
35+
header: GameSettingConsts.timeText,
36+
subTitles: [
37+
GameSettingConsts.gameWithoutTimeText,
38+
GameSettingConsts.gameWithTimeText,
39+
],
40+
isSettingsPage: true,
41+
onTap: (dynamic index) =>
42+
settingsProvider.setIsTime(index as int),
43+
),
44+
if (!settingsProvider.withoutTime) ...[
45+
const SizedBox(height: 70),
46+
SetTimeSection(
47+
minutesStartValue:
48+
settingsProvider.durationOfGame,
49+
minutesOnChanged: (dynamic value) =>
50+
settingsProvider.setMinutes(value as int),
51+
secondsStartValue:
52+
settingsProvider.addingOfMove == 0
53+
? GameSettingConsts.longDashSymbol
54+
: settingsProvider.addingOfMove,
55+
secondsOnChanged: (dynamic value) =>
56+
settingsProvider.setSeconds(value as int),
57+
)
58+
],
59+
const SizedBox(height: 120),
60+
const SettingsRowsSection(),
61+
const SizedBox(height: 100),
3662
],
37-
isSettingsPage: true,
38-
onTap: (dynamic index) => gameSettingsViewStateKey
39-
.currentState
40-
?.setIsTime(index as int),
41-
),
42-
if (!settingsState.withoutTime) ...[
43-
const SizedBox(height: 70),
44-
SetTimeSection(
45-
minutesStartValue: settingsState.durationOfGame,
46-
minutesOnChanged: (dynamic value) =>
47-
settingsState.setMinutes(value as int),
48-
secondsStartValue: settingsState.addingOfMove == 0
49-
? GameSettingConsts.longDashSymbol
50-
: settingsState.addingOfMove,
51-
secondsOnChanged: (dynamic value) =>
52-
settingsState.setSeconds(value as int),
53-
)
54-
],
55-
const SizedBox(height: 120),
56-
const SettingsRowsSection(),
57-
const SizedBox(height: 100),
58-
],
63+
);
64+
},
5965
),
6066
),
6167
),
@@ -76,7 +82,9 @@ class GameSettingsTablet extends StatelessWidget {
7682
textColor: ColorsConst.primaryColor0,
7783
buttonColor: scheme.secondaryContainer,
7884
isClickable: true,
79-
onTap: () => settingsState.handleStartGame(context),
85+
onTap: () => context
86+
.read<GameSettingsProvider>()
87+
.handleStartGame(context),
8088
),
8189
),
8290
),

0 commit comments

Comments
 (0)