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

Use navigation tools from flutter_custom_toolbox

parent 23ee1928
No related branches found
No related tags found
1 merge request!74Resolve "Use navigation widgets from flutter_custom_toolbox"
Pipeline #7167 passed
Showing
with 181 additions and 472 deletions
Use navigation tools from flutter_custom_toolbox.
Utilisation des outils de navigation entre pages depuis flutter_custom_toolbox.
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:ionicons/ionicons.dart';
import 'package:scrobbles/common/ui/pages/discoveries.dart';
import 'package:scrobbles/common/ui/pages/home.dart';
import 'package:scrobbles/common/ui/pages/statistics.dart';
import 'package:scrobbles/cubit/activity/activity_cubit.dart';
import 'package:scrobbles/models/activity/activity.dart';
class ActivityPageItem {
final String code;
final Icon icon;
final Widget Function({required Activity currentActivity})? builder;
const ActivityPageItem({
required this.code,
required this.icon,
required this.builder,
});
}
class ActivityPage {
static const bool displayBottomNavBar = false;
static const indexHome = 0;
static final ActivityPageItem pageHome = ActivityPageItem(
code: 'page_home',
icon: Icon(Ionicons.home_outline),
builder: ({required Activity currentActivity}) {
return PageHome();
},
);
static const indexDiscoveries = 1;
static final ActivityPageItem pageDiscoveries = ActivityPageItem(
code: 'page_discoveries',
icon: Icon(Ionicons.star_outline),
builder: ({required Activity currentActivity}) {
return PageDiscoveries();
},
);
static const indexStatistics = 2;
static final ActivityPageItem pageStatistics = ActivityPageItem(
code: 'page_statistics',
icon: Icon(Ionicons.bar_chart_outline),
builder: ({required Activity currentActivity}) {
return PageStatistics();
},
);
static Map<int, ActivityPageItem> items = {
indexHome: pageHome,
indexDiscoveries: pageDiscoveries,
indexStatistics: pageStatistics,
};
static int defaultPageIndex = indexHome;
static bool isIndexAllowed(int pageIndex) {
return items.keys.contains(pageIndex);
}
static Widget getWidget(int pageIndex) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
if (items.keys.contains(pageIndex)) {
return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups');
} else {
return getWidget(defaultPageIndex);
}
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/ui/screens/about.dart';
import 'package:scrobbles/common/ui/screens/activity.dart';
import 'package:scrobbles/common/ui/screens/settings.dart';
class ScreenItem {
final String code;
final Icon icon;
final Widget screen;
const ScreenItem({
required this.code,
required this.icon,
required this.screen,
});
}
class Screen {
static const indexActivity = 0;
static const screenActivity = ScreenItem(
code: 'screen_activity',
icon: Icon(UniconsLine.home),
screen: ScreenActivity(),
);
static const indexSettings = 1;
static const screenSettings = ScreenItem(
code: 'screen_settings',
icon: Icon(UniconsLine.setting),
screen: ScreenSettings(),
);
static const indexAbout = 2;
static const screenAbout = ScreenItem(
code: 'screen_about',
icon: Icon(UniconsLine.info_circle),
screen: ScreenAbout(),
);
static Map<int, ScreenItem> items = {
indexActivity: screenActivity,
indexSettings: screenSettings,
indexAbout: screenAbout,
};
static bool isIndexAllowed(int screenIndex) {
return items.keys.contains(screenIndex);
}
static Widget getWidget(int screenIndex) {
return items[screenIndex]?.screen ?? screenActivity.screen;
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/config/activity_page.dart';
class NavCubitPage extends HydratedCubit<int> {
NavCubitPage() : super(0);
void updateIndex(int index) {
if (ActivityPage.isIndexAllowed(index)) {
emit(index);
} else {
emit(ActivityPage.indexHome);
}
}
void goToPageHome() {
updateIndex(ActivityPage.indexHome);
}
@override
int fromJson(Map<String, dynamic> json) {
return ActivityPage.indexHome;
}
@override
Map<String, dynamic>? toJson(int state) {
return <String, int>{'index': state};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/config/screen.dart';
class NavCubitScreen extends HydratedCubit<int> {
NavCubitScreen() : super(0);
void updateIndex(int index) {
if (Screen.isIndexAllowed(index)) {
emit(index);
} else {
goToScreenActivity();
}
}
void goToScreenActivity() {
emit(Screen.indexActivity);
}
void goToScreenSettings() {
emit(Screen.indexSettings);
}
void goToScreenAbout() {
emit(Screen.indexAbout);
}
@override
int fromJson(Map<String, dynamic> json) {
return Screen.indexActivity;
}
@override
Map<String, dynamic>? toJson(int state) {
return <String, int>{'index': state};
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:flutter_swipe/flutter_swipe.dart';
import 'package:scrobbles/common/config/activity_page.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart';
class BottomNavBar extends StatelessWidget {
const BottomNavBar({
super.key,
this.swipeController,
});
final SwiperController? swipeController;
@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<NavCubitPage, int>(
builder: (BuildContext context, int pageIndex) {
final List<BottomNavigationBarItem> items = [];
ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) {
items.add(BottomNavigationBarItem(
icon: item.icon,
label: tr(item.code),
));
});
return BottomNavigationBar(
currentIndex: pageIndex,
onTap: (int index) {
BlocProvider.of<NavCubitPage>(context).updateIndex(index);
swipeController?.move(index);
},
type: BottomNavigationBarType.fixed,
elevation: 0,
backgroundColor: Colors.transparent,
selectedItemColor: Theme.of(context).colorScheme.primary,
unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color,
items: items,
);
},
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/config/screen.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart';
import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart';
import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_global_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart';
import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart';
class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
const GlobalAppBar({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubitScreen, int>(
builder: (BuildContext context, int screenIndex) {
final List<Widget> menuActions = [];
if (screenIndex == Screen.indexActivity) {
// go to Settings page
menuActions.add(IconButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenSettings();
},
icon: Screen.screenSettings.icon,
));
// go to About page
menuActions.add(IconButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenAbout();
},
icon: Screen.screenAbout.icon,
));
// refresh data
menuActions.add(IconButton(
onPressed: () {
BlocProvider.of<DataCountsByDayCubit>(context).refresh(context);
BlocProvider.of<DataCountsByHourCubit>(context).refresh(context);
BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context);
BlocProvider.of<DataHeatmapCubit>(context).refresh(context);
BlocProvider.of<DataNewArtistsCubit>(context).refresh(context);
BlocProvider.of<DataNewTracksCubit>(context).refresh(context);
BlocProvider.of<DataStatisticsGlobalCubit>(context).refresh(context);
BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context);
BlocProvider.of<DataTimelineCubit>(context).refresh(context);
BlocProvider.of<DataTopArtistsCubit>(context).refresh(context);
},
icon: const Icon(UniconsSolid.refresh),
));
} else {
// back to Home page
menuActions.add(IconButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
icon: Screen.screenActivity.icon,
));
}
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_custom_toolbox/flutter_toolbox.dart';
class ScreenAbout extends StatelessWidget {
const ScreenAbout({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
const SizedBox(height: 8),
const AppTitle(text: 'about_title'),
const Text('about_content').tr(),
FutureBuilder<PackageInfo>(
future: PackageInfo.fromPlatform(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.done:
return const Text('about_version').tr(
namedArgs: {
'version': snapshot.data!.version,
},
);
default:
return const SizedBox();
}
},
),
],
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:flutter_swipe/flutter_swipe.dart';
import 'package:scrobbles/common/config/activity_page.dart';
import 'package:scrobbles/common/config/screen.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart';
import 'package:scrobbles/common/ui/nav/bottom_nav_bar.dart';
class ScreenActivity extends StatelessWidget {
const ScreenActivity({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubitPage, int>(
builder: (BuildContext context, int pageIndex) {
return Swiper(
itemCount: Screen.items.length,
itemBuilder: (BuildContext context, int pageIndex) {
return ActivityPage.getWidget(pageIndex);
},
pagination: SwiperPagination(
margin: const EdgeInsets.all(0),
builder: SwiperCustomPagination(
builder: (BuildContext context, SwiperPluginConfig config) {
return BottomNavBar(swipeController: config.controller);
},
),
),
onIndexChanged: (newPageIndex) {
BlocProvider.of<NavCubitPage>(context).updateIndex(newPageIndex);
},
outer: true,
loop: false,
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/ui/settings/settings_form.dart';
class ScreenSettings extends StatelessWidget {
const ScreenSettings({super.key});
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.symmetric(horizontal: 4),
physics: const BouncingScrollPhysics(),
children: <Widget>[
const SizedBox(height: 8),
AppTitle(text: tr('settings_title')),
const SettingsForm(),
],
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/ui/settings/settings_form.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; import 'package:scrobbles/ui/pages/discoveries.dart';
import 'package:scrobbles/ui/pages/home.dart';
import 'package:scrobbles/ui/pages/statistics.dart';
import 'package:scrobbles/cubit/activity/activity_cubit.dart'; import 'package:scrobbles/cubit/activity/activity_cubit.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart';
import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart';
import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_global_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart';
import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart';
class ApplicationConfig { class ApplicationConfig {
static const String parameterCodeDistributionDaysCount = 'distribution-days-count'; static const String parameterCodeDistributionDaysCount = 'distribution-days-count';
...@@ -49,6 +62,11 @@ class ApplicationConfig { ...@@ -49,6 +62,11 @@ class ApplicationConfig {
), ),
]; ];
// activity pages
static const int activityPageIndexHome = 0;
static const int activityPageIndexDiscoveries = 1;
static const int activityPageIndexStatistics = 2;
static final ApplicationConfigDefinition config = ApplicationConfigDefinition( static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Scrobbles', appTitle: 'Scrobbles',
activitySettings: [ activitySettings: [
...@@ -94,11 +112,102 @@ class ApplicationConfig { ...@@ -94,11 +112,102 @@ class ApplicationConfig {
values: allowedDaysCountValues, values: allowedDaysCountValues,
), ),
], ],
autoStartActivity: true,
startNewActivity: (BuildContext context) { startNewActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).startNewActivity(context); BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
BlocProvider.of<NavCubitPage>(context).goToPageHome(); BlocProvider.of<NavCubitPage>(context).updateIndex(activityPageIndexHome);
}, },
quitCurrentActivity: (BuildContext context) {},
deleteCurrentActivity: (BuildContext context) {}, deleteCurrentActivity: (BuildContext context) {},
resumeActivity: (BuildContext context) {}, resumeActivity: (BuildContext context) {},
navigation: ApplicationNavigation(
screenActivity: ScreenItem(
code: 'screen_activity',
icon: Icon(UniconsLine.home),
screen: ({required ApplicationConfigDefinition appConfig}) =>
ScreenActivity(appConfig: appConfig),
),
screenSettings: ScreenItem(
code: 'screen_settings',
icon: Icon(UniconsLine.setting),
screen: ({required ApplicationConfigDefinition appConfig}) => SettingsForm(),
),
screenAbout: ScreenItem(
code: 'screen_about',
icon: Icon(UniconsLine.info_circle),
screen: ({required ApplicationConfigDefinition appConfig}) => ScreenAbout(),
),
appBarConfiguration: AppBarConfiguration(
hideQuitActivityButton: true,
topBarButtonsBuilder: (context) => [
// Go to Settings page
AppBarButton(
onPressed: (BuildContext context) =>
BlocProvider.of<NavCubitScreen>(context).goToScreenSettings(),
icon: ApplicationConfig.config.navigation.screenSettings.icon,
),
// Back to Home page
AppBarButton(
onPressed: (BuildContext context) =>
BlocProvider.of<NavCubitScreen>(context).goToScreenActivity(),
icon: ApplicationConfig.config.navigation.screenActivity.icon,
),
// Refresh data
AppBarButton(
onPressed: (BuildContext context) {
BlocProvider.of<DataCountsByDayCubit>(context).refresh(context);
BlocProvider.of<DataCountsByHourCubit>(context).refresh(context);
BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context);
BlocProvider.of<DataHeatmapCubit>(context).refresh(context);
BlocProvider.of<DataNewArtistsCubit>(context).refresh(context);
BlocProvider.of<DataNewTracksCubit>(context).refresh(context);
BlocProvider.of<DataStatisticsGlobalCubit>(context).refresh(context);
BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context);
BlocProvider.of<DataTimelineCubit>(context).refresh(context);
BlocProvider.of<DataTopArtistsCubit>(context).refresh(context);
},
icon: const Icon(UniconsSolid.refresh),
),
],
),
displayBottomNavBar: true,
activityPages: {
activityPageIndexHome: ActivityPageItem(
code: 'page_home',
icon: Icon(UniconsLine.home),
builder: ({required ApplicationConfigDefinition appConfig}) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
return PageHome();
},
);
},
),
activityPageIndexDiscoveries: ActivityPageItem(
code: 'page_discoveries',
icon: Icon(UniconsLine.star),
builder: ({required ApplicationConfigDefinition appConfig}) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
return PageDiscoveries();
},
);
},
),
activityPageIndexStatistics: ActivityPageItem(
code: 'page_statistics',
icon: Icon(UniconsLine.star),
builder: ({required ApplicationConfigDefinition appConfig}) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
return PageStatistics();
},
);
},
),
},
),
); );
} }
...@@ -4,9 +4,6 @@ import 'package:flutter/material.dart'; ...@@ -4,9 +4,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart';
import 'package:scrobbles/config/application_config.dart'; import 'package:scrobbles/config/application_config.dart';
import 'package:scrobbles/cubit/activity/activity_cubit.dart'; import 'package:scrobbles/cubit/activity/activity_cubit.dart';
...@@ -55,7 +52,7 @@ class MyApp extends StatelessWidget { ...@@ -55,7 +52,7 @@ class MyApp extends StatelessWidget {
providers: [ providers: [
// default providers // default providers
BlocProvider<NavCubitPage>( BlocProvider<NavCubitPage>(
create: (context) => NavCubitPage(), create: (context) => NavCubitPage(appConfig: ApplicationConfig.config),
), ),
BlocProvider<NavCubitScreen>( BlocProvider<NavCubitScreen>(
create: (context) => NavCubitScreen(), create: (context) => NavCubitScreen(),
......
File moved
File moved
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart';
import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart';
import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart';
import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart';
import 'package:scrobbles/config/application_config.dart'; import 'package:scrobbles/config/application_config.dart';
...@@ -161,6 +170,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -161,6 +170,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -188,6 +198,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -188,6 +198,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataTimelineCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -215,6 +226,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -215,6 +226,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataTopArtistsCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -242,6 +254,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -242,6 +254,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -270,6 +283,9 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -270,6 +283,9 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataCountsByDayCubit>(context).refresh(context);
BlocProvider.of<DataCountsByHourCubit>(context).refresh(context);
BlocProvider.of<DataHeatmapCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -300,6 +316,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -300,6 +316,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataNewArtistsCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
...@@ -327,6 +344,7 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -327,6 +344,7 @@ class _SettingsFormState extends State<SettingsForm> {
} }
}); });
saveSettings(); saveSettings();
BlocProvider.of<DataNewTracksCubit>(context).refresh(context);
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/common/config/activity_page.dart'; import 'package:scrobbles/config/application_config.dart';
import 'package:scrobbles/common/config/screen.dart'; import 'package:scrobbles/cubit/activity/activity_cubit.dart';
import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart'; import 'package:scrobbles/models/activity/activity.dart';
import 'package:scrobbles/common/ui/nav/global_app_bar.dart';
import 'package:scrobbles/common/ui/nav/bottom_nav_bar.dart';
class SkeletonScreen extends StatelessWidget { class SkeletonScreen extends StatelessWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
...@@ -14,22 +12,47 @@ class SkeletonScreen extends StatelessWidget { ...@@ -14,22 +12,47 @@ class SkeletonScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<NavCubitScreen, int>( return BlocBuilder<NavCubitScreen, int>(
builder: (BuildContext context, int screenIndex) { builder: (BuildContext context, int screenIndex) {
return Scaffold( return BlocBuilder<ActivityCubit, ActivityState>(
appBar: const GlobalAppBar(), builder: (BuildContext context, ActivityState activityState) {
extendBodyBehindAppBar: false, return BlocBuilder<NavCubitPage, int>(
body: Material( builder: (BuildContext context, int pageIndex) {
color: Theme.of(context).colorScheme.surface, final Activity currentActivity = activityState.currentActivity;
child: Padding(
padding: const EdgeInsets.only( // autostart activity
top: 8, if (ApplicationConfig.config.autoStartActivity &&
left: 2, (!currentActivity.isRunning)) {
right: 2, ApplicationConfig.config.startNewActivity(context);
), }
child: Screen.getWidget(screenIndex),
), return Scaffold(
), appBar: GlobalAppBar(
backgroundColor: Theme.of(context).colorScheme.surface, appConfig: ApplicationConfig.config,
bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null, pageIndex: pageIndex,
isActivityRunning: currentActivity.isRunning,
),
extendBodyBehindAppBar: false,
body: Material(
color: Theme.of(context).colorScheme.surface,
child: Padding(
padding: const EdgeInsets.only(
top: 8,
left: 2,
right: 2,
),
child: ApplicationConfig.config.navigation.getScreenWidget(
appConfig: ApplicationConfig.config,
screenIndex: screenIndex,
),
),
),
backgroundColor: Theme.of(context).colorScheme.surface,
bottomNavigationBar: ApplicationConfig.config.navigation.displayBottomNavBar
? BottomNavBar(appConfig: ApplicationConfig.config)
: null,
);
},
);
},
); );
}, },
); );
......
...@@ -130,11 +130,11 @@ packages: ...@@ -130,11 +130,11 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "0.5.0" ref: "0.6.0"
resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7 resolved-ref: dfe0f6b7b49f9aa32f085e4a5d3ea320b3611eed
url: "https://git.harrault.fr/android/flutter-toolbox.git" url: "https://git.harrault.fr/android/flutter-toolbox.git"
source: git source: git
version: "0.5.0" version: "0.6.0"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
...@@ -148,14 +148,6 @@ packages: ...@@ -148,14 +148,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_swipe:
dependency: "direct main"
description:
name: flutter_swipe
sha256: dc6541bac3a0545ce15a3fa15913f6250532062960bf6b0ad4562d02f14a8545
url: "https://pub.dev"
source: hosted
version: "1.0.1"
flutter_web_plugins: flutter_web_plugins:
dependency: transitive dependency: transitive
description: flutter description: flutter
......
...@@ -3,7 +3,7 @@ description: Display scrobbles data and charts ...@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
publish_to: "none" publish_to: "none"
version: 0.5.0+69 version: 0.6.0+70
environment: environment:
sdk: "^3.0.0" sdk: "^3.0.0"
...@@ -16,11 +16,10 @@ dependencies: ...@@ -16,11 +16,10 @@ dependencies:
flutter_custom_toolbox: flutter_custom_toolbox:
git: git:
url: https://git.harrault.fr/android/flutter-toolbox.git url: https://git.harrault.fr/android/flutter-toolbox.git
ref: 0.5.0 ref: 0.6.0
# specific # specific
fl_chart: ^0.69.0 fl_chart: ^0.69.0
flutter_swipe: ^1.0.1
http: ^1.1.0 http: ^1.1.0
ionicons: ^0.2.2 ionicons: ^0.2.2
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment