Skip to content

Commit

Permalink
feat[screen_home]: update screen
Browse files Browse the repository at this point in the history
  • Loading branch information
MahanRahmati committed Sep 17, 2023
1 parent f54dac6 commit ea11dec
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 46 deletions.
47 changes: 47 additions & 0 deletions packages/screen_home/lib/src/screens/home_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class HomePage extends ConsumerStatefulWidget {
const HomePage({super.key});

@override
ConsumerState<HomePage> createState() => _HomePageState();
}

class _HomePageState extends ConsumerState<HomePage>
with AutomaticKeepAliveClientMixin {
int _counter = 0;

@override
bool get wantKeepAlive => true;

void _incrementCounter() {
setState(() => _counter++);
}

@override
Widget build(final BuildContext context) {
super.build(context);
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
85 changes: 39 additions & 46 deletions packages/screen_home/lib/src/screens/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,63 +1,56 @@
import 'package:app_localizations/app_localizations.dart';
import 'package:app_providers/app_providers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class HomeScreen extends ConsumerWidget {
import '/src/screens/home_page.dart';
import '/src/screens/settings_page.dart';
import '/src/widgets/home_screen_navigation_bar.dart';

class HomeScreen extends ConsumerStatefulWidget {
const HomeScreen({super.key});

void changeThemeMode(final WidgetRef ref, final ThemeMode mode) {
ref.read(appThemeModeProvider.notifier).setThemeMode(mode);
@override
ConsumerState<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends ConsumerState<HomeScreen> {
int _selectedIndex = 0;

late PageController _pageController;

@override
void initState() {
_pageController = PageController(initialPage: _selectedIndex);
super.initState();
}

void changeLocale(final WidgetRef ref, final AppLocale locale) {
ref.read(appLanguageProvider.notifier).setLocale(locale);
void onDestinationSelected(final int index) {
_selectedIndex = index;
_pageController.jumpToPage(index);
setState(() {});
}

@override
Widget build(final BuildContext context, final WidgetRef ref) {
final AsyncValue<ThemeMode> themeMode = ref.watch(appThemeModeProvider);
final AsyncValue<AppLocale> appLocale = ref.watch(appLanguageProvider);
final StringsEn t = ref.watch(translationProvider);
void dispose() {
_pageController.dispose();
super.dispose();
}

@override
Widget build(final BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(title: Text(t.hello(name: 'user'))),
body: ListView(
children: <Widget>[
ListTile(title: Text(t.theme.theme)),
RadioListTile<ThemeMode>(
value: ThemeMode.system,
groupValue: themeMode.value,
title: Text(t.theme.system),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.system),
),
RadioListTile<ThemeMode>(
value: ThemeMode.dark,
groupValue: themeMode.value,
title: Text(t.theme.dark),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.dark),
),
RadioListTile<ThemeMode>(
value: ThemeMode.light,
groupValue: themeMode.value,
title: Text(t.theme.light),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.light),
),
ListTile(title: Text(t.language)),
RadioListTile<AppLocale>(
value: AppLocale.en,
groupValue: appLocale.value,
title: const Text('En'),
onChanged: (final _) => changeLocale(ref, AppLocale.en),
),
RadioListTile<AppLocale>(
value: AppLocale.de,
groupValue: appLocale.value,
title: const Text('De'),
onChanged: (final _) => changeLocale(ref, AppLocale.de),
),
body: PageView(
controller: _pageController,
physics: const NeverScrollableScrollPhysics(),
children: const <Widget>[
HomePage(),
SettingsPage(),
],
),
bottomNavigationBar: HomeScreenNavigationBar(
selectedIndex: _selectedIndex,
onDestinationSelected: onDestinationSelected,
),
);
}
}
61 changes: 61 additions & 0 deletions packages/screen_home/lib/src/screens/settings_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import 'package:app_localizations/app_localizations.dart';
import 'package:app_providers/app_providers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class SettingsPage extends ConsumerWidget {
const SettingsPage({super.key});

void changeThemeMode(final WidgetRef ref, final ThemeMode mode) {
ref.read(appThemeModeProvider.notifier).setThemeMode(mode);
}

void changeLocale(final WidgetRef ref, final AppLocale locale) {
ref.read(appLanguageProvider.notifier).setLocale(locale);
}

@override
Widget build(final BuildContext context, final WidgetRef ref) {
final AsyncValue<ThemeMode> themeMode = ref.watch(appThemeModeProvider);
final AsyncValue<AppLocale> appLocale = ref.watch(appLanguageProvider);
final StringsEn t = ref.watch(translationProvider);
return Scaffold(
body: ListView(
children: <Widget>[
ListTile(title: Text(t.theme.theme)),
RadioListTile<ThemeMode>(
value: ThemeMode.system,
groupValue: themeMode.value,
title: Text(t.theme.system),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.system),
),
RadioListTile<ThemeMode>(
value: ThemeMode.dark,
groupValue: themeMode.value,
title: Text(t.theme.dark),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.dark),
),
RadioListTile<ThemeMode>(
value: ThemeMode.light,
groupValue: themeMode.value,
title: Text(t.theme.light),
onChanged: (final _) => changeThemeMode(ref, ThemeMode.light),
),
ListTile(title: Text(t.language)),
RadioListTile<AppLocale>(
value: AppLocale.en,
groupValue: appLocale.value,
title: const Text('En'),
onChanged: (final _) => changeLocale(ref, AppLocale.en),
),
RadioListTile<AppLocale>(
value: AppLocale.de,
groupValue: appLocale.value,
title: const Text('De'),
onChanged: (final _) => changeLocale(ref, AppLocale.de),
),
],
),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';

class HomeScreenNavigationBar extends StatelessWidget {
const HomeScreenNavigationBar({
super.key,
required this.selectedIndex,
this.onDestinationSelected,
});

final int selectedIndex;
final ValueChanged<int>? onDestinationSelected;

@override
Widget build(final BuildContext context) {
return NavigationBar(
selectedIndex: selectedIndex,
onDestinationSelected: onDestinationSelected,
destinations: const <Widget>[
NavigationDestination(
selectedIcon: Icon(Icons.home),
icon: Icon(Icons.home_outlined),
label: 'Home',
),
NavigationDestination(
selectedIcon: Icon(Icons.settings),
icon: Icon(Icons.settings_outlined),
label: 'Settings',
),
],
);
}
}

0 comments on commit ea11dec

Please sign in to comment.