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

Add (minimal) settings page

parent 1eca6748
No related branches found
No related tags found
1 merge request!12Resolve "Add settings"
Pipeline #4798 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.10 app.versionName=0.0.11
app.versionCode=10 app.versionCode=11
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
"app_name": "Twister", "app_name": "Twister",
"bottom_nav_game": "Game", "bottom_nav_game": "Game",
"bottom_nav_settings": "Settings",
"settings_title": "Settings",
"settings_title_game": "Game settings",
"settings_label_game_timer_value": "Timer value: ",
"lang_prefix": "en" "lang_prefix": "en"
} }
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
"app_name": "Twister", "app_name": "Twister",
"bottom_nav_game": "Jeu", "bottom_nav_game": "Jeu",
"bottom_nav_settings": "Réglages",
"settings_title": "Réglages",
"settings_title_game": "Paramètres du jeu",
"settings_label_game_timer_value": "Durée du chrono : ",
"lang_prefix": "fr" "lang_prefix": "fr"
} }
Add (minimal) application settings page.
Ajout d'une page (minimale) de paramétrage de l'application.
class DefaultSettings {
static const int defaultTimerValue = 20;
static const List<int> allowedTimerValues = [
10,
defaultTimerValue,
30,
];
}
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:twister/config/default_settings.dart';
part 'settings_state.dart';
class SettingsCubit extends HydratedCubit<SettingsState> {
SettingsCubit() : super(const SettingsState());
int getTimerValue() {
return state.timerValue ?? DefaultSettings.defaultTimerValue;
}
void setValues({
int? timerValue,
}) {
emit(SettingsState(
timerValue: timerValue ?? state.timerValue,
));
}
@override
SettingsState? fromJson(Map<String, dynamic> json) {
int timerValue = json['timerValue'] as int;
return SettingsState(
timerValue: timerValue,
);
}
@override
Map<String, dynamic>? toJson(SettingsState state) {
return <String, dynamic>{
'timerValue': state.timerValue ?? DefaultSettings.defaultTimerValue,
};
}
}
part of 'settings_cubit.dart';
@immutable
class SettingsState extends Equatable {
const SettingsState({
this.timerValue,
});
final int? timerValue;
@override
List<dynamic> get props => <dynamic>[
timerValue,
];
Map<String, dynamic> get values => <String, dynamic>{
'discoveriesDaysCount': timerValue,
};
}
...@@ -9,6 +9,7 @@ import 'package:path_provider/path_provider.dart'; ...@@ -9,6 +9,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:twister/config/theme.dart'; import 'package:twister/config/theme.dart';
import 'package:twister/cubit/bottom_nav_cubit.dart'; import 'package:twister/cubit/bottom_nav_cubit.dart';
import 'package:twister/cubit/settings_cubit.dart';
import 'package:twister/ui/skeleton.dart'; import 'package:twister/ui/skeleton.dart';
void main() async { void main() async {
...@@ -43,6 +44,7 @@ class MyApp extends StatelessWidget { ...@@ -43,6 +44,7 @@ class MyApp extends StatelessWidget {
return MultiBlocProvider( return MultiBlocProvider(
providers: [ providers: [
BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()), BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()),
BlocProvider<SettingsCubit>(create: (context) => SettingsCubit()),
], ],
child: MaterialApp( child: MaterialApp(
title: 'Twister', title: 'Twister',
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:twister/ui/widgets/app_titles.dart';
import 'package:twister/ui/widgets/settings_form.dart';
import 'package:unicons/unicons.dart';
class ScreenSettings extends StatelessWidget {
const ScreenSettings({super.key});
static Icon navBarIcon = const Icon(UniconsLine.setting);
static String navBarText = 'bottom_nav_settings';
@override
Widget build(BuildContext context) {
return Material(
color: Theme.of(context).colorScheme.background,
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 4),
physics: const BouncingScrollPhysics(),
children: <Widget>[
SizedBox(height: 8),
AppTitle1(text: tr('settings_title')),
SettingsForm(),
],
),
);
}
}
...@@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; ...@@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:twister/cubit/bottom_nav_cubit.dart'; import 'package:twister/cubit/bottom_nav_cubit.dart';
import 'package:twister/ui/screens/home.dart'; import 'package:twister/ui/screens/home.dart';
import 'package:twister/ui/screens/settings.dart';
import 'package:twister/ui/widgets/app_bar.dart'; import 'package:twister/ui/widgets/app_bar.dart';
import 'package:twister/ui/widgets/bottom_nav_bar.dart'; import 'package:twister/ui/widgets/bottom_nav_bar.dart';
...@@ -18,7 +19,7 @@ class _SkeletonScreenState extends State<SkeletonScreen> { ...@@ -18,7 +19,7 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> pageNavigation = <Widget>[ List<Widget> pageNavigation = <Widget>[
const ScreenHome(), const ScreenHome(),
const ScreenHome(), const ScreenSettings(),
]; ];
return Scaffold( return Scaffold(
......
...@@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; ...@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:twister/cubit/bottom_nav_cubit.dart'; import 'package:twister/cubit/bottom_nav_cubit.dart';
import 'package:twister/ui/screens/settings.dart';
import 'package:twister/ui/screens/home.dart'; import 'package:twister/ui/screens/home.dart';
class BottomNavBar extends StatelessWidget { class BottomNavBar extends StatelessWidget {
...@@ -36,8 +37,8 @@ class BottomNavBar extends StatelessWidget { ...@@ -36,8 +37,8 @@ class BottomNavBar extends StatelessWidget {
label: tr(ScreenHome.navBarText), label: tr(ScreenHome.navBarText),
), ),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: ScreenHome.navBarIcon, icon: ScreenSettings.navBarIcon,
label: tr(ScreenHome.navBarText), label: tr(ScreenSettings.navBarText),
), ),
], ],
); );
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:twister/config/default_settings.dart';
import 'package:twister/cubit/settings_cubit.dart';
import 'package:twister/ui/widgets/app_titles.dart';
class SettingsForm extends StatefulWidget {
const SettingsForm({super.key});
@override
State<SettingsForm> createState() => _SettingsFormState();
}
class _SettingsFormState extends State<SettingsForm> {
int timerValue = DefaultSettings.defaultTimerValue;
List<bool> _selectedTimerValue = [];
@override
void didChangeDependencies() {
SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);
timerValue = settings.getTimerValue();
_selectedTimerValue =
DefaultSettings.allowedTimerValues.map((e) => (e == timerValue)).toList();
super.didChangeDependencies();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
void saveSettings() {
BlocProvider.of<SettingsCubit>(context).setValues(
timerValue: timerValue,
);
}
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
SizedBox(height: 8),
AppTitle2(text: tr('settings_title_game')),
// Timer value
Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('settings_label_game_timer_value').tr(),
ToggleButtons(
onPressed: (int index) {
setState(() {
timerValue = DefaultSettings.allowedTimerValues[index];
for (int i = 0; i < _selectedTimerValue.length; i++) {
_selectedTimerValue[i] = i == index;
}
});
saveSettings();
},
borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
isSelected: _selectedTimerValue,
children:
DefaultSettings.allowedTimerValues.map((e) => Text(e.toString())).toList(),
),
],
),
],
);
}
}
...@@ -3,7 +3,7 @@ description: twister game companion ...@@ -3,7 +3,7 @@ description: twister game companion
publish_to: 'none' publish_to: 'none'
version: 0.0.10+10 version: 0.0.11+11
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment