improve auto scroll behaviour

This commit is contained in:
Fabian Freund
2025-08-01 22:43:57 +02:00
parent 3b534a9ddf
commit d04bf7f885
@@ -42,7 +42,6 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/ta
import 'package:weblibre/presentation/widgets/share_tile.dart'; import 'package:weblibre/presentation/widgets/share_tile.dart';
import 'package:weblibre/presentation/widgets/website_feed_tile.dart'; import 'package:weblibre/presentation/widgets/website_feed_tile.dart';
import 'package:weblibre/presentation/widgets/website_title_tile.dart'; import 'package:weblibre/presentation/widgets/website_title_tile.dart';
import 'package:weblibre/utils/debouncer.dart';
import 'package:weblibre/utils/ui_helper.dart' as ui_helper; import 'package:weblibre/utils/ui_helper.dart' as ui_helper;
class ClampingScrollPhysicsWithoutImplicit extends ClampingScrollPhysics { class ClampingScrollPhysicsWithoutImplicit extends ClampingScrollPhysics {
@@ -82,54 +81,35 @@ class ViewTabSheetWidget extends HookConsumerWidget {
).select((value) => value.valueOrNull ?? const []), ).select((value) => value.valueOrNull ?? const []),
); );
final initialScrollDebouncer = useMemoized( final scrolledTo = useRef(0.0);
() => Debouncer(const Duration(milliseconds: 150)),
);
useEffect(() { useEffect(() {
if (!initialScrollDebouncer.hasRan) { WidgetsBinding.instance.addPostFrameCallback((_) async {
initialScrollDebouncer.eventOccured(() {
WidgetsBinding.instance.addPostFrameCallback((_) {
final header = headerKey.currentContext?.findRenderObject(); final header = headerKey.currentContext?.findRenderObject();
final text = textFieldKey.currentContext?.findRenderObject(); final text = textFieldKey.currentContext?.findRenderObject();
if (header case final RenderBox headerBox) { if (header case final RenderBox headerBox) {
if (text case final RenderBox textBox) { if (text case final RenderBox textBox) {
final totalHeight = final totalHeight =
headerBox.size.height + headerBox.size.height + textBox.size.height + kToolbarHeight;
textBox.size.height +
kToolbarHeight;
final relative = final relative = totalHeight / MediaQuery.of(context).size.height;
totalHeight / MediaQuery.of(context).size.height;
draggableScrollableController.jumpTo(relative); if (draggableScrollableController.size < relative &&
relative > scrolledTo.value) {
await draggableScrollableController.animateTo(
relative,
duration: const Duration(milliseconds: 150),
curve: Curves.bounceIn,
);
scrolledTo.value = relative;
}
} }
} }
}); });
});
}
return null; return null;
}); });
// final changes = useRef(0.0);
// useEffect(() {
// final emitter = KeyboardHeightEmitter();
// emitter.onKeyboardHeightChanged((height) {
// final diff =
// height / MediaQuery.of(context).size.height - changes.value;
// draggableScrollableController.jumpTo(
// draggableScrollableController.size + diff,
// );
// changes.value += diff;
// });
// return () => emitter.dispose();
// }, []);
final changes = useRef(0.0); final changes = useRef(0.0);
useEffect(() { useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
@@ -148,10 +128,10 @@ class ViewTabSheetWidget extends HookConsumerWidget {
return null; return null;
}, [MediaQuery.of(context).viewInsets.bottom]); }, [MediaQuery.of(context).viewInsets.bottom]);
return Column( return NestedScrollView(
mainAxisSize: MainAxisSize.min, headerSliverBuilder: (context, innerBoxIsScrolled) => [
children: [ SliverToBoxAdapter(
DraggableScrollableHeader( child: DraggableScrollableHeader(
key: headerKey, key: headerKey,
controller: draggableScrollableController, controller: draggableScrollableController,
child: Column( child: Column(
@@ -171,9 +151,10 @@ class ViewTabSheetWidget extends HookConsumerWidget {
], ],
), ),
), ),
Flexible( ),
child: FadingScroll( ],
fadingSize: 25, body: FadingScroll(
fadingSize: 15,
controller: sheetScrollController, controller: sheetScrollController,
builder: (context, controller) { builder: (context, controller) {
return ListView( return ListView(
@@ -198,9 +179,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
ClipboardData(text: initialTabState.url.toString()), ClipboardData(text: initialTabState.url.toString()),
); );
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}, },
), ),
ListTile( ListTile(
@@ -232,9 +211,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
}, },
); );
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
} }
}, },
), ),
@@ -257,9 +234,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
}, },
); );
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
} }
}, },
), ),
@@ -278,16 +253,11 @@ class ViewTabSheetWidget extends HookConsumerWidget {
if (containerData != null) { if (containerData != null) {
await ref await ref
.read(tabDataRepositoryProvider.notifier) .read(tabDataRepositoryProvider.notifier)
.assignContainer( .assignContainer(initialTabState.id, containerData);
initialTabState.id,
containerData,
);
} }
} }
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}, },
), ),
Consumer( Consumer(
@@ -299,9 +269,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
.read(tabDataRepositoryProvider.notifier) .read(tabDataRepositoryProvider.notifier)
.unassignContainer(initialTabState.id); .unassignContainer(initialTabState.id);
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}, },
), ),
builder: (context, ref, child) { builder: (context, ref, child) {
@@ -323,9 +291,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
ShareParams(uri: initialTabState.url), ShareParams(uri: initialTabState.url),
); );
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}, },
onTapQr: () async { onTapQr: () async {
await showQrCode(context, initialTabState.url.toString()); await showQrCode(context, initialTabState.url.toString());
@@ -361,9 +327,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
}); });
} }
ref ref.read(bottomSheetControllerProvider.notifier).dismiss();
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}, },
), ),
WebsiteFeedTile(initialTabState), WebsiteFeedTile(initialTabState),
@@ -371,8 +335,6 @@ class ViewTabSheetWidget extends HookConsumerWidget {
); );
}, },
), ),
),
],
); );
} }
} }