feat: 用户投稿

This commit is contained in:
guozhigq
2023-07-20 09:55:05 +08:00
parent 04c90830bb
commit 023e8013a5
13 changed files with 508 additions and 21 deletions

View File

@ -0,0 +1,22 @@
import 'package:get/get.dart';
import 'package:pilipala/http/member.dart';
class ArchiveController extends GetxController {
int? mid;
int pn = 1;
@override
void onInit() {
super.onInit();
mid = int.parse(Get.parameters['mid']!);
}
// 获取用户投稿
Future getMemberArchive() async {
var res = await MemberHttp.memberArchive(mid: mid, pn: pn);
if (res['status']) {
pn += 1;
}
return res;
}
}

View File

@ -0,0 +1,4 @@
library archive_panel;
export './controller.dart';
export 'index.dart';

View File

@ -0,0 +1,77 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:loading_more_list/loading_more_list.dart';
import 'package:pilipala/common/widgets/pull_to_refresh_header.dart';
import 'package:pilipala/common/widgets/video_card_h.dart';
import 'package:pilipala/models/member/archive.dart';
import 'package:pilipala/pages/member/archive/index.dart';
import 'package:pull_to_refresh_notification/pull_to_refresh_notification.dart';
class ArchivePanel extends StatefulWidget {
const ArchivePanel({super.key});
@override
State<ArchivePanel> createState() => _ArchivePanelState();
}
class _ArchivePanelState extends State<ArchivePanel>
with AutomaticKeepAliveClientMixin {
DateTime lastRefreshTime = DateTime.now();
late final LoadMoreListSource source = LoadMoreListSource();
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
return PullToRefreshNotification(
onRefresh: () async {
await Future.delayed(const Duration(seconds: 1));
return true;
},
maxDragOffset: 50,
child: GlowNotificationWidget(
Column(
children: <Widget>[
// 下拉刷新指示器
PullToRefreshContainer(
(PullToRefreshScrollNotificationInfo? info) {
return PullToRefreshHeader(info, lastRefreshTime);
},
),
const SizedBox(height: 4),
Expanded(
child: LoadingMoreList<VListItemModel>(
ListConfig<VListItemModel>(
sourceList: source,
itemBuilder:
(BuildContext c, VListItemModel item, int index) {
return VideoCardH(videoItem: item);
},
indicatorBuilder: (context, status) {
return const Center(child: Text('加载中'));
},
),
),
)
],
),
showGlowLeading: false,
),
);
}
}
class LoadMoreListSource extends LoadingMoreBase<VListItemModel> {
final ArchiveController _archiveController = Get.put(ArchiveController());
@override
Future<bool> loadData([bool isloadMoreAction = false]) {
return Future<bool>(() async {
var res = await _archiveController.getMemberArchive();
if (res['status']) {
addAll(res['data'].list.vlist);
}
return true;
});
}
}

View File

@ -1,6 +1,7 @@
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/http/member.dart';
import 'package:pilipala/models/member/archive.dart';
import 'package:pilipala/models/member/info.dart';
import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/wbi_sign.dart';
@ -13,6 +14,8 @@ class MemberController extends GetxController {
String? heroTag;
Box user = GStrorage.user;
late int ownerMid;
// 投稿列表
RxList<VListItemModel>? archiveList = [VListItemModel()].obs;
@override
void onInit() {
@ -26,14 +29,7 @@ class MemberController extends GetxController {
// 获取用户信息
Future<Map<String, dynamic>> getInfo() async {
await getMemberStat();
String params = await WbiSign().makSign({
'mid': mid,
'token': '',
'platform': 'web',
'web_location': 1550101,
});
params = '?$params';
var res = await MemberHttp.memberInfo(params: params);
var res = await MemberHttp.memberInfo(mid: mid);
if (res['status']) {
memberInfo.value = res['data'];
}

View File

@ -1,11 +1,11 @@
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:loading_more_list/loading_more_list.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/models/user/stat.dart';
import 'package:pilipala/pages/member/archive/view.dart';
import 'package:pilipala/pages/member/index.dart';
import 'package:pilipala/utils/utils.dart';
@ -19,13 +19,15 @@ class MemberPage extends StatefulWidget {
class _MemberPageState extends State<MemberPage>
with SingleTickerProviderStateMixin {
final MemberController _memberController = Get.put(MemberController());
Future? _futureBuilderFuture;
final ScrollController _extendNestCtr = ScrollController();
late TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
_tabController = TabController(length: 3, vsync: this, initialIndex: 2);
_futureBuilderFuture = _memberController.getInfo();
}
@override
@ -90,7 +92,7 @@ class _MemberPageState extends State<MemberPage>
Padding(
padding: const EdgeInsets.only(left: 18, right: 18),
child: FutureBuilder(
future: _memberController.getInfo(),
future: _futureBuilderFuture,
builder: (context, snapshot) {
if (snapshot.connectionState ==
ConnectionState.done) {
@ -264,7 +266,7 @@ class _MemberPageState extends State<MemberPage>
children: [
Text('主页'),
Text('动态'),
Text('投稿'),
ArchivePanel(),
],
))
],