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

Merge branch '45-improve-swipe-navigation' into 'master'

Resolve "Improve swipe navigation"

Closes #45

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