-
Notifications
You must be signed in to change notification settings - Fork 10
/
UnLimitGridViewWidget.dart
115 lines (110 loc) · 3.9 KB
/
UnLimitGridViewWidget.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
import 'package:english_words/english_words.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/common/CommonShowModel.dart';
///author: yang yi
///email: yangyirunning@163.com
class UnLimitGridViewWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return UnLimitGridViewState();
}
}
class UnLimitGridViewState extends State<UnLimitGridViewWidget> {
static const LOADING_FINISH = "loading_finish";
var words = [LOADING_FINISH]; //随机生成的单词倒着往回追加
@override
Widget build(BuildContext context) {
// TODO: implement build
final arg = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: getAppBar(arg),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
alignment: Alignment.center,
child: Text(
"GridView.builder",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 30,
fontFamily: "HanyiSentySuciTablet",
color: Colors.blue),
),
),
Expanded(child: Builder(
builder: (context) {
return RefreshIndicator(
onRefresh: () {
return Future.delayed(Duration(seconds: 2)).then((v) {
words = [LOADING_FINISH];
setState(() {});
}).whenComplete(() {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text(
"刷新完毕",
style: TextStyle(color: Colors.blue),
),
backgroundColor: Colors.grey[300],
));
});
},
child: Scrollbar(
//启用sliver延迟加载机制
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 5,
crossAxisSpacing: 5,
childAspectRatio: 1.5,
),
itemBuilder: (BuildContext context, int index) {
//到底了就加载,无限加载,不管加载多少
if (index == words.length - 1) {
retrieveData();
}
return ListTile(
leading: Image.asset("assets/images/conan.jpg"),
title: Text("item $index"),
subtitle: Text("subtitle $index"),
contentPadding: EdgeInsets.fromLTRB(20, 0, 20, 0),
onTap: () {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("点击了第 ($index) 项目"),
));
},
onLongPress: () {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("长按了第 ($index) 项目"),
));
},
);
},
shrinkWrap: true,
itemCount: words.length,
),
),
);
},
))
],
),
);
}
void retrieveData() {
Future.delayed(Duration(seconds: 2)).then((e) {
words.insertAll(
words.length - 1,
//每次生成20个单词
generateWordPairs().take(20).map((e) => e.asPascalCase).toList());
setState(() {});
});
}
@override
void initState() {
super.initState();
retrieveData();
}
}