forked from peng8350/flutter_pulltorefresh
-
Notifications
You must be signed in to change notification settings - Fork 1
/
refresh_staggered_and_sticky.dart
167 lines (156 loc) · 4.61 KB
/
refresh_staggered_and_sticky.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* Author: Jpeng
* Email: peng8350@gmail.com
* Time: 2019-07-23 21:09
*/
import 'package:flutter/material.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:flutter_sticky_header/flutter_sticky_header.dart';
/*
use refresh with StaggeredGridView or StickyHeader
the two plugins from letsar
author page : https://github.com/letsar
*/
class RefreshStaggeredAndSticky extends StatefulWidget {
RefreshStaggeredAndSticky({Key key}) : super(key: key);
@override
RefreshStaggeredAndStickyState createState() =>
RefreshStaggeredAndStickyState();
}
class RefreshStaggeredAndStickyState extends State<RefreshStaggeredAndSticky>
with TickerProviderStateMixin {
RefreshController _refreshController;
List<Widget> data = [];
int length = 10;
void _getDatas() {
data.add(Row(
children: <Widget>[
FlatButton(
onPressed: () {
_refreshController.requestRefresh();
},
child: Text("请求刷新")),
FlatButton(
onPressed: () {
_refreshController.requestLoading();
},
child: Text("请求加载数据"))
],
));
for (int i = 0; i < 13; i++) {
data.add(GestureDetector(
child: Container(
color: Color.fromARGB(255, 250, 250, 250),
child: Card(
margin:
EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0),
child: Center(
child: Text('Data $i'),
),
),
),
onTap: () {
_refreshController.requestRefresh();
},
));
}
}
void enterRefresh() {
_refreshController.requestLoading();
}
@override
void initState() {
// TODO: implement initState
_getDatas();
_refreshController = RefreshController(initialRefresh: true);
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
_refreshController.dispose();
super.dispose();
}
List<bool> expand = [false, false, false, false, false, false, false, false];
@override
Widget build(BuildContext context) {
List<Widget> slivers = [];
for (int i = 0; i < expand.length; i++) {
slivers.add(SliverStickyHeader(
header: GestureDetector(
child: new Container(
height: 60.0,
color: Colors.lightBlue,
padding: EdgeInsets.symmetric(horizontal: 16.0),
alignment: Alignment.centerLeft,
child: new Text(
'Header #$i',
style: const TextStyle(color: Colors.white),
),
),
onTap: () {
expand[i] = !expand[i];
setState(() {});
},
),
sliver: expand[i]
? new SliverList(
delegate: new SliverChildBuilderDelegate(
(context, i) => new ListTile(
leading: new CircleAvatar(
child: new Text('0'),
),
title: new Text('List tile #$i'),
),
childCount: 4,
),
)
: null,
));
}
slivers.add(SliverStaggeredGrid.countBuilder(
crossAxisCount: 4,
itemCount: length,
itemBuilder: (BuildContext context, int index) => new Container(
color: Colors.green,
child: new Center(
child: new CircleAvatar(
backgroundColor: Colors.white,
child: new Text('$index'),
),
)),
staggeredTileBuilder: (int index) =>
new StaggeredTile.count(2, index.isEven ? 2 : 1),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
));
return LayoutBuilder(
builder: (i, c) {
return SmartRefresher(
enablePullUp: true,
enablePullDown: true,
controller: _refreshController,
header: MaterialClassicHeader(),
onRefresh: () async {
print("onRefresh");
await Future.delayed(const Duration(milliseconds: 4000));
if (mounted) setState(() {});
_refreshController.refreshFailed();
},
child: CustomScrollView(
slivers: slivers,
),
onLoading: () {
print("onload");
Future.delayed(const Duration(milliseconds: 2000)).then((val) {
length += 10;
if (mounted) setState(() {});
_refreshController.loadComplete();
});
},
);
},
);
}
}