mod: 关注、粉丝页面优化

This commit is contained in:
guozhigq
2023-08-31 21:42:59 +08:00
parent 08e4e64764
commit 01df8622e0
4 changed files with 97 additions and 28 deletions

View File

@ -1,3 +1,4 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/fan.dart'; import 'package:pilipala/http/fan.dart';
@ -7,11 +8,13 @@ import 'package:pilipala/utils/storage.dart';
class FansController extends GetxController { class FansController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
int pn = 1; int pn = 1;
int ps = 20;
int total = 0; int total = 0;
RxList<FansItemModel> fansList = [FansItemModel()].obs; RxList<FansItemModel> fansList = [FansItemModel()].obs;
late int mid; late int mid;
late String name; late String name;
var userInfo; var userInfo;
RxString loadingText = '加载中...'.obs;
@override @override
void onInit() { void onInit() {
@ -26,23 +29,31 @@ class FansController extends GetxController {
Future queryFans(type) async { Future queryFans(type) async {
if (type == 'init') { if (type == 'init') {
pn = 1; pn = 1;
loadingText.value == '加载中...';
}
if (loadingText.value == '没有更多了') {
return;
} }
var res = await FanHttp.fans( var res = await FanHttp.fans(
vmid: mid, vmid: mid,
pn: pn, pn: pn,
ps: 20, ps: ps,
orderType: 'attention', orderType: 'attention',
); );
if (res['status']) { if (res['status']) {
if (type == 'init') { if (type == 'init') {
fansList.value = res['data'].list; fansList.value = res['data'].list;
total = res['data'].total; total = res['data'].total;
} else if (type == 'onRefresh') {
fansList.insertAll(0, res['data'].list);
} else if (type == 'onLoad') { } else if (type == 'onLoad') {
fansList.addAll(res['data'].list); fansList.addAll(res['data'].list);
} }
print(total);
if ((pn == 1 && total < ps) || res['data'].list.isEmpty) {
loadingText.value = '没有更多了';
}
pn += 1; pn += 1;
} else {
SmartDialog.showToast(res['msg']);
} }
return res; return res;
} }

View File

@ -1,6 +1,8 @@
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/no_data.dart';
import 'package:pilipala/models/fans/result.dart'; import 'package:pilipala/models/fans/result.dart';
import 'controller.dart'; import 'controller.dart';
@ -17,7 +19,6 @@ class _FansPageState extends State<FansPage> {
final FansController _fansController = Get.put(FansController()); final FansController _fansController = Get.put(FansController());
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
Future? _futureBuilderFuture; Future? _futureBuilderFuture;
bool _isLoadingMore = false;
@override @override
void initState() { void initState() {
@ -27,11 +28,9 @@ class _FansPageState extends State<FansPage> {
() async { () async {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_isLoadingMore) { EasyThrottle.throttle('follow', const Duration(seconds: 1), () {
_isLoadingMore = true; _fansController.queryFans('onLoad');
await _fansController.queryFans('onLoad'); });
_isLoadingMore = false;
}
} }
}, },
); );
@ -66,14 +65,38 @@ class _FansPageState extends State<FansPage> {
if (data['status']) { if (data['status']) {
List<FansItemModel> list = _fansController.fansList; List<FansItemModel> list = _fansController.fansList;
return Obx( return Obx(
() => list.length == 1 () => list.isNotEmpty
? const SizedBox() ? ListView.builder(
: ListView.builder(
controller: scrollController, controller: scrollController,
itemCount: list.length, itemCount: list.length + 1,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (index == list.length) {
return Container(
height:
MediaQuery.of(context).padding.bottom + 60,
padding: EdgeInsets.only(
bottom:
MediaQuery.of(context).padding.bottom),
child: Center(
child: Obx(
() => Text(
_fansController.loadingText.value,
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline,
fontSize: 13),
),
),
),
);
} else {
return fanItem(item: list[index]); return fanItem(item: list[index]);
}
}, },
)
: const CustomScrollView(
slivers: [NoData()],
), ),
); );
} else { } else {

View File

@ -1,3 +1,4 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/follow.dart'; import 'package:pilipala/http/follow.dart';
@ -7,11 +8,13 @@ import 'package:pilipala/utils/storage.dart';
class FollowController extends GetxController { class FollowController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
int pn = 1; int pn = 1;
int ps = 20;
int total = 0; int total = 0;
RxList<FollowItemModel> followList = [FollowItemModel()].obs; RxList<FollowItemModel> followList = [FollowItemModel()].obs;
late int mid; late int mid;
late String name; late String name;
var userInfo; var userInfo;
RxString loadingText = '加载中...'.obs;
@override @override
void onInit() { void onInit() {
@ -26,23 +29,30 @@ class FollowController extends GetxController {
Future queryFollowings(type) async { Future queryFollowings(type) async {
if (type == 'init') { if (type == 'init') {
pn = 1; pn = 1;
loadingText.value == '加载中...';
}
if (loadingText.value == '没有更多了') {
return;
} }
var res = await FollowHttp.followings( var res = await FollowHttp.followings(
vmid: mid, vmid: mid,
pn: pn, pn: pn,
ps: 20, ps: ps,
orderType: 'attention', orderType: 'attention',
); );
if (res['status']) { if (res['status']) {
if (type == 'init') { if (type == 'init') {
followList.value = res['data'].list; followList.value = res['data'].list;
total = res['data'].total; total = res['data'].total;
} else if (type == 'onRefresh') {
followList.insertAll(0, res['data'].list);
} else if (type == 'onLoad') { } else if (type == 'onLoad') {
followList.addAll(res['data'].list); followList.addAll(res['data'].list);
} }
if ((pn == 1 && total < ps) || res['data'].list.isEmpty) {
loadingText.value = '没有更多了';
}
pn += 1; pn += 1;
} else {
SmartDialog.showToast(res['msg']);
} }
return res; return res;
} }

View File

@ -1,6 +1,8 @@
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/no_data.dart';
import 'package:pilipala/models/follow/result.dart'; import 'package:pilipala/models/follow/result.dart';
import 'controller.dart'; import 'controller.dart';
@ -17,7 +19,6 @@ class _FollowPageState extends State<FollowPage> {
final FollowController _followController = Get.put(FollowController()); final FollowController _followController = Get.put(FollowController());
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
Future? _futureBuilderFuture; Future? _futureBuilderFuture;
bool _isLoadingMore = false;
@override @override
void initState() { void initState() {
@ -27,11 +28,9 @@ class _FollowPageState extends State<FollowPage> {
() async { () async {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_isLoadingMore) { EasyThrottle.throttle('follow', const Duration(seconds: 1), () {
_isLoadingMore = true; _followController.queryFollowings('onLoad');
await _followController.queryFollowings('onLoad'); });
_isLoadingMore = false;
}
} }
}, },
); );
@ -67,14 +66,40 @@ class _FollowPageState extends State<FollowPage> {
if (data['status']) { if (data['status']) {
List<FollowItemModel> list = _followController.followList; List<FollowItemModel> list = _followController.followList;
return Obx( return Obx(
() => list.length == 1 () => list.isNotEmpty
? const SizedBox() ? ListView.builder(
: ListView.builder(
controller: scrollController, controller: scrollController,
itemCount: list.length, itemCount: list.length + 1,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (index == list.length) {
return Container(
height:
MediaQuery.of(context).padding.bottom +
60,
padding: EdgeInsets.only(
bottom: MediaQuery.of(context)
.padding
.bottom),
child: Center(
child: Obx(
() => Text(
_followController.loadingText.value,
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline,
fontSize: 13),
),
),
),
);
} else {
return followItem(item: list[index]); return followItem(item: list[index]);
}
}, },
)
: const CustomScrollView(
slivers: [NoData()],
), ),
); );
} else { } else {