// 话题列表页
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_app/generated/i18n.dart';
import 'package:flutter_app/models/web/item_tab_topic.dart';
import 'package:flutter_app/network/dio_web.dart';
import 'package:flutter_app/pages/page_profile.dart';
import 'package:flutter_app/pages/page_topic_detail.dart';
import 'package:flutter_app/utils/utils.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:ovprogresshud/progresshud.dart';
import 'package:shimmer/shimmer.dart';
import 'circle_avatar.dart';
class TopicListView extends StatefulWidget {
final String tabKey;
TopicListView(this.tabKey);
@override
State<StatefulWidget> createState() => new TopicListViewState();
}
class TopicListViewState extends State<TopicListView> with AutomaticKeepAliveClientMixin {
Future<List<TabTopicItem>> topicListFuture;
ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
// 获取数据
topicListFuture = getTopics();
_scrollController.addListener(() {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
HapticFeedback.heavyImpact(); // 震动反馈(暗示已经滑到底部了)
}
});
}
Future<List<TabTopicItem>> getTopics() async {
return await DioWeb.getTopicsByTabKey(widget.tabKey, 0);
}
@override
Widget build(BuildContext context) {
super.build(context);
return new FutureBuilder<List<TabTopicItem>>(
future: topicListFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
return RefreshIndicator(
child: snapshot.data.length > 0
? ListView.builder(
// primary: false, // 这样会导致 iOS 上点击状态栏没办法滑到顶部
controller: _scrollController,
physics: ClampingScrollPhysics(), // iOS 上默认是 BouncingScrollPhysics,体验和下拉刷新有点冲突
itemBuilder: (context, index) => TopicItemView(snapshot.data[index]),
itemCount: snapshot.data.length)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('暂无数据'),
],
),
onRefresh: () {
// https://stackoverflow.com/questions/51775098/how-do-i-use-refreshindicator-with-a-futurebuilder-in-flutter
setState(() {
topicListFuture = getTopics();
});
return topicListFuture;
});
} else if (snapshot.hasError) {
print("wmllll:${snapshot.error}");
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(S.of(context).oops),
RaisedButton.icon(
onPressed: () {
Progresshud.show();
_onRefresh().then((_) => Progresshud.dismiss());
},
icon: Icon(Icons.refresh),
label: Text(S.of(context).retry),
)
],
);
}
// By default, show a loading skeleton
return LoadingList();
});
}
//刷新数据,重新设置future就行了
Future _onRefresh() async {
await Future.delayed(Duration(seconds: 1), () {
setState(() {
topicListFuture = getTopics();
});
});
}
@override
void dispose() {
super.dispose();
_scrollController.dispose();
}
@override
bool get wantKeepAlive => true;
}
页面刷新
最新推荐文章于 2024-10-16 15:17:16 发布