mod: 关注、粉丝页面优化
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user