1
0
forked from firka/firka

firka: give chart higher gesture priority over page swipe

This commit is contained in:
2026-02-28 11:18:24 +01:00
parent e071fc15d1
commit 826312b503
4 changed files with 79 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ import 'package:firka/ui/phone/screens/login/login_screen.dart';
import 'package:firka/ui/phone/screens/message/message_screen.dart';
import 'package:firka/ui/phone/screens/home/home_screen.dart';
import 'package:firka/ui/phone/screens/settings/settings_screen.dart';
import 'package:firka/routing/chart_interaction_scope.dart';
import 'package:firka/routing/shell_with_nav_bar.dart';
import 'package:firka/routing/swipable_navigator_container.dart';
import 'package:go_router/go_router.dart';
@@ -97,9 +98,11 @@ GoRouter createAppRouter() {
),
),
navigatorContainerBuilder: (context, navigationShell, children) {
return SwipableNavigatorContainer(
navigationShell: navigationShell,
children: children,
return ChartInteractionScope(
child: SwipableNavigatorContainer(
navigationShell: navigationShell,
children: children,
),
);
},
branches: [

View File

@@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
class ChartInteractionScope extends StatefulWidget {
const ChartInteractionScope({super.key, required this.child});
final Widget child;
static ValueNotifier<bool> of(BuildContext context) {
final data = context
.dependOnInheritedWidgetOfExactType<_ChartInteractionScopeData>();
assert(data != null, 'ChartInteractionScope not found in context');
return data!.isChartInteracting;
}
@override
State<ChartInteractionScope> createState() => _ChartInteractionScopeState();
}
class _ChartInteractionScopeState extends State<ChartInteractionScope> {
final ValueNotifier<bool> _isChartInteracting = ValueNotifier(false);
@override
void dispose() {
_isChartInteracting.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return _ChartInteractionScopeData(
isChartInteracting: _isChartInteracting,
child: widget.child,
);
}
}
class _ChartInteractionScopeData extends InheritedWidget {
const _ChartInteractionScopeData({
required this.isChartInteracting,
required super.child,
});
final ValueNotifier<bool> isChartInteracting;
@override
bool updateShouldNotify(_ChartInteractionScopeData oldWidget) =>
isChartInteracting != oldWidget.isChartInteracting;
}

View File

@@ -1,3 +1,4 @@
import 'package:firka/routing/chart_interaction_scope.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart';
@@ -82,11 +83,19 @@ class _SwipableNavigatorContainerState
@override
Widget build(BuildContext context) {
return PageView(
controller: _pageController,
physics: const ClampingScrollPhysics(),
onPageChanged: _onPageChanged,
children: widget.children,
final isChartInteracting = ChartInteractionScope.of(context);
return ValueListenableBuilder<bool>(
valueListenable: isChartInteracting,
builder: (context, interacting, _) {
return PageView(
controller: _pageController,
physics: interacting
? const NeverScrollableScrollPhysics()
: const ClampingScrollPhysics(),
onPageChanged: _onPageChanged,
children: widget.children,
);
},
);
}
}

View File

@@ -1,6 +1,7 @@
import 'package:firka/api/client/kreta_client.dart';
import 'package:firka/api/model/generic.dart';
import 'package:firka/core/average_helper.dart';
import 'package:firka/routing/chart_interaction_scope.dart';
import 'package:firka/ui/components/firka_card.dart';
import 'package:firka/ui/components/grade_helpers.dart';
import 'package:firka/ui/phone/widgets/grade_chart.dart';
@@ -231,7 +232,16 @@ class _HomeGradesScreen extends FirkaState<HomeGradesScreen> {
],
),
// SizedBox(height: 16), // TODO: Add graphs here
GradeChart(grades: grades?.response ?? []),
Listener(
behavior: HitTestBehavior.opaque,
onPointerDown: (_) =>
ChartInteractionScope.of(context).value = true,
onPointerUp: (_) =>
ChartInteractionScope.of(context).value = false,
onPointerCancel: (_) =>
ChartInteractionScope.of(context).value = false,
child: GradeChart(grades: grades?.response ?? []),
),
// ...gradeCards,
Expanded(
child: ListView(