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

Merge branch '37-improve-swipe-left-right' into 'master'

Resolve "Improve swipe left/right"

Closes #37

See merge request !34
parents 5922850c 9c5579cf
No related branches found
No related tags found
1 merge request!34Resolve "Improve swipe left/right"
Pipeline #4637 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.30 app.versionName=0.0.31
app.versionCode=30 app.versionCode=31
Improve swipe navigation.
Amélioration de la navigation par swipe.
...@@ -3,18 +3,25 @@ import 'package:hydrated_bloc/hydrated_bloc.dart'; ...@@ -3,18 +3,25 @@ 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 = 3;
void movePrevious() => emit((state > 0) ? state - 1 : state); void updateIndex(int index) {
void moveNext() => emit((state < 2) ? state + 1 : state); if (isIndexAllowed(index)) {
emit(index);
} else {
goToHomePage();
}
}
bool isIndexAllowed(int index) {
return (index >= 0) && (index < pagesCount);
}
void getHomePage() => emit(0); void goToHomePage() => emit(0);
void getDiscoveriesPage() => emit(1);
void getStatisticsPage() => emit(2);
@override @override
int? fromJson(Map<String, dynamic> json) { int? fromJson(Map<String, dynamic> json) {
return json['pageIndex'] as int?; return 0;
} }
@override @override
......
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:scrobbles/cubit/bottom_nav_cubit.dart'; import 'package:scrobbles/cubit/bottom_nav_cubit.dart';
import 'package:scrobbles/ui/screens/discoveries.dart'; import 'package:scrobbles/ui/screens/discoveries.dart';
...@@ -28,28 +29,31 @@ class _SkeletonScreenState extends State<SkeletonScreen> { ...@@ -28,28 +29,31 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
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) {
if (dragDetail.velocity.pixelsPerSecond.dx < 1) {
context.read<BottomNavCubit>().moveNext();
} else {
context.read<BottomNavCubit>().movePrevious();
}
},
child: Scaffold(
appBar: StandardAppBar(notifyParent: refresh), appBar: StandardAppBar(notifyParent: refresh),
extendBodyBehindAppBar: false, extendBodyBehindAppBar: false,
body: BlocBuilder<BottomNavCubit, int>( body: Swiper(
builder: (BuildContext context, int state) { itemCount: BlocProvider.of<BottomNavCubit>(context).pagesCount,
itemBuilder: (BuildContext context, int index) {
return AnimatedSwitcher( return AnimatedSwitcher(
duration: const Duration(milliseconds: 300), duration: const Duration(milliseconds: 300),
child: pageNavigation.elementAt(state), 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: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:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import 'package:scrobbles/cubit/bottom_nav_cubit.dart'; import 'package:scrobbles/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,
......
...@@ -123,6 +123,14 @@ packages: ...@@ -123,6 +123,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: Display scrobbles data and charts ...@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
publish_to: 'none' publish_to: 'none'
version: 0.0.30+30 version: 0.0.31+31
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
...@@ -21,6 +21,7 @@ dependencies: ...@@ -21,6 +21,7 @@ dependencies:
hydrated_bloc: ^9.0.0 hydrated_bloc: ^9.0.0
ionicons: ^0.2.2 ionicons: ^0.2.2
unicons: ^2.1.1 unicons: ^2.1.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