TF-1017 Add function handle when press scrollToTop
(cherry picked from commit 443196f84d07638ff8dc668e08296d0c8cd4905b)
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
<svg width="18" height="19" viewBox="0 0 18 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9 0L9.01935 0.000185966C9.04268 0.000634706 9.066 0.0018949 9.08925 0.00396633L9 0C9.05272 0 9.10448 0.00387514 9.15499 0.0113416C9.16655 0.0138109 9.1786 0.0159106 9.19061 0.0182323C9.4454 0.0640251 9.66551 0.202435 9.81162 0.394905L17.7071 8.29289C18.0976 8.68342 18.0976 9.31658 17.7071 9.70711C17.3466 10.0676 16.7794 10.0953 16.3871 9.7903L16.2929 9.70711L10 3.414V18.05C10 18.5747 9.55228 19 9 19C8.48716 19 8.06449 18.6333 8.00673 18.1608L8 18.05V3.414L1.70711 9.70711C1.34662 10.0676 0.779392 10.0953 0.387101 9.7903L0.292893 9.70711C-0.0675905 9.34662 -0.0953204 8.77939 0.209704 8.3871L0.292893 8.29289L8.18838 0.394905C8.33449 0.202435 8.5546 0.0640251 8.8091 0.0172901C8.8214 0.0159106 8.83345 0.0138106 8.84553 0.0119324C8.86645 0.00817297 8.88811 0.00565128 8.90997 0.00379801C8.93434 0.00186553 8.95798 0.00059914 8.98164 0.00016737C8.9872 5.70498e-05 8.99359 0 9 0Z" fill="white"/>
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0_12804_73574" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="18" height="19">
|
||||
<path d="M14 5L14.0194 5.00019C14.0427 5.00063 14.066 5.00189 14.0893 5.00397L14 5C14.0527 5 14.1045 5.00388 14.155 5.01134C14.1665 5.01381 14.1786 5.01591 14.1906 5.01823C14.4454 5.06403 14.6655 5.20244 14.8116 5.39491L22.7071 13.2929C23.0976 13.6834 23.0976 14.3166 22.7071 14.7071C22.3466 15.0676 21.7794 15.0953 21.3871 14.7903L21.2929 14.7071L15 8.414V23.05C15 23.5747 14.5523 24 14 24C13.4872 24 13.0645 23.6333 13.0067 23.1608L13 23.05V8.414L6.70711 14.7071C6.34662 15.0676 5.77939 15.0953 5.3871 14.7903L5.29289 14.7071C4.93241 14.3466 4.90468 13.7794 5.2097 13.3871L5.29289 13.2929L13.1884 5.39491C13.3345 5.20244 13.5546 5.06403 13.8091 5.01729C13.8214 5.01591 13.8335 5.01381 13.8455 5.01193C13.8664 5.00817 13.8881 5.00565 13.91 5.0038C13.9343 5.00187 13.958 5.0006 13.9816 5.00017C13.9872 5.00006 13.9936 5 14 5Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_12804_73574)">
|
||||
<rect width="28" height="28" fill="white"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1011 B After Width: | Height: | Size: 1.1 KiB |
@@ -1,12 +1,12 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ScrollToTopButtonWidgetStyles {
|
||||
static const double defaultLimitIndicator = 50.0;
|
||||
static const double defaultElevation = 5.0;
|
||||
static const Color defaultColor = AppColor.colorLabelCancelButton;
|
||||
static const double defaultButtonRadius = 44.0;
|
||||
static const double buttonPadding = 16.0;
|
||||
static const double defaultButtonRadius = 32.0;
|
||||
static const double buttonPadding = 8.0;
|
||||
static const double iconWidth = 28.0;
|
||||
static const double iconHeight = 28.0;
|
||||
}
|
||||
@@ -1096,4 +1096,10 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void scrollToTop() {
|
||||
if (listEmailController.hasClients) {
|
||||
listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,19 +162,22 @@ class ThreadView extends GetWidget<ThreadController>
|
||||
floatingActionButton: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
ScrollToTopButtonWidget(
|
||||
scrollController: controller.listEmailController,
|
||||
onTap: () => controller.scrollToTop(),
|
||||
responsiveUtils: _responsiveUtils,
|
||||
icon: SvgPicture.asset(
|
||||
_imagePaths.icArrowUpOutline,
|
||||
width: ScrollToTopButtonWidgetStyles.iconWidth,
|
||||
height: ScrollToTopButtonWidgetStyles.iconHeight,
|
||||
fit: BoxFit.fill,
|
||||
colorFilter: Colors.white.asFilter(),
|
||||
Container(
|
||||
padding: const EdgeInsetsDirectional.only(end: 4.0),
|
||||
child: ScrollToTopButtonWidget(
|
||||
scrollController: controller.listEmailController,
|
||||
onTap: controller.scrollToTop,
|
||||
responsiveUtils: _responsiveUtils,
|
||||
icon: SvgPicture.asset(
|
||||
_imagePaths.icArrowUpOutline,
|
||||
width: ScrollToTopButtonWidgetStyles.iconWidth,
|
||||
height: ScrollToTopButtonWidgetStyles.iconHeight,
|
||||
fit: BoxFit.fill,
|
||||
colorFilter: Colors.white.asFilter(),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
const SizedBox(height: 24),
|
||||
_buildFloatingButtonCompose(context),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -6,10 +6,10 @@ class ScrollToTopButtonWidget extends StatefulWidget {
|
||||
final ScrollController scrollController;
|
||||
final GestureTapCallback onTap;
|
||||
final ResponsiveUtils responsiveUtils;
|
||||
final double? limitIndicator;
|
||||
final double? elevation;
|
||||
final Color? colorButton;
|
||||
final double? buttonRadius;
|
||||
final double limitIndicator;
|
||||
final double elevation;
|
||||
final Color colorButton;
|
||||
final double buttonRadius;
|
||||
final Widget? icon;
|
||||
|
||||
const ScrollToTopButtonWidget({
|
||||
@@ -34,32 +34,29 @@ class _ScrollToTopButtonWidgetState extends State<ScrollToTopButtonWidget> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_handleScroll();
|
||||
widget.scrollController.addListener(_handleScroll);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
widget.scrollController.removeListener(() {});
|
||||
widget.scrollController.removeListener(_handleScroll);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _handleScroll() {
|
||||
ScrollController scrollController = widget.scrollController;
|
||||
scrollController.addListener(() {
|
||||
if (scrollController.position.pixels > widget.limitIndicator!) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isVisible = true;
|
||||
});
|
||||
}
|
||||
} else if (scrollController.position.pixels <= widget.limitIndicator!) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isVisible = false;
|
||||
});
|
||||
}
|
||||
if (widget.scrollController.position.pixels > widget.limitIndicator) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isVisible = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
} else if (widget.scrollController.position.pixels <= widget.limitIndicator) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isVisible = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -76,11 +73,11 @@ class _ScrollToTopButtonWidgetState extends State<ScrollToTopButtonWidget> {
|
||||
elevation: widget.elevation,
|
||||
shape: const CircleBorder(),
|
||||
child: InkWell(
|
||||
borderRadius: BorderRadius.circular(widget.buttonRadius!),
|
||||
borderRadius: BorderRadius.all(Radius.circular(widget.buttonRadius)),
|
||||
onTap: widget.onTap,
|
||||
child: Ink(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(widget.buttonRadius!),
|
||||
borderRadius: BorderRadius.all(Radius.circular(widget.buttonRadius)),
|
||||
color: widget.colorButton,
|
||||
),
|
||||
padding: const EdgeInsets.all(ScrollToTopButtonWidgetStyles.buttonPadding),
|
||||
|
||||
Reference in New Issue
Block a user