mod: 用户页面动态加载

This commit is contained in:
guozhigq
2023-07-28 10:32:02 +08:00
parent bc83d26073
commit 88f21615fc
8 changed files with 202 additions and 7 deletions

View File

@ -234,4 +234,7 @@ class Api {
// w_rid=d893cf98a4e010cf326373194a648360&
// wts=1689767832
static const String memberArchive = '/x/space/wbi/arc/search';
// 用户动态
static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space';
}

View File

@ -1,4 +1,5 @@
import 'package:pilipala/http/index.dart';
import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/models/member/archive.dart';
import 'package:pilipala/models/member/info.dart';
import 'package:pilipala/utils/wbi_sign.dart';
@ -96,4 +97,26 @@ class MemberHttp {
};
}
}
// 用户动态
static Future memberDynamic({String? offset, int? mid}) async {
var res = await Request().get(Api.memberDynamic, data: {
'offset': offset ?? '',
'host_mid': mid,
'timezone_offset': '-480',
'features': 'itemOpusStyle',
});
if (res.data['code'] == 0) {
return {
'status': true,
'data': DynamicsDataModel.fromJson(res.data['data']),
};
} else {
return {
'status': false,
'data': [],
'msg': res.data['message'],
};
}
}
}

View File

@ -234,7 +234,7 @@ class Vote {
int? endTime;
int? joinNum;
int? status;
String? type;
int? type;
int? uid;
int? voteId;

View File

@ -36,11 +36,12 @@ class _ArchivePanelState extends State<ArchivePanel>
Column(
children: <Widget>[
// 下拉刷新指示器
PullToRefreshContainer(
(PullToRefreshScrollNotificationInfo? info) {
return PullToRefreshHeader(info, lastRefreshTime);
},
),
// PullToRefreshContainer(
// (PullToRefreshScrollNotificationInfo? info) {
// return PullToRefreshHeader(info, lastRefreshTime);
// },
// ),
const SizedBox(height: 4),
Expanded(
child: LoadingMoreList<VListItemModel>(
ListConfig<VListItemModel>(

View File

@ -0,0 +1,25 @@
import 'package:get/get.dart';
import 'package:pilipala/http/member.dart';
class MemberDynamicPanelController extends GetxController {
int? mid;
String offset = '';
int count = 0;
@override
void onInit() {
super.onInit();
mid = int.parse(Get.parameters['mid']!);
}
Future getMemberDynamic() async {
var res = await MemberHttp.memberDynamic(
offset: offset,
mid: mid,
);
if (res['status']) {
offset = res['data'].offset;
}
return res;
}
}

View File

@ -0,0 +1,4 @@
library dynamic_panel;
export './controller.dart';
export './view.dart';

View File

@ -0,0 +1,138 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:loading_more_list/loading_more_list.dart';
import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/pages/dynamics/widgets/dynamic_panel.dart';
import 'controller.dart';
class MemberDynamicPanel extends StatefulWidget {
const MemberDynamicPanel({super.key});
@override
State<MemberDynamicPanel> createState() => _MemberDynamicPanelState();
}
class _MemberDynamicPanelState extends State<MemberDynamicPanel>
with AutomaticKeepAliveClientMixin {
DateTime lastRefreshTime = DateTime.now();
late final LoadMoreListSource source = LoadMoreListSource();
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
return Expanded(
child: LoadingMoreList<DynamicItemModel>(
ListConfig<DynamicItemModel>(
sourceList: source,
itemBuilder: (BuildContext c, DynamicItemModel item, int index) {
return DynamicPanel(item: item);
},
indicatorBuilder: _buildIndicator,
),
),
);
}
Widget _buildIndicator(BuildContext context, IndicatorStatus status) {
TextStyle style =
TextStyle(fontSize: 13, color: Theme.of(context).colorScheme.outline);
Widget? widget;
switch (status) {
case IndicatorStatus.none:
widget = Container(height: 0.0);
break;
case IndicatorStatus.loadingMoreBusying:
widget = Text('加载中...', style: style);
widget = _setbackground(false, widget, height: 60.0);
break;
case IndicatorStatus.fullScreenBusying:
widget = Text('加载中...', style: style);
widget = _setbackground(true, widget);
break;
case IndicatorStatus.error:
/// TODO 异常逻辑
widget = Text('没有更多了', style: style);
widget = _setbackground(false, widget);
widget = GestureDetector(
onTap: () {},
child: widget,
);
break;
case IndicatorStatus.fullScreenError:
/// TODO 异常逻辑
widget = Text('没有更多了', style: style);
widget = _setbackground(true, widget);
widget = GestureDetector(
onTap: () {},
child: widget,
);
break;
case IndicatorStatus.noMoreLoad:
widget = Text('没有更多了', style: style);
widget = _setbackground(false, widget, height: 60.0);
break;
case IndicatorStatus.empty:
widget = Text('用户没有投稿', style: style);
widget = _setbackground(true, widget);
break;
}
return widget;
}
Widget _setbackground(bool full, Widget widget, {double height = 100}) {
widget = Padding(
padding: height == double.infinity
? EdgeInsets.zero
: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: Container(
width: double.infinity,
height: height,
color: Theme.of(context).colorScheme.background,
alignment: Alignment.center,
child: widget,
),
);
return widget;
}
Widget getIndicator(BuildContext context) {
final TargetPlatform platform = Theme.of(context).platform;
return platform == TargetPlatform.iOS
? const CupertinoActivityIndicator(
animating: true,
radius: 16.0,
)
: CircularProgressIndicator(
strokeWidth: 2.0,
valueColor:
AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
);
}
}
class LoadMoreListSource extends LoadingMoreBase<DynamicItemModel> {
final _dynamicController = Get.put(MemberDynamicPanelController());
// @override
Future<bool> loadData([bool isloadMoreAction = false]) async {
bool isSuccess = false;
var res = await _dynamicController.getMemberDynamic();
if (res['status']) {
addAll(res['data'].items);
}
if (res['data'].hasMore) {
isSuccess = true;
} else {
isSuccess = false;
}
return isSuccess;
}
}

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:pilipala/pages/member/archive/view.dart';
import 'package:pilipala/pages/member/dynamic/index.dart';
import 'package:pilipala/pages/member/index.dart';
import 'widgets/profile.dart';
@ -266,7 +267,7 @@ class _MemberPageState extends State<MemberPage>
controller: _tabController,
children: const [
Text('主页'),
Text('动态'),
MemberDynamicPanel(),
ArchivePanel(),
],
))