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

Improve swipe navigation

parent 8c5edf8e
No related branches found
No related tags found
1 merge request!44Resolve "Improve swipe navigation"
Pipeline #4627 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=1.0.34 app.versionName=1.0.35
app.versionCode=35 app.versionCode=36
...@@ -3,15 +3,21 @@ import 'package:hydrated_bloc/hydrated_bloc.dart'; ...@@ -3,15 +3,21 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
class BottomNavCubit extends HydratedCubit<int> { class BottomNavCubit extends HydratedCubit<int> {
BottomNavCubit() : super(0); BottomNavCubit() : super(0);
void updateIndex(int index) => emit(index); int pagesCount = 4;
void movePrevious() => emit((state > 0) ? state - 1 : state); void updateIndex(int index) {
void moveNext() => emit((state < 3) ? state + 1 : state); if (isIndexAllowed(index)) {
emit(index);
} else {
goToHomePage();
}
}
bool isIndexAllowed(int index) {
return (index >= 0) && (index < pagesCount);
}
void getDemoPage() => emit(0); void goToHomePage() => emit(0);
void getGraphPage() => emit(1);
void getSettingsPage() => emit(2);
void getAboutPage() => emit(3);
@override @override
int? fromJson(Map<String, dynamic> json) { int? fromJson(Map<String, dynamic> json) {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_swipe/flutter_swipe.dart';
import 'package:random/cubit/bottom_nav_cubit.dart'; import 'package:random/cubit/bottom_nav_cubit.dart';
import 'package:random/cubit/settings_cubit.dart'; import 'package:random/cubit/settings_cubit.dart';
...@@ -9,7 +10,6 @@ import 'package:random/ui/screens/graph_page.dart'; ...@@ -9,7 +10,6 @@ import 'package:random/ui/screens/graph_page.dart';
import 'package:random/ui/screens/settings_page.dart'; import 'package:random/ui/screens/settings_page.dart';
import 'package:random/ui/widgets/app_bar.dart'; import 'package:random/ui/widgets/app_bar.dart';
import 'package:random/ui/widgets/bottom_nav_bar.dart'; import 'package:random/ui/widgets/bottom_nav_bar.dart';
import 'package:random/ui/widgets/debug_bloc.dart';
class SkeletonScreen extends StatefulWidget { class SkeletonScreen extends StatefulWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
...@@ -30,44 +30,37 @@ class _SkeletonScreenState extends State<SkeletonScreen> { ...@@ -30,44 +30,37 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
AboutPage(), AboutPage(),
]; ];
String debug = '';
return BlocProvider<SettingsCubit>( return BlocProvider<SettingsCubit>(
create: (BuildContext context) => SettingsCubit(), create: (BuildContext context) => SettingsCubit(),
child: BlocProvider<BottomNavCubit>( child: BlocProvider<BottomNavCubit>(
create: (BuildContext context) => BottomNavCubit(), create: (BuildContext context) => BottomNavCubit(),
child: BlocBuilder<BottomNavCubit, int>( child: BlocBuilder<BottomNavCubit, int>(
builder: (BuildContext context, int state) { builder: (BuildContext context, int state) {
return GestureDetector( return Scaffold(
onHorizontalDragEnd: (dragDetail) { extendBodyBehindAppBar: false,
debug = dragDetail.velocity.pixelsPerSecond.toString(); appBar: StandardAppBar(),
print('debug: ' + debug); body: Swiper(
itemCount: BlocProvider.of<BottomNavCubit>(context).pagesCount,
if (dragDetail.velocity.pixelsPerSecond.dx < 1) { itemBuilder: (BuildContext context, int index) {
context.read<BottomNavCubit>().moveNext(); return AnimatedSwitcher(
} else { duration: const Duration(milliseconds: 300),
context.read<BottomNavCubit>().movePrevious(); child: pageNavigation.elementAt(index),
} );
}, },
child: Scaffold( pagination: SwiperPagination(
extendBodyBehindAppBar: false, builder: SwiperCustomPagination(
appBar: StandardAppBar(), builder: (BuildContext context, SwiperPluginConfig config) {
body: BlocBuilder<BottomNavCubit, int>( return BottomNavBar(swipeController: config.controller);
builder: (BuildContext context, int state) { },
return AnimatedSwitcher( ),
duration: const Duration(milliseconds: 300),
child: Stack(
children: [
pageNavigation.elementAt(state),
debug != '' ? DebugBloc(content: debug) : SizedBox(),
],
),
);
},
), ),
bottomNavigationBar: const BottomNavBar(), onIndexChanged: (newPageIndex) {
backgroundColor: Theme.of(context).colorScheme.background, BlocProvider.of<BottomNavCubit>(context).updateIndex(newPageIndex);
},
outer: true,
loop: false,
), ),
backgroundColor: Theme.of(context).colorScheme.background,
); );
}, },
), ),
......
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_swipe/flutter_swipe.dart';
import 'package:unicons/unicons.dart'; import 'package:unicons/unicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart'; import 'package:random/cubit/bottom_nav_cubit.dart';
class BottomNavBar extends StatelessWidget { class BottomNavBar extends StatelessWidget {
const BottomNavBar({super.key}); const BottomNavBar({super.key, required this.swipeController});
final SwiperController swipeController;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Card( return Card(
margin: const EdgeInsets.only(top: 1, right: 4, left: 4), margin: const EdgeInsets.only(
top: 1,
right: 0,
left: 0,
),
elevation: 4, elevation: 4,
shadowColor: Theme.of(context).colorScheme.shadow, shadowColor: Theme.of(context).colorScheme.shadow,
color: Theme.of(context).colorScheme.surfaceVariant, color: Theme.of(context).colorScheme.surfaceVariant,
...@@ -25,7 +32,10 @@ class BottomNavBar extends StatelessWidget { ...@@ -25,7 +32,10 @@ class BottomNavBar extends StatelessWidget {
builder: (BuildContext context, int state) { builder: (BuildContext context, int state) {
return BottomNavigationBar( return BottomNavigationBar(
currentIndex: state, currentIndex: state,
onTap: (int index) => context.read<BottomNavCubit>().updateIndex(index), onTap: (int index) {
context.read<BottomNavCubit>().updateIndex(index);
swipeController.move(index);
},
type: BottomNavigationBarType.fixed, type: BottomNavigationBarType.fixed,
elevation: 0, elevation: 0,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
......
...@@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; ...@@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:unicons/unicons.dart'; import 'package:unicons/unicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart';
import 'package:random/cubit/settings_cubit.dart'; import 'package:random/cubit/settings_cubit.dart';
import 'package:random/config/theme.dart'; import 'package:random/config/theme.dart';
import 'package:random/models/interface_type.dart'; import 'package:random/models/interface_type.dart';
...@@ -48,8 +47,6 @@ class _SettingsFormState extends State<SettingsForm> { ...@@ -48,8 +47,6 @@ class _SettingsFormState extends State<SettingsForm> {
securityToken: securityTokenController.text, securityToken: securityTokenController.text,
interfaceType: _selectedInterfaceType[0] ? InterfaceType.basic : InterfaceType.expert, interfaceType: _selectedInterfaceType[0] ? InterfaceType.basic : InterfaceType.expert,
); );
BlocProvider.of<BottomNavCubit>(context).getDemoPage();
} }
return Column( return Column(
......
...@@ -115,6 +115,14 @@ packages: ...@@ -115,6 +115,14 @@ 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: A random application, for testing purpose only. ...@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
publish_to: 'none' publish_to: 'none'
version: 1.0.34+35 version: 1.0.35+36
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
...@@ -19,6 +19,7 @@ dependencies: ...@@ -19,6 +19,7 @@ dependencies:
hydrated_bloc: ^9.0.0 hydrated_bloc: ^9.0.0
unicons: ^2.1.1 unicons: ^2.1.1
package_info_plus: ^5.0.1 package_info_plus: ^5.0.1
flutter_swipe: ^1.0.1
flutter: flutter:
uses-material-design: false uses-material-design: false
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment