Flutter如何实现下拉刷新和上拉加载更多,Android开发基础面试题
class MovieListState extends State {String movieType;String typeName;List movieList = new List();int currentPage = 0; //第一页int pageSize = 10; //页容量int totalSize = 0; //总条数String loadMoreText = “没有更多数据
class MovieListState extends State {
String movieType;
String typeName;
List movieList = new List();
int currentPage = 0; //第一页
int pageSize = 10; //页容量
int totalSize = 0; //总条数
String loadMoreText = “没有更多数据”;
TextStyle loadMoreTextStyle =
new TextStyle(color: const Color(0xFF999999), fontSize: 14.0);
TextStyle titleStyle =
new TextStyle(color: const Color(0xFF757575), fontSize: 14.0);
//初始化滚动监听器,加载更多使用
ScrollController _controller = new ScrollController();
/**
- 构造器接收(MovieList)数据
*/
MovieListState({Key key, this.movieType}) {
//固定写法,初始化滚动监听器,加载更多使用
_controller.addListener(() {
var maxScroll = _controller.position.maxScrollExtent;
var pixel = _controller.position.pixels;
if (maxScroll == pixel && movieList.length < totalSize) {
setState(() {
loadMoreText = “正在加载中…”;
loadMoreTextStyle =
new TextStyle(color: const Color(0xFF4483f6), fontSize: 14.0);
});
loadMoreData();
} else {
setState(() {
loadMoreText = “没有更多数据”;
loadMoreTextStyle =
new TextStyle(color: const Color(0xFF999999), fontSize: 14.0);
});
}
});
}
//加载列表数据
loadMoreData() async {
this.currentPage++;
var start = (currentPage - 1) * pageSize;
var url =
“https://api.douban.com/v2/movie/ m o v i e T y p e ? s t a r t = movieType?start= movieType?start=start&count=$pageSize”;
Dio dio = new Dio();
Response response = await dio.get(url);
setState(() {
movieList.addAll(response.data[“subjects”]);
totalSize = response.data[“total”];
});
}
@override
void initState() {
super.initState();
//设置当前导航栏的标题
switch (movieType) {
case “in_theaters”:
typeName = “正在热映”;
break;
case “coming_soon”:
typeName = “即将上映”;
break;
case “top250”:
typeName = “Top250”;
break;
}
//加载第一页数据
loadMoreData();
}
/**
- 下拉刷新,必须异步async不然会报错
*/
Future _pullToRefresh() async {
currentPage = 0;
movieList.clear();
loadMoreData();
return null;
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
backgroundColor: Colors.white,
appBar: new AppBar(
leading: new IconButton(
icon: const Icon(Icons.arrow_back),
onPressed:null ,
),
title: new Text(typeName != null ? typeName : “正在加载中…”,
style: new TextStyle(color: Colors.black)),
backgroundColor: Colors.white,
),
body: movieList.length == 0
-
? new Center(child: new CircularProgressIndicator())
- new RefreshIndicator(
color: const Color(0xFF4483f6),
//下拉刷新
child: ListView.builder(
itemCount: movieList.length + 1,
itemBuilder: (context, index) {
if (index == movieList.length) {
return _buildProgressMoreIndicator();
} else {
return renderRow(index, context);
}
},
controller: _controller, //指明控制器加载更多使用
),
onRefresh: _pullToRefresh,
),
);
}
/**
- 加载更多进度条
*/
Widget _buildProgressMoreIndicator() {
return new Padding(
padding: const EdgeInsets.all(15.0),
child: new Center(
child: new Text(loadMoreText, style: loadMoreTextStyle),
),
);
}
/**
- 列表的ltem
*/
renderRow(index, context) {
var movie = movieList[index];
var id = movie[“id”];
var title = movie[“title”];
var type = movie[“genres”].join("、");
var year = movie[“year”];
var score = movie[“rating”][“average”];
return new Container(
height: 200,
color: Colors.white,
child: new InkWell(
onTap: () {
Navigator.of(context).push(new MaterialPageRoute(
builder: (ctx) => new MovieDetail(movieId: id)));
},
child: new Column(
children: [
new Container(
height: 199,
// color: Colors.blue,
child: new Row(
children: [
new Container(
width: 120.0,
height: 180.0,
margin: const EdgeInsets.all(10.0),
child: Image.network(movie[“images”][“small”]),
),
Expanded(
child: new Container(
这里我就分享一份资料,希望可以帮助到大家提升进阶。
内容包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。
如果你有需要的话,可以点击Android学习PDF+架构视频+面试文档+源码笔记获取免费领取方式
喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

更多推荐


所有评论(0)