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/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 {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user