class SearchList extends StatefulWidget {
const SearchList(
{super.key, required String keywords, required int selectedIndex});
@override
State<SearchList> createState() => _SearchListState();
}
class _SearchListState extends State<SearchList> {
int currentPage = 1; //当前页是第一页
List<JobInfo> datalist = [];
bool isLoading = false;
final ScrollController _scrollController = ScrollController();
//获取第n页数据
Future<List<JobInfo>> fetchJobList({int page = 1}) async {
final response = await http
.get(Uri.parse('http://xiaoshuo.com/api/zhaopin/index?page=$page'));
if (response.statusCode == 200) {
final responseBody = json.decode(response.body);
//转换模型数组
List<JobInfo> joblist = responseBody['data']['rows']
.map<JobInfo>((item) => JobInfo.fromJson(item))
.toList();
return joblist;
} else {
throw Exception('Failed to fetch data');
}
}
// 获取数据后填充datalist
Future<void> loadNextPage() async {
var nextPageData = await fetchJobList(page: currentPage);
var scrollOffset = _scrollController.offset;
setState(() {
datalist.addAll(nextPageData);
currentPage++;
isLoading = false;
});
_scrollController.jumpTo(scrollOffset);
}
@override
void initState() {
super.initState();
loadNextPage();//加载第一页
_scrollController.addListener(() {
if (!isLoading &&
_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
isLoading = true;
loadNextPage();//加载下一页
}
});
}
Future<void> _refresh() async {
// 模拟网络请求
//await Future.delayed(Duration(seconds: 2));
// 刷新数据,将datalist清空后加载第一页
setState(() {
datalist = [];
currentPage = 1;
isLoading = true;
loadNextPage();
});
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Color.fromARGB(255, 230, 229, 229),
),
padding: EdgeInsets.symmetric(
vertical: 3,
),
child: RefreshIndicator(
onRefresh: _refresh,
child: ListView.builder(
controller: _scrollController,
itemCount: datalist.length + 1, // 加1是为了显示加载中的UI
itemBuilder: (context, index) {
if (index < datalist.length) {
return SearchItemCard(jobinfo: datalist[index]);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
),
),
);
}
}