flutter回到顶部代码片
Easul Lv4

点击按钮返回顶部

折叠代码块DART 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import 'package:flutter/material.dart';

class ScrollControllerRoute extends StatefulWidget {
const ScrollControllerRoute({super.key});

@override
createState() => _ScrollControllerRouteState();
}

class _ScrollControllerRouteState extends State<ScrollControllerRoute> {
bool _showToTopBtn = false;
Function _moveToTop = () {};

void isShowToTopBtn(value) {
setState(() {
print("修改结果为$value");
_showToTopBtn = value;
});
}

void moveToTop(func) {
setState(() {
_moveToTop = func;
});
}

@override
Widget build(BuildContext context) {
return MaterialApp(
title: '滚动控制器',
initialRoute: '/',
theme: ThemeData(
primarySwatch: Colors.orange,
),
routes: {
'/': (context) => Scaffold(
appBar: AppBar(
title: Text(
'滚动控制器',
style: TextStyle(color: Colors.white),
),
),
body: ScrollControllerTestRoute(
isShowToTopBtnChanged: isShowToTopBtn,
moveToTopFunc: moveToTop,
),
floatingActionButton: !_showToTopBtn
? null
: FloatingActionButton(
child: Icon(
Icons.arrow_upward,
color: Colors.white,
),
onPressed: () {
//返回到顶部时执行动画
_moveToTop();
}),
),
},
);
}
}

class ScrollControllerTestRoute extends StatefulWidget {
ScrollControllerTestRoute(
{required this.isShowToTopBtnChanged, required this.moveToTopFunc});
//是否显示“返回到顶部”按钮
final ValueChanged<bool> isShowToTopBtnChanged;
final void Function(dynamic func) moveToTopFunc;
@override
createState() => _ScrollControllerTestRouteState();
}

class _ScrollControllerTestRouteState extends State<ScrollControllerTestRoute> {
ScrollController _controller = ScrollController();
bool _showToTopBtn = false;

@override
void initState() {
super.initState();
//监听滚动事件,打印滚动位置
_controller.addListener(() {
print(_controller.offset); //打印滚动位置
if (_controller.offset < 1000 && _showToTopBtn) {
_showToTopBtn = !_showToTopBtn;
widget.isShowToTopBtnChanged(_showToTopBtn);
} else if (_controller.offset >= 1000 && !_showToTopBtn) {
_showToTopBtn = !_showToTopBtn;
widget.isShowToTopBtnChanged(_showToTopBtn);
//返回到顶部时执行动画
widget.moveToTopFunc(() {
_controller.animateTo(
.0,
duration: Duration(milliseconds: 200),
curve: Curves.ease,
);
});
}
});
}

@override
Widget build(BuildContext context) {
return Scrollbar(
child: ListView.builder(
itemCount: 100,
itemExtent: 50.0, //列表项高度固定时,显式指定高度是一个好习惯(性能消耗小)
controller: _controller,
itemBuilder: (context, index) {
return ListTile(
title: Text("$index"),
);
}),
);
}

@override
void dispose() {
//为了避免内存泄露,需要调用_controller.dispose
_controller.dispose();
super.dispose();
}
}
 评论
来发评论吧~
Powered By Valine
v1.5.2