mirror of
https://github.com/lifegpc/eh_downloader_flutter.git
synced 2026-06-23 20:26:50 +08:00
Tags panel overscroll will scroll parent
This commit is contained in:
@@ -16,6 +16,7 @@ class GalleryInfo extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _GalleryInfo extends State<GalleryInfo> {
|
||||
final ScrollController controller = ScrollController();
|
||||
void showNsfwChanged(dynamic _) {
|
||||
setState(() {});
|
||||
}
|
||||
@@ -34,6 +35,7 @@ class _GalleryInfo extends State<GalleryInfo> {
|
||||
? widget.files!.files[firstPage.token]!.first.id
|
||||
: null;
|
||||
return CustomScrollView(
|
||||
controller: controller,
|
||||
slivers: [
|
||||
useMobile
|
||||
? SliverList(
|
||||
@@ -44,7 +46,8 @@ class _GalleryInfo extends State<GalleryInfo> {
|
||||
)
|
||||
: SliverList(
|
||||
delegate: SliverChildListDelegate([
|
||||
GalleryInfoDesktop(widget.gData, fileId: firstFileId),
|
||||
GalleryInfoDesktop(widget.gData,
|
||||
fileId: firstFileId, controller: controller),
|
||||
]),
|
||||
),
|
||||
ThumbnailGridView(widget.gData.pages,
|
||||
@@ -56,6 +59,7 @@ class _GalleryInfo extends State<GalleryInfo> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller.dispose();
|
||||
listener.removeEventListener("showNsfwChanged", showNsfwChanged);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -5,10 +5,11 @@ import 'tags.dart';
|
||||
import 'thumbnail.dart';
|
||||
|
||||
class GalleryInfoDesktop extends StatelessWidget {
|
||||
const GalleryInfoDesktop(this.gData, {Key? key, this.fileId})
|
||||
const GalleryInfoDesktop(this.gData, {Key? key, this.fileId, this.controller})
|
||||
: super(key: key);
|
||||
final GalleryData gData;
|
||||
final int? fileId;
|
||||
final ScrollController? controller;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
30
lib/components/scroll_parent.dart
Normal file
30
lib/components/scroll_parent.dart
Normal file
@@ -0,0 +1,30 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ScrollParent extends StatelessWidget {
|
||||
final ScrollController controller;
|
||||
final Widget child;
|
||||
|
||||
const ScrollParent({Key? key, required this.controller, required this.child})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return NotificationListener<OverscrollNotification>(
|
||||
onNotification: (OverscrollNotification value) {
|
||||
if (value.overscroll < 0 && controller.offset + value.overscroll <= 0) {
|
||||
if (controller.offset != 0) controller.jumpTo(0);
|
||||
return true;
|
||||
}
|
||||
if (controller.offset + value.overscroll >=
|
||||
controller.position.maxScrollExtent) {
|
||||
if (controller.offset != controller.position.maxScrollExtent)
|
||||
controller.jumpTo(controller.position.maxScrollExtent);
|
||||
return true;
|
||||
}
|
||||
controller.jumpTo(controller.offset + value.overscroll);
|
||||
return true;
|
||||
},
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import '../api/gallery.dart';
|
||||
import '../globals.dart';
|
||||
import 'scroll_parent.dart';
|
||||
|
||||
class TagsPanel extends StatefulWidget {
|
||||
const TagsPanel(this.tags, {Key? key}) : super(key: key);
|
||||
const TagsPanel(this.tags, {Key? key, this.controller}) : super(key: key);
|
||||
final List<Tag> tags;
|
||||
final ScrollController? controller;
|
||||
|
||||
@override
|
||||
State<TagsPanel> createState() => _TagsPanel();
|
||||
@@ -51,7 +53,7 @@ class _TagsPanel extends State<TagsPanel> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final cs = Theme.of(context).colorScheme;
|
||||
return ListView.builder(
|
||||
final re = ListView.builder(
|
||||
padding: const EdgeInsets.all(8),
|
||||
itemCount: data!.length,
|
||||
itemBuilder: (context, index) {
|
||||
@@ -76,5 +78,8 @@ class _TagsPanel extends State<TagsPanel> {
|
||||
}
|
||||
}));
|
||||
});
|
||||
return widget.controller != null
|
||||
? ScrollParent(controller: widget.controller!, child: re)
|
||||
: re;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,9 @@ class ThumbnailGridView extends StatelessWidget {
|
||||
final page = pages[index]!;
|
||||
final fileId =
|
||||
files != null ? files!.files[page.token]!.first.id : null;
|
||||
return Thumbnail(page, fileId: fileId);
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(4),
|
||||
child: Thumbnail(page, fileId: fileId));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import 'package:eh_downloader_flutter/api/file.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'api/file.dart';
|
||||
import 'api/gallery.dart';
|
||||
import 'components/gallery_info.dart';
|
||||
import 'components/thumbnail.dart';
|
||||
import 'globals.dart';
|
||||
|
||||
final _log = Logger("GalleryPage");
|
||||
|
||||
Reference in New Issue
Block a user