这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

86 lines
2.4 KiB

import 'package:flutter/material.dart';
class BackToTop extends StatefulWidget {
const BackToTop({
super.key,
required this.controller,
this.bottom,
});
final double? bottom;
final ScrollController controller;
@override
State<StatefulWidget> createState() => _BackToTopState();
}
class _BackToTopState extends State<BackToTop> {
bool shown = false;
@override
void initState() {
super.initState();
widget.controller.addListener(isScroll);
}
void isScroll() {
final bool toShow = widget.controller.offset > MediaQuery.of(context).size.height / 2;
if (toShow ^ shown) {
setState(() {
shown = toShow;
});
}
}
@override
Widget build(BuildContext context) {
return Positioned(
bottom: MediaQuery.of(context).padding.bottom + (widget.bottom ?? 40),
right: 20,
child: Offstage(
offstage: !shown,
child: GestureDetector(
onTap: () {
widget.controller.animateTo(0,
duration: const Duration(milliseconds: 200),
curve: Curves.easeIn);
},
child: Container(
height: 48,
width: 48,
alignment: const Alignment(0, 0),
decoration: BoxDecoration(
color: Theme.of(context).highlightColor,
borderRadius: const BorderRadius.all(Radius.circular(20)),
boxShadow: [
BoxShadow(
color: const Color(0xFF000000).withOpacity(0.1),
blurRadius: 4,
spreadRadius: 0),
]),
child: Column(
children: <Widget>[
Container(
margin: const EdgeInsets.only(top: 4),
child: Icon(
Icons.vertical_align_top,
size: 20,
color: Theme.of(context).hintColor,
),
),
Container(
margin: const EdgeInsets.only(top: 0),
child: const Text(
'Top',
//style: TextStyle(fontSize: 10, color: Color(0xFFA1A6AA)),
),
)
],
)
),
),
)
);
}
}