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(); super.dispose(); } }
|
v1.5.2