Skip to content

Commit 5e5d470

Browse files
committed
refactor: уменьшение количества ребилдов благодаря использованию selector вместо consumer и context.watch
1 parent a18f059 commit 5e5d470

3 files changed

Lines changed: 80 additions & 58 deletions

File tree

frontend/lib/views/setting_view/game_settings_mobile.dart

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class GameSettingsMobile extends StatelessWidget {
88
@override
99
Widget build(BuildContext context) {
1010
final scheme = Theme.of(context).colorScheme;
11+
final gameSettingsProvider = context.read<GameSettingsProvider>();
1112
return DefaultTabController(
1213
length: 2,
1314
child: Scaffold(
@@ -25,43 +26,52 @@ class GameSettingsMobile extends StatelessWidget {
2526
child: Padding(
2627
padding:
2728
const EdgeInsets.only(left: 24, right: 24, top: 24),
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-
)),
29+
child: Selector<
30+
GameSettingsProvider,
31+
({
32+
bool withoutTime,
33+
int durationOfGame,
34+
int addingOfMove
35+
})>(
36+
selector: (_, provider) => (
37+
withoutTime: provider.withoutTime,
38+
durationOfGame: provider.durationOfGame,
39+
addingOfMove: provider.addingOfMove
40+
),
41+
builder: (_, values, __) => Column(
42+
crossAxisAlignment: CrossAxisAlignment.center,
43+
children: [
44+
AppBarSettings(
45+
label: GameSettingConsts.appBarLabel),
46+
CustomTabBar(
47+
initialIndex: values.withoutTime ? 0 : 1,
48+
header: GameSettingConsts.timeText,
49+
subTitles: [
50+
GameSettingConsts.gameWithoutTimeText,
51+
GameSettingConsts.gameWithTimeText,
52+
],
53+
isSettingsPage: true,
54+
onTap: (dynamic index) =>
55+
gameSettingsProvider.setIsTime(index as int),
56+
),
57+
if (!values.withoutTime) ...[
58+
SetTimeSection(
59+
minutesStartValue: values.durationOfGame,
60+
minutesOnChanged: (dynamic value) =>
61+
gameSettingsProvider
62+
.setMinutes(value as int),
63+
secondsStartValue: values.addingOfMove == 0
64+
? GameSettingConsts.longDashSymbol
65+
: values.addingOfMove,
66+
secondsOnChanged: (dynamic value) =>
67+
gameSettingsProvider.setSeconds(value),
68+
)
69+
],
70+
const SettingsRowsSection(),
71+
const SizedBox(height: 100),
72+
],
73+
),
74+
),
6575
),
6676
),
6777
),
@@ -82,9 +92,8 @@ class GameSettingsMobile extends StatelessWidget {
8292
textColor: ColorsConst.primaryColor0,
8393
buttonColor: scheme.secondaryContainer,
8494
isClickable: true,
85-
onTap: () => context
86-
.read<GameSettingsProvider>()
87-
.handleStartGame(context),
95+
onTap: () =>
96+
gameSettingsProvider.handleStartGame(context),
8897
),
8998
),
9099
),

frontend/lib/views/setting_view/game_settings_tablet.dart

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class GameSettingsTablet extends StatelessWidget {
77
@override
88
Widget build(BuildContext context) {
99
final scheme = Theme.of(context).colorScheme;
10+
final gameSettingsProvider = context.read<GameSettingsProvider>();
11+
1012
return DefaultTabController(
1113
length: 2,
1214
child: Scaffold(
@@ -22,38 +24,48 @@ class GameSettingsTablet extends StatelessWidget {
2224
child: Padding(
2325
padding:
2426
const EdgeInsets.only(left: 24, right: 24, top: 24),
25-
child: Consumer<GameSettingsProvider>(
26-
builder: (_, settingsProvider, __) {
27+
child: Selector<
28+
GameSettingsProvider,
29+
({
30+
bool withoutTime,
31+
int durationOfGame,
32+
int addingOfMove
33+
})>(
34+
selector: (_, provider) => (
35+
withoutTime: provider.withoutTime,
36+
durationOfGame: provider.durationOfGame,
37+
addingOfMove: provider.addingOfMove
38+
),
39+
builder: (_, values, __) {
2740
return Column(
2841
crossAxisAlignment: CrossAxisAlignment.center,
2942
children: [
3043
AppBarSettings(
3144
label: GameSettingConsts.appBarLabel),
3245
CustomTabBar(
33-
initialIndex:
34-
settingsProvider.withoutTime ? 0 : 1,
46+
initialIndex: values.withoutTime ? 0 : 1,
3547
header: GameSettingConsts.timeText,
3648
subTitles: [
3749
GameSettingConsts.gameWithoutTimeText,
3850
GameSettingConsts.gameWithTimeText,
3951
],
4052
isSettingsPage: true,
4153
onTap: (dynamic index) =>
42-
settingsProvider.setIsTime(index as int),
54+
gameSettingsProvider.setIsTime(index as int),
4355
),
44-
if (!settingsProvider.withoutTime) ...[
56+
if (!values.withoutTime) ...[
4557
const SizedBox(height: 70),
4658
SetTimeSection(
47-
minutesStartValue:
48-
settingsProvider.durationOfGame,
59+
minutesStartValue: values.durationOfGame,
4960
minutesOnChanged: (dynamic value) =>
50-
settingsProvider.setMinutes(value as int),
51-
secondsStartValue:
52-
settingsProvider.addingOfMove == 0
53-
? GameSettingConsts.longDashSymbol
54-
: settingsProvider.addingOfMove,
61+
gameSettingsProvider
62+
.setMinutes(value as int),
63+
secondsStartValue: values.addingOfMove == 0
64+
? GameSettingConsts.longDashSymbol
65+
: values.addingOfMove,
5566
secondsOnChanged: (dynamic value) =>
56-
settingsProvider.setSeconds(value as int),
67+
gameSettingsProvider
68+
.setSeconds(value as int),
5769
)
5870
],
5971
const SizedBox(height: 120),
@@ -82,9 +94,8 @@ class GameSettingsTablet extends StatelessWidget {
8294
textColor: ColorsConst.primaryColor0,
8395
buttonColor: scheme.secondaryContainer,
8496
isClickable: true,
85-
onTap: () => context
86-
.read<GameSettingsProvider>()
87-
.handleStartGame(context),
97+
onTap: () =>
98+
gameSettingsProvider.handleStartGame(context),
8899
),
89100
),
90101
),

frontend/lib/views/setting_view/game_settings_view.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ class GameSettingsView extends StatelessWidget {
1818
create: (context) => GameSettingsProvider(gameModel: gameModel),
1919
child: LayoutBuilder(
2020
builder: (context, constraints) {
21-
if (context.watch<GameSettingsProvider>().isLoading) {
21+
final isLoading = (context
22+
.select((GameSettingsProvider provider) => provider.isLoading));
23+
if (isLoading) {
2224
return const LoadingWidget();
2325
}
2426
return SharedFunctions.isTablet(context)

0 commit comments

Comments
 (0)