improve auto scroll behaviour
This commit is contained in:
+29
-67
@@ -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/website_feed_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;
|
||||
|
||||
class ClampingScrollPhysicsWithoutImplicit extends ClampingScrollPhysics {
|
||||
@@ -82,54 +81,35 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
).select((value) => value.valueOrNull ?? const []),
|
||||
);
|
||||
|
||||
final initialScrollDebouncer = useMemoized(
|
||||
() => Debouncer(const Duration(milliseconds: 150)),
|
||||
);
|
||||
final scrolledTo = useRef(0.0);
|
||||
useEffect(() {
|
||||
if (!initialScrollDebouncer.hasRan) {
|
||||
initialScrollDebouncer.eventOccured(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
final header = headerKey.currentContext?.findRenderObject();
|
||||
final text = textFieldKey.currentContext?.findRenderObject();
|
||||
|
||||
if (header case final RenderBox headerBox) {
|
||||
if (text case final RenderBox textBox) {
|
||||
final totalHeight =
|
||||
headerBox.size.height +
|
||||
textBox.size.height +
|
||||
kToolbarHeight;
|
||||
headerBox.size.height + textBox.size.height + kToolbarHeight;
|
||||
|
||||
final relative =
|
||||
totalHeight / MediaQuery.of(context).size.height;
|
||||
final relative = 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;
|
||||
});
|
||||
|
||||
// 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);
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
@@ -148,10 +128,10 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
return null;
|
||||
}, [MediaQuery.of(context).viewInsets.bottom]);
|
||||
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
DraggableScrollableHeader(
|
||||
return NestedScrollView(
|
||||
headerSliverBuilder: (context, innerBoxIsScrolled) => [
|
||||
SliverToBoxAdapter(
|
||||
child: DraggableScrollableHeader(
|
||||
key: headerKey,
|
||||
controller: draggableScrollableController,
|
||||
child: Column(
|
||||
@@ -171,9 +151,10 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
Flexible(
|
||||
child: FadingScroll(
|
||||
fadingSize: 25,
|
||||
),
|
||||
],
|
||||
body: FadingScroll(
|
||||
fadingSize: 15,
|
||||
controller: sheetScrollController,
|
||||
builder: (context, controller) {
|
||||
return ListView(
|
||||
@@ -198,9 +179,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
ClipboardData(text: initialTabState.url.toString()),
|
||||
);
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
@@ -232,9 +211,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
},
|
||||
);
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
}
|
||||
},
|
||||
),
|
||||
@@ -257,9 +234,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
},
|
||||
);
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
}
|
||||
},
|
||||
),
|
||||
@@ -278,16 +253,11 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
if (containerData != null) {
|
||||
await ref
|
||||
.read(tabDataRepositoryProvider.notifier)
|
||||
.assignContainer(
|
||||
initialTabState.id,
|
||||
containerData,
|
||||
);
|
||||
.assignContainer(initialTabState.id, containerData);
|
||||
}
|
||||
}
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
},
|
||||
),
|
||||
Consumer(
|
||||
@@ -299,9 +269,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
.read(tabDataRepositoryProvider.notifier)
|
||||
.unassignContainer(initialTabState.id);
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
},
|
||||
),
|
||||
builder: (context, ref, child) {
|
||||
@@ -323,9 +291,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
ShareParams(uri: initialTabState.url),
|
||||
);
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
},
|
||||
onTapQr: () async {
|
||||
await showQrCode(context, initialTabState.url.toString());
|
||||
@@ -361,9 +327,7 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
});
|
||||
}
|
||||
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
},
|
||||
),
|
||||
WebsiteFeedTile(initialTabState),
|
||||
@@ -371,8 +335,6 @@ class ViewTabSheetWidget extends HookConsumerWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user