opt model

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-06-10 15:11:40 +08:00
parent bdf3cfc750
commit 88288f4a7a
44 changed files with 266 additions and 549 deletions

View File

@@ -202,7 +202,7 @@ class Api {
// https://api.bilibili.com/x/v3/fav/folder/created/list?pn=1&ps=10&up_mid=17340771
static const String userFavFolder = '/x/v3/fav/folder/created/list';
static const String folderInfo = '/x/v3/fav/folder/info';
static const String favFolderInfo = '/x/v3/fav/folder/info';
static const String addFolder = '/x/v3/fav/folder/add';

View File

@@ -4,12 +4,11 @@ import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_article/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder_info/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/models_new/fav/fav_note/list.dart';
import 'package:PiliPlus/models_new/fav/fav_pgc/data.dart';
import 'package:PiliPlus/models_new/fav/fav_topic/data.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/space/space_fav/data.dart';
import 'package:PiliPlus/models_new/sub/sub_detail/data.dart';
import 'package:PiliPlus/utils/storage.dart' show Accounts;
@@ -353,7 +352,7 @@ class FavHttp {
}
// 收藏夹
static Future<LoadingState<FavVideoData>> userfavFolder({
static Future<LoadingState<FavFolderData>> userfavFolder({
required int pn,
required int ps,
required dynamic mid,
@@ -367,7 +366,7 @@ class FavHttp {
},
);
if (res.data['code'] == 0) {
return Success(FavVideoData.fromJson(res.data['data']));
return Success(FavFolderData.fromJson(res.data['data']));
} else {
return Error(res.data['message'] ?? '账号未登录');
}
@@ -480,26 +479,23 @@ class FavHttp {
contentType: Headers.formUrlEncodedContentType,
));
if (res.data['code'] == 0) {
return {
'status': true,
'data': FavVideoItemModel.fromJson(res.data['data'])
};
return {'status': true, 'data': FavFolderInfo.fromJson(res.data['data'])};
} else {
return {'status': false, 'msg': res.data['message']};
}
}
static Future folderInfo({
static Future favFolderInfo({
dynamic mediaId,
}) async {
var res = await Request().get(
Api.folderInfo,
Api.favFolderInfo,
queryParameters: {
'media_id': mediaId,
},
);
if (res.data['code'] == 0) {
return {'status': true, 'data': FolderInfo.fromJson(res.data['data'])};
return {'status': true, 'data': FavFolderInfo.fromJson(res.data['data'])};
} else {
return {'status': false, 'msg': res.data['message']};
}
@@ -674,7 +670,7 @@ class FavHttp {
queryParameters: {'up_mid': mid},
);
if (res.data['code'] == 0) {
return {'status': true, 'data': FavVideoData.fromJson(res.data['data'])};
return {'status': true, 'data': FavFolderData.fromJson(res.data['data'])};
} else {
return {'status': false, 'msg': res.data['message']};
}
@@ -695,7 +691,7 @@ class FavHttp {
},
);
if (res.data['code'] == 0) {
return {'status': true, 'data': FavVideoData.fromJson(res.data['data'])};
return {'status': true, 'data': FavFolderData.fromJson(res.data['data'])};
} else {
return {'status': false, 'msg': res.data['message']};
}

View File

@@ -2,22 +2,40 @@ class CntInfo {
int? collect;
int? play;
int? thumbUp;
int? thumbDown;
int? share;
int? reply;
int? danmaku;
int? coin;
int? vt;
int? playSwitch;
String? viewText1;
CntInfo({
this.collect,
this.play,
this.thumbUp,
this.thumbDown,
this.share,
this.reply,
this.danmaku,
this.coin,
this.vt,
this.playSwitch,
this.viewText1,
});
factory CntInfo.fromJson(Map<String, dynamic> json) => CntInfo(
collect: json['collect'] as int?,
play: json['play'] as int?,
thumbUp: json['thumb_up'] as int?,
thumbDown: json['thumb_down'] as int?,
share: json['share'] as int?,
reply: json['reply'] as int?,
danmaku: json['danmaku'] as int?,
coin: json['coin'] as int?,
vt: json['vt'] as int?,
playSwitch: json['play_switch'] as int?,
viewText1: json['view_text_1'] as String?,
);
}

View File

@@ -1,8 +1,8 @@
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
class FavDetailData {
FavVideoItemModel? info;
FavFolderInfo? info;
List<FavDetailItemModel>? medias;
bool? hasMore;
int? ttl;
@@ -12,7 +12,7 @@ class FavDetailData {
factory FavDetailData.fromJson(Map<String, dynamic> json) => FavDetailData(
info: json['info'] == null
? null
: FavVideoItemModel.fromJson(json['info'] as Map<String, dynamic>),
: FavFolderInfo.fromJson(json['info'] as Map<String, dynamic>),
medias: (json['medias'] as List<dynamic>?)
?.map((e) => FavDetailItemModel.fromJson(e as Map<String, dynamic>))
.toList(),

View File

@@ -1,5 +1,5 @@
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/upper.dart';
class FavDetailInfo {
int? id;
@@ -8,7 +8,7 @@ class FavDetailInfo {
int? attr;
String? title;
String? cover;
Upper? upper;
Owner? upper;
int? coverType;
CntInfo? cntInfo;
int? type;
@@ -51,7 +51,7 @@ class FavDetailInfo {
cover: json['cover'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
coverType: json['cover_type'] as int?,
cntInfo: json['cnt_info'] == null
? null

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/ogv.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/ugc.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/upper.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
class FavDetailItemModel with MultiSelectData {
@@ -12,7 +12,7 @@ class FavDetailItemModel with MultiSelectData {
String? intro;
int? page;
int? duration;
Upper? upper;
Owner? upper;
int? attr;
CntInfo? cntInfo;
String? link;
@@ -56,7 +56,7 @@ class FavDetailItemModel with MultiSelectData {
duration: json['duration'] as int?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
attr: json['attr'] as int?,
cntInfo: json['cnt_info'] == null
? null

View File

@@ -1,26 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
bool? followed;
int? vipType;
int? vipStatue;
Upper({
this.mid,
this.name,
this.face,
this.followed,
this.vipType,
this.vipStatue,
});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
followed: json['followed'] as bool?,
vipType: json['vip_type'] as int?,
vipStatue: json['vip_statue'] as int?,
);
}

View File

@@ -0,0 +1,17 @@
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
class FavFolderData {
int? count;
List<FavFolderInfo>? list;
bool? hasMore;
FavFolderData({this.count, this.list, this.hasMore});
factory FavFolderData.fromJson(Map<String, dynamic> json) => FavFolderData(
count: json['count'] as int?,
list: (json['list'] as List<dynamic>?)
?.map((e) => FavFolderInfo.fromJson(e as Map<String, dynamic>))
.toList(),
hasMore: json['has_more'] as bool?,
);
}

View File

@@ -1,21 +1,21 @@
import 'package:PiliPlus/models_new/fav/fav_video/upper.dart';
import 'package:PiliPlus/models/model_owner.dart';
class FavVideoItemModel {
int? id;
class FavFolderInfo {
int id;
int? fid;
int? mid;
int? attr;
int mid;
int attr;
String? attrDesc;
String? title;
String? cover;
Upper? upper;
String title;
String cover;
Owner? upper;
int? coverType;
String? intro;
int? ctime;
int? mtime;
int? state;
int? favState;
int? mediaCount;
int mediaCount;
int? viewCount;
int? vt;
bool? isTop;
@@ -25,14 +25,14 @@ class FavVideoItemModel {
String? link;
String? bvid;
FavVideoItemModel({
this.id,
FavFolderInfo({
this.id = 0,
this.fid,
this.mid,
this.attr,
this.mid = 0,
this.attr = -1,
this.attrDesc,
this.title,
this.cover,
this.title = '',
this.cover = '',
this.upper,
this.coverType,
this.intro,
@@ -40,7 +40,7 @@ class FavVideoItemModel {
this.mtime,
this.state,
this.favState,
this.mediaCount,
this.mediaCount = 0,
this.viewCount,
this.vt,
this.isTop,
@@ -51,25 +51,24 @@ class FavVideoItemModel {
this.bvid,
});
factory FavVideoItemModel.fromJson(Map<String, dynamic> json) =>
FavVideoItemModel(
id: json['id'] as int?,
factory FavFolderInfo.fromJson(Map<String, dynamic> json) => FavFolderInfo(
id: json['id'] as int? ?? 0,
fid: json['fid'] as int?,
mid: json['mid'] as int?,
attr: json['attr'] as int?,
mid: json['mid'] as int? ?? 0,
attr: json['attr'] as int? ?? 0,
attrDesc: json['attr_desc'] as String?,
title: json['title'] as String?,
cover: json['cover'] as String?,
title: json['title'] as String? ?? '',
cover: json['cover'] as String? ?? '',
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
coverType: json['cover_type'] as int?,
intro: json['intro'] as String?,
ctime: json['ctime'] as int?,
mtime: json['mtime'] as int?,
state: json['state'] as int?,
favState: json['fav_state'] as int?,
mediaCount: json['media_count'] as int?,
mediaCount: json['media_count'] as int? ?? 0,
viewCount: json['view_count'] as int?,
vt: json['vt'] as int?,
isTop: json['is_top'] as bool?,

View File

@@ -1,15 +0,0 @@
class CntInfo {
int? collect;
int? play;
int? thumbUp;
int? share;
CntInfo({this.collect, this.play, this.thumbUp, this.share});
factory CntInfo.fromJson(Map<String, dynamic> json) => CntInfo(
collect: json['collect'] as int?,
play: json['play'] as int?,
thumbUp: json['thumb_up'] as int?,
share: json['share'] as int?,
);
}

View File

@@ -1,69 +0,0 @@
import 'package:PiliPlus/models_new/fav/fav_folder_info/cnt_info.dart';
import 'package:PiliPlus/models_new/fav/fav_folder_info/upper.dart';
class FolderInfo {
int? id;
int? fid;
int? mid;
int? attr;
String? title;
String? cover;
Upper? upper;
int? coverType;
CntInfo? cntInfo;
int? type;
String? intro;
int? ctime;
int? mtime;
int? state;
int? favState;
int? likeState;
int? mediaCount;
bool? isTop;
FolderInfo({
this.id,
this.fid,
this.mid,
this.attr,
this.title,
this.cover,
this.upper,
this.coverType,
this.cntInfo,
this.type,
this.intro,
this.ctime,
this.mtime,
this.state,
this.favState,
this.likeState,
this.mediaCount,
this.isTop,
});
factory FolderInfo.fromJson(Map<String, dynamic> json) => FolderInfo(
id: json['id'] as int?,
fid: json['fid'] as int?,
mid: json['mid'] as int?,
attr: json['attr'] as int?,
title: json['title'] as String?,
cover: json['cover'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
coverType: json['cover_type'] as int?,
cntInfo: json['cnt_info'] == null
? null
: CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),
type: json['type'] as int?,
intro: json['intro'] as String?,
ctime: json['ctime'] as int?,
mtime: json['mtime'] as int?,
state: json['state'] as int?,
favState: json['fav_state'] as int?,
likeState: json['like_state'] as int?,
mediaCount: json['media_count'] as int?,
isTop: json['is_top'] as bool?,
);
}

View File

@@ -1,26 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
bool? followed;
int? vipType;
int? vipStatue;
Upper({
this.mid,
this.name,
this.face,
this.followed,
this.vipType,
this.vipStatue,
});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
followed: json['followed'] as bool?,
vipType: json['vip_type'] as int?,
vipStatue: json['vip_statue'] as int?,
);
}

View File

@@ -1,17 +0,0 @@
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
class FavVideoData {
int? count;
List<FavVideoItemModel>? list;
bool? hasMore;
FavVideoData({this.count, this.list, this.hasMore});
factory FavVideoData.fromJson(Map<String, dynamic> json) => FavVideoData(
count: json['count'] as int?,
list: (json['list'] as List<dynamic>?)
?.map((e) => FavVideoItemModel.fromJson(e as Map<String, dynamic>))
.toList(),
hasMore: json['has_more'] as bool?,
);
}

View File

@@ -1,15 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
String? jumpLink;
Upper({this.mid, this.name, this.face, this.jumpLink});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
jumpLink: json['jump_link'] as String?,
);
}

View File

@@ -1,41 +0,0 @@
class CntInfo {
int? collect;
int? play;
int? thumbUp;
int? thumbDown;
int? share;
int? reply;
int? danmaku;
int? coin;
int? vt;
int? playSwitch;
String? viewText1;
CntInfo({
this.collect,
this.play,
this.thumbUp,
this.thumbDown,
this.share,
this.reply,
this.danmaku,
this.coin,
this.vt,
this.playSwitch,
this.viewText1,
});
factory CntInfo.fromJson(Map<String, dynamic> json) => CntInfo(
collect: json['collect'] as int?,
play: json['play'] as int?,
thumbUp: json['thumb_up'] as int?,
thumbDown: json['thumb_down'] as int?,
share: json['share'] as int?,
reply: json['reply'] as int?,
danmaku: json['danmaku'] as int?,
coin: json['coin'] as int?,
vt: json['vt'] as int?,
playSwitch: json['play_switch'] as int?,
viewText1: json['view_text_1'] as String?,
);
}

View File

@@ -1,10 +1,10 @@
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';
import 'package:PiliPlus/models_new/media_list/badge.dart';
import 'package:PiliPlus/models_new/media_list/cnt_info.dart';
import 'package:PiliPlus/models_new/media_list/coin.dart';
import 'package:PiliPlus/models_new/media_list/ogv_info.dart';
import 'package:PiliPlus/models_new/media_list/page.dart';
import 'package:PiliPlus/models_new/media_list/rights.dart';
import 'package:PiliPlus/models_new/media_list/upper.dart';
import 'package:PiliPlus/utils/extension.dart';
class MediaListItemModel {
@@ -26,7 +26,7 @@ class MediaListItemModel {
List<Page>? pages;
String? title;
int? type;
Upper? upper;
Owner? upper;
String? link;
String? bvid;
String? shortLink;
@@ -94,7 +94,7 @@ class MediaListItemModel {
pages = (json['pages'] as List?)?.map((e) => Page.fromJson(e)).toList();
title = json['title'] as String?;
type = json['type'] as int?;
upper = json['upper'] == null ? null : Upper.fromJson(json['upper']);
upper = json['upper'] == null ? null : Owner.fromJson(json['upper']);
link = json['link'] as String?;
bvid = json['bv_id'] as String?;
shortLink = json['short_link'] as String?;

View File

@@ -1,47 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
int? followed;
int? fans;
int? vipType;
int? vipStatue;
int? vipDueDate;
int? vipPayType;
int? officialRole;
String? officialTitle;
String? officialDesc;
String? displayName;
Upper({
this.mid,
this.name,
this.face,
this.followed,
this.fans,
this.vipType,
this.vipStatue,
this.vipDueDate,
this.vipPayType,
this.officialRole,
this.officialTitle,
this.officialDesc,
this.displayName,
});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
followed: json['followed'] as int?,
fans: json['fans'] as int?,
vipType: json['vip_type'] as int?,
vipStatue: json['vip_statue'] as int?,
vipDueDate: json['vip_due_date'] as int?,
vipPayType: json['vip_pay_type'] as int?,
officialRole: json['official_role'] as int?,
officialTitle: json['official_title'] as String?,
officialDesc: json['official_desc'] as String?,
displayName: json['display_name'] as String?,
);
}

View File

@@ -1,4 +1,4 @@
import 'package:PiliPlus/models_new/space/space_fav/upper.dart';
import 'package:PiliPlus/models/model_owner.dart';
class SpaceFavItemModel {
int? id;
@@ -11,7 +11,7 @@ class SpaceFavItemModel {
String? attrDesc;
String? title;
String? cover;
Upper? upper;
Owner? upper;
int? coverType;
String? intro;
int? ctime;
@@ -71,7 +71,7 @@ class SpaceFavItemModel {
cover: json['cover'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
coverType: json['cover_type'] as int?,
intro: json['intro'] as String?,
ctime: json['ctime'] as int?,

View File

@@ -1,15 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
String? jumpLink;
Upper({this.mid, this.name, this.face, this.jumpLink});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
jumpLink: json['jump_link'] as String?,
);
}

View File

@@ -1,4 +1,4 @@
import 'package:PiliPlus/models_new/sub/sub/upper.dart';
import 'package:PiliPlus/models/model_owner.dart';
class SubItemModel {
int? id;
@@ -8,7 +8,7 @@ class SubItemModel {
String? attrDesc;
String? title;
String? cover;
Upper? upper;
Owner? upper;
int? coverType;
String? intro;
int? ctime;
@@ -61,7 +61,7 @@ class SubItemModel {
cover: json['cover'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
coverType: json['cover_type'] as int?,
intro: json['intro'] as String?,
ctime: json['ctime'] as int?,

View File

@@ -1,15 +0,0 @@
class Upper {
int? mid;
String? name;
String? face;
String? jumpLink;
Upper({this.mid, this.name, this.face, this.jumpLink});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
face: json['face'] as String?,
jumpLink: json['jump_link'] as String?,
);
}

View File

@@ -1,15 +0,0 @@
class CntInfo {
int? collect;
int? play;
int? danmaku;
int? vt;
CntInfo({this.collect, this.play, this.danmaku, this.vt});
factory CntInfo.fromJson(Map<String, dynamic> json) => CntInfo(
collect: json['collect'] as int?,
play: json['play'] as int?,
danmaku: json['danmaku'] as int?,
vt: json['vt'] as int?,
);
}

View File

@@ -1,12 +1,12 @@
import 'package:PiliPlus/models_new/sub/sub_detail/cnt_info.dart';
import 'package:PiliPlus/models_new/sub/sub_detail/upper.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';
class Info {
int? id;
int? seasonType;
String? title;
String? cover;
Upper? upper;
Owner? upper;
CntInfo? cntInfo;
int? mediaCount;
String? intro;
@@ -31,7 +31,7 @@ class Info {
cover: json['cover'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
cntInfo: json['cnt_info'] == null
? null
: CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),

View File

@@ -1,5 +1,5 @@
import 'package:PiliPlus/models_new/sub/sub_detail/cnt_info.dart';
import 'package:PiliPlus/models_new/sub/sub_detail/upper.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';
class SubDetailItemModel {
int? id;
@@ -8,7 +8,7 @@ class SubDetailItemModel {
int? duration;
int? pubtime;
String? bvid;
Upper? upper;
Owner? upper;
CntInfo? cntInfo;
int? enableVt;
String? vtDisplay;
@@ -38,7 +38,7 @@ class SubDetailItemModel {
bvid: json['bvid'] as String?,
upper: json['upper'] == null
? null
: Upper.fromJson(json['upper'] as Map<String, dynamic>),
: Owner.fromJson(json['upper'] as Map<String, dynamic>),
cntInfo: json['cnt_info'] == null
? null
: CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),

View File

@@ -1,11 +0,0 @@
class Upper {
int? mid;
String? name;
Upper({this.mid, this.name});
factory Upper.fromJson(Map<String, dynamic> json) => Upper(
mid: json['mid'] as int?,
name: json['name'] as String?,
);
}

View File

@@ -1,13 +1,12 @@
import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/services/account_service.dart';
import 'package:get/get.dart';
class FavController
extends CommonListController<FavVideoData, FavVideoItemModel> {
class FavController extends CommonListController<FavFolderData, FavFolderInfo> {
AccountService accountService = Get.find<AccountService>();
@override
@@ -26,12 +25,12 @@ class FavController
}
@override
List<FavVideoItemModel>? getDataList(FavVideoData response) {
List<FavFolderInfo>? getDataList(FavFolderData response) {
return response.list;
}
@override
bool customHandleResponse(bool isRefresh, Success<FavVideoData> response) {
bool customHandleResponse(bool isRefresh, Success<FavFolderData> response) {
if (response.response.hasMore == false) {
isEnd = true;
}
@@ -39,7 +38,7 @@ class FavController
}
@override
Future<LoadingState<FavVideoData>> customGetData() => FavHttp.userfavFolder(
Future<LoadingState<FavFolderData>> customGetData() => FavHttp.userfavFolder(
pn: page,
ps: 20,
mid: accountService.mid,

View File

@@ -3,7 +3,7 @@ import 'package:PiliPlus/common/skeleton/video_card_h.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
import 'package:PiliPlus/pages/fav/video/widgets/item.dart';
import 'package:PiliPlus/utils/grid.dart';
@@ -48,7 +48,7 @@ class _FavVideoPageState extends State<FavVideoPage>
);
}
Widget _buildBody(LoadingState<List<FavVideoItemModel>?> loadingState) {
Widget _buildBody(LoadingState<List<FavFolderInfo>?> loadingState) {
return switch (loadingState) {
Loading() => SliverGrid(
gridDelegate: Grid.videoCardHDelegate(context),

View File

@@ -1,13 +1,13 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
class FavVideoItem extends StatelessWidget {
final String heroTag;
final FavVideoItemModel item;
final FavFolderInfo item;
final VoidCallback? onTap;
final VoidCallback? onLongPress;
@@ -68,7 +68,7 @@ class FavVideoItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title!,
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
letterSpacing: 0.3,

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_type.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/fav/article/controller.dart';
import 'package:PiliPlus/pages/fav/topic/controller.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
@@ -60,7 +60,7 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
onPressed: () => Get.toNamed('/createFav')?.then(
(data) {
if (data != null) {
List<FavVideoItemModel>? list =
List<FavFolderInfo>? list =
_favController.loadingState.value.isSuccess
? _favController.loadingState.value.data
: null;

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models_new/fav/fav_folder_info/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_debounce/easy_throttle.dart';
@@ -40,12 +40,12 @@ class _CreateFavPageState extends State<CreateFavPage> {
void _getFolderInfo() {
_errMsg = null;
FavHttp.folderInfo(mediaId: _mediaId).then((res) {
FavHttp.favFolderInfo(mediaId: _mediaId).then((res) {
if (res['status']) {
FolderInfo data = res['data'];
_titleController.text = data.title!;
FavFolderInfo data = res['data'];
_titleController.text = data.title;
_introController.text = data.intro ?? '';
_isPublic = Utils.isPublicFav(data.attr!);
_isPublic = Utils.isPublicFav(data.attr);
_cover = data.cover;
_attr = data.attr;
} else {

View File

@@ -2,7 +2,7 @@ import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
import 'package:PiliPlus/pages/fav_sort/view.dart';
import 'package:PiliPlus/services/account_service.dart';
@@ -17,7 +17,7 @@ class FavDetailController
extends MultiSelectController<FavDetailData, FavDetailItemModel> {
late int mediaId;
late String heroTag;
final Rx<FavVideoItemModel> item = FavVideoItemModel().obs;
final Rx<FavFolderInfo> folderInfo = FavFolderInfo().obs;
final Rx<bool?> isOwner = Rx<bool?>(null);
AccountService accountService = Get.find<AccountService>();
@@ -42,7 +42,7 @@ class FavDetailController
@override
void checkIsEnd(int length) {
if (item.value.mediaCount != null && length >= item.value.mediaCount!) {
if (length >= folderInfo.value.mediaCount) {
isEnd = true;
}
}
@@ -51,7 +51,7 @@ class FavDetailController
bool customHandleResponse(bool isRefresh, Success<FavDetailData> response) {
FavDetailData data = response.response;
if (isRefresh) {
item.value = data.info ?? FavVideoItemModel();
folderInfo.value = data.info!;
isOwner.value = data.info?.mid == accountService.mid;
}
return false;
@@ -63,11 +63,12 @@ class FavDetailController
delIds: mediaId.toString(),
);
if (result['status']) {
List<FavDetailItemModel> dataList = loadingState.value.data!;
item.value.mediaCount = item.value.mediaCount! - 1;
item.refresh();
dataList.removeAt(index);
loadingState.refresh();
folderInfo
..value.mediaCount -= 1
..refresh();
loadingState
..value.data!.removeAt(index)
..refresh();
SmartDialog.showToast('取消收藏');
} else {
SmartDialog.showToast(result['msg']);
@@ -113,8 +114,9 @@ class FavDetailController
List<FavDetailItemModel> dataList = loadingState.value.data!;
List<FavDetailItemModel> remainList =
dataList.toSet().difference(list.toSet()).toList();
item.value.mediaCount = item.value.mediaCount! - list.length;
item.refresh();
folderInfo
..value.mediaCount -= list.length
..refresh();
if (remainList.isNotEmpty) {
loadingState.value = Success(remainList);
} else {
@@ -153,10 +155,10 @@ class FavDetailController
'videoItem': element,
'heroTag': Utils.makeHeroTag(element.bvid),
'sourceType': 'fav',
'mediaId': item.value.id,
'mediaId': folderInfo.value.id,
'oid': element.id,
'favTitle': item.value.title,
'count': item.value.mediaCount,
'favTitle': folderInfo.value.title,
'count': folderInfo.value.mediaCount,
'desc': true,
'isOwner': isOwner.value ?? false,
},
@@ -183,7 +185,7 @@ class FavDetailController
: await FavHttp.favFavFolder(mediaId);
if (res['status']) {
item
folderInfo
..value.favState = isFav ? 0 : 1
..refresh();
}
@@ -205,7 +207,7 @@ class FavDetailController
void onSort() {
if (loadingState.value.isSuccess &&
loadingState.value.data?.isNotEmpty == true) {
if ((item.value.mediaCount ?? 0) > 1000) {
if (folderInfo.value.mediaCount > 1000) {
SmartDialog.showToast('内容太多啦超过1000不支持排序');
return;
}

View File

@@ -9,7 +9,7 @@ import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/dynamics_repost/view.dart';
import 'package:PiliPlus/pages/fav_detail/controller.dart';
import 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart';
@@ -53,7 +53,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
child: Scaffold(
resizeToAvoidBottomInset: false,
floatingActionButton: Obx(
() => (_favDetailController.item.value.mediaCount ?? -1) > 0
() => _favDetailController.folderInfo.value.mediaCount > 0
? FloatingActionButton.extended(
onPressed: _favDetailController.toViewPlayAll,
label: const Text('播放全部'),
@@ -112,11 +112,11 @@ class _FavDetailPageState extends State<FavDetailPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_favDetailController.item.value.title ?? '',
_favDetailController.folderInfo.value.title,
style: theme.textTheme.titleMedium,
),
Text(
'${_favDetailController.item.value.mediaCount}条视频',
'${_favDetailController.folderInfo.value.mediaCount}条视频',
style: theme.textTheme.labelMedium,
)
],
@@ -128,35 +128,42 @@ class _FavDetailPageState extends State<FavDetailPage> {
);
}
List<Widget> _actions(ThemeData theme) => [
List<Widget> _actions(ThemeData theme) {
return [
IconButton(
tooltip: '搜索',
onPressed: () => Get.toNamed(
onPressed: () {
final folderInfo = _favDetailController.folderInfo.value;
Get.toNamed(
'/favSearch',
arguments: {
'type': 0,
'mediaId': int.parse(mediaId),
'title': _favDetailController.item.value.title,
'count': _favDetailController.item.value.mediaCount,
'title': folderInfo.title,
'count': folderInfo.mediaCount,
'isOwner': _favDetailController.isOwner.value ?? false,
},
),
);
},
icon: const Icon(Icons.search_outlined),
),
Obx(
() => _favDetailController.item.value.attr == null ||
!Utils.isPublicFav(_favDetailController.item.value.attr!)
Obx(() {
final attr = _favDetailController.folderInfo.value.attr;
return attr == -1 || !Utils.isPublicFav(attr)
? const SizedBox.shrink()
: IconButton(
iconSize: 22,
tooltip: '分享',
onPressed: () => Utils.shareText(
'https://www.bilibili.com/medialist/detail/ml${_favDetailController.mediaId}'),
icon: const Icon(Icons.share),
),
),
);
}),
PopupMenuButton(
icon: const Icon(Icons.more_vert),
itemBuilder: (context) => [
itemBuilder: (context) {
final folderInfo = _favDetailController.folderInfo.value;
return [
if (_favDetailController.isOwner.value == true) ...[
PopupMenuItem(
onTap: _favDetailController.onSort,
@@ -167,20 +174,19 @@ class _FavDetailPageState extends State<FavDetailPage> {
'/createFav',
parameters: {'mediaId': mediaId},
)?.then((res) {
if (res is FavVideoItemModel) {
_favDetailController.item.value = res;
if (res is FavFolderInfo) {
_favDetailController.folderInfo.value = res;
}
}),
child: const Text('编辑信息'),
),
] else
PopupMenuItem(
onTap: () => _favDetailController
.onFav(_favDetailController.item.value.favState == 1),
child: Text(
'${_favDetailController.item.value.favState == 1 ? '取消' : ''}收藏'),
onTap: () =>
_favDetailController.onFav(folderInfo.favState == 1),
child: Text('${folderInfo.favState == 1 ? '取消' : ''}收藏'),
),
if (Utils.isPublicFav(_favDetailController.item.value.attr ?? 0))
if (Utils.isPublicFav(folderInfo.attr))
PopupMenuItem(
onTap: () => showModalBottomSheet(
context: context,
@@ -189,9 +195,9 @@ class _FavDetailPageState extends State<FavDetailPage> {
builder: (context) => RepostPanel(
rid: _favDetailController.mediaId,
dynType: 4300,
pic: _favDetailController.item.value.cover,
title: _favDetailController.item.value.title,
uname: _favDetailController.item.value.upper?.name,
pic: folderInfo.cover,
title: folderInfo.title,
uname: folderInfo.upper?.name,
),
),
child: const Text('分享至动态'),
@@ -201,8 +207,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
onTap: _favDetailController.cleanFav,
child: const Text('清除失效内容'),
),
if (!Utils.isDefaultFav(
_favDetailController.item.value.attr)) ...[
if (!Utils.isDefaultFav(folderInfo.attr)) ...[
const PopupMenuDivider(height: 12),
PopupMenuItem(
onTap: () => showConfirmDialog(
@@ -227,10 +232,12 @@ class _FavDetailPageState extends State<FavDetailPage> {
),
],
],
],
];
},
),
const SizedBox(width: 10),
];
}
List<Widget> _selectActions(ThemeData theme) => [
TextButton(
@@ -308,7 +315,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
height: 110,
child: Obx(
() {
final item = _favDetailController.item.value;
final folderInfo = _favDetailController.folderInfo.value;
return Row(
spacing: 12,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -321,7 +328,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
child: NetworkImgLayer(
width: 176,
height: 110,
src: item.cover,
src: folderInfo.cover,
),
),
Positioned(
@@ -331,8 +338,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
if (_favDetailController.isOwner.value != false) {
return const SizedBox.shrink();
}
bool isFav =
_favDetailController.item.value.favState == 1;
bool isFav = folderInfo.favState == 1;
return iconButton(
context: context,
size: 28,
@@ -352,55 +358,49 @@ class _FavDetailPageState extends State<FavDetailPage> {
)
],
),
if (item.title != null)
if (folderInfo.title.isNotEmpty)
Expanded(
child: Column(
spacing: 4,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title!,
folderInfo.title,
style: TextStyle(
fontSize: theme.textTheme.titleMedium!.fontSize,
fontWeight: FontWeight.bold,
),
),
GestureDetector(
onTap: () =>
Get.toNamed('/member?mid=${item.upper!.mid}'),
onTap: () => Get.toNamed(
'/member?mid=${folderInfo.upper!.mid}'),
child: Text(
item.upper!.name!,
folderInfo.upper!.name!,
style: TextStyle(
color: theme.colorScheme.primary,
),
),
),
if (item.intro?.isNotEmpty == true)
if (folderInfo.intro?.isNotEmpty == true)
Text(
item.intro!,
folderInfo.intro!,
style: style,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
if (item.attr != null) ...[
Expanded(
child: Align(
alignment: Alignment.bottomLeft,
child: Text(
'${item.mediaCount}条视频 · ${Utils.isPublicFavText(item.attr)}',
'${folderInfo.mediaCount}条视频 · ${Utils.isPublicFavText(folderInfo.attr)}',
textAlign: TextAlign.end,
style: style,
),
),
),
],
],
),
)
else
SizedBox.shrink(
key: ValueKey(_favDetailController.item.value),
)
),
],
);
},
@@ -455,23 +455,26 @@ class _FavDetailPageState extends State<FavDetailPage> {
item.type!,
)
: null,
onViewFav: () => PageUtils.toVideoPage(
onViewFav: () {
final folderInfo =
_favDetailController.folderInfo.value;
PageUtils.toVideoPage(
'bvid=${item.bvid}&cid=${item.ugc?.firstCid}',
arguments: {
'videoItem': item,
'heroTag': Utils.makeHeroTag(item.bvid),
'sourceType': 'fav',
'mediaId': _favDetailController.item.value.id,
'mediaId': folderInfo.id,
'oid': item.id,
'favTitle': _favDetailController.item.value.title,
'count':
_favDetailController.item.value.mediaCount,
'favTitle': folderInfo.title,
'count': folderInfo.mediaCount,
'desc': true,
'isContinuePlaying': index != 0,
'isOwner':
_favDetailController.isOwner.value ?? false,
},
),
);
},
onTap: _favDetailController.enableMultiSelect.value
? () => _favDetailController.onSelect(index)
: null,

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
import 'package:PiliPlus/pages/fav/video/widgets/item.dart';
import 'package:flutter/material.dart';
@@ -20,8 +20,8 @@ class _FavFolderSortPageState extends State<FavFolderSortPage> {
FavController get _favController => widget.favController;
final GlobalKey _key = GlobalKey();
late List<FavVideoItemModel> sortList =
List<FavVideoItemModel>.from(_favController.loadingState.value.data!);
late List<FavFolderInfo> sortList =
List<FavFolderInfo>.from(_favController.loadingState.value.data!);
final ScrollController _scrollController = ScrollController();
@@ -34,8 +34,7 @@ class _FavFolderSortPageState extends State<FavFolderSortPage> {
_favController.onLoadMore().whenComplete(() {
try {
if (_favController.loadingState.value.isSuccess) {
List<FavVideoItemModel> list =
_favController.loadingState.value.data!;
List<FavFolderInfo> list = _favController.loadingState.value.data!;
sortList.addAll(list.sublist(sortList.length));
if (mounted) {
setState(() {});

View File

@@ -1,5 +1,5 @@
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
@@ -45,7 +45,7 @@ class _FavPanelState extends State<FavPanel> {
TextButton.icon(
onPressed: () => Get.toNamed('/createFav')?.then((data) {
if (data != null) {
(widget.ctr?.favFolderData as Rx<FavVideoData>)
(widget.ctr?.favFolderData as Rx<FavFolderData>)
..value.list?.insert(1, data)
..refresh();
}

View File

@@ -68,7 +68,7 @@ class _FavSortPageState extends State<FavSortPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('排序: ${_favDetailController.item.value.title}'),
title: Text('排序: ${_favDetailController.folderInfo.value.title}'),
actions: [
TextButton(
onPressed: () async {

View File

@@ -1,12 +1,13 @@
import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/pages/common/common_data_controller.dart';
import 'package:PiliPlus/services/account_service.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class MediaController extends CommonDataController<FavVideoData, FavVideoData> {
class MediaController
extends CommonDataController<FavFolderData, FavFolderData> {
final list = <({IconData icon, String title, VoidCallback onTap})>[
(
icon: Icons.history,
@@ -47,14 +48,14 @@ class MediaController extends CommonDataController<FavVideoData, FavVideoData> {
}
@override
bool customHandleResponse(bool isRefresh, Success<FavVideoData> response) {
bool customHandleResponse(bool isRefresh, Success<FavFolderData> response) {
count.value = response.response.count ?? -1;
loadingState.value = response;
return true;
}
@override
Future<LoadingState<FavVideoData>> customGetData() {
Future<LoadingState<FavFolderData>> customGetData() {
return FavHttp.userfavFolder(
pn: 1,
ps: 5,

View File

@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/common/common_page.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/pages/media/controller.dart';
@@ -169,7 +169,7 @@ class _MediaPageState extends CommonPageState<MediaPage, MediaController>
Loading() => const SizedBox.shrink(),
Success(:var response) => Builder(
builder: (context) {
List<FavVideoItemModel>? favFolderList = response.list;
List<FavFolderInfo>? favFolderList = response.list;
if (favFolderList.isNullOrEmpty) {
return const SizedBox.shrink();
}

View File

@@ -1,5 +1,5 @@
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -12,7 +12,7 @@ class FavFolderItem extends StatelessWidget {
required this.heroTag,
});
final FavVideoItemModel item;
final FavFolderInfo item;
final VoidCallback callback;
final String heroTag;

View File

@@ -4,7 +4,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models_new/space/space_fav/list.dart';
import 'package:PiliPlus/models_new/sub/sub/list.dart';
import 'package:PiliPlus/models_new/sub/sub/upper.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -43,11 +42,7 @@ class MemberFavItem extends StatelessWidget {
type: item.type,
title: item.title,
cover: item.cover,
upper: Upper(
mid: item.upper?.mid,
name: item.upper?.name,
face: item.upper?.face,
),
upper: item.upper,
mediaCount: item.mediaCount,
viewCount: item.viewCount,
),

View File

@@ -8,7 +8,7 @@ import 'package:get/get.dart';
class SubDetailController
extends CommonListController<SubDetailData, SubDetailItemModel> {
late SubItemModel item;
late SubItemModel subInfo;
late int id;
late String heroTag;
@@ -19,9 +19,9 @@ class SubDetailController
@override
void onInit() {
super.onInit();
item = Get.arguments;
mediaCount = (item.mediaCount ?? 0).obs;
playCount = (item.viewCount ?? 0).obs;
subInfo = Get.arguments;
mediaCount = (subInfo.mediaCount ?? 0).obs;
playCount = (subInfo.viewCount ?? 0).obs;
id = int.parse(Get.parameters['id']!);
heroTag = Get.parameters['heroTag']!;
queryData();
@@ -42,7 +42,7 @@ class SubDetailController
@override
bool customHandleResponse(bool isRefresh, Success<SubDetailData> response) {
mediaCount.value = response.response.info!.mediaCount!;
if (item.type == 11) {
if (subInfo.type == 11) {
playCount.value = response.response.info!.cntInfo!.play!;
}
return false;
@@ -50,7 +50,7 @@ class SubDetailController
@override
Future<LoadingState<SubDetailData>> customGetData() {
if (item.type == 11) {
if (subInfo.type == 11) {
return FavHttp.favResourceList(
id: id,
ps: 20,

View File

@@ -99,7 +99,7 @@ class _SubDetailPageState extends State<SubDetailPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_subDetailController.item.title!,
_subDetailController.subInfo.title!,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: theme.textTheme.titleMedium,
@@ -136,7 +136,7 @@ class _SubDetailPageState extends State<SubDetailPage> {
child: NetworkImgLayer(
width: 176,
height: 110,
src: _subDetailController.item.cover,
src: _subDetailController.subInfo.cover,
),
),
Expanded(
@@ -145,7 +145,7 @@ class _SubDetailPageState extends State<SubDetailPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_subDetailController.item.title!,
_subDetailController.subInfo.title!,
style: TextStyle(
fontSize: theme.textTheme.titleMedium!.fontSize,
fontWeight: FontWeight.bold,
@@ -154,14 +154,14 @@ class _SubDetailPageState extends State<SubDetailPage> {
GestureDetector(
onTap: () {
Get.toNamed(
'/member?mid=${_subDetailController.item.upper!.mid}',
'/member?mid=${_subDetailController.subInfo.upper!.mid}',
arguments: {
'face': _subDetailController.item.upper!.face,
'face': _subDetailController.subInfo.upper!.face,
},
);
},
child: Text(
_subDetailController.item.upper!.name!,
_subDetailController.subInfo.upper!.name!,
style: TextStyle(color: theme.colorScheme.primary),
),
),

View File

@@ -8,8 +8,8 @@ import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/pgc_lcf.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';
import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';
import 'package:PiliPlus/models_new/triple/pgc_triple.dart';
@@ -59,7 +59,7 @@ class PgcIntroController extends GetxController {
List<VideoTagItem>? videoTags;
List? favIds;
Rx<FavVideoData> favFolderData = FavVideoData().obs;
Rx<FavFolderData> favFolderData = FavFolderData().obs;
AccountService accountService = Get.find<AccountService>();
@@ -162,7 +162,7 @@ class PgcIntroController extends GetxController {
SmartDialog.showLoading(msg: '请求中');
queryVideoInFolder().then((res) async {
if (res['status']) {
int defaultFolderId = favFolderData.value.list!.first.id!;
int defaultFolderId = favFolderData.value.list!.first.id;
int favStatus = favFolderData.value.list!.first.favState!;
var result = await FavHttp.favVideo(
aid: epId,
@@ -352,10 +352,10 @@ class PgcIntroController extends GetxController {
// 选择文件夹
void onChoose(bool checkValue, int index) {
feedBack();
FavVideoItemModel item = favFolderData.value.list![index];
FavFolderInfo item = favFolderData.value.list![index];
item
..favState = checkValue ? 1 : 0
..mediaCount = checkValue ? item.mediaCount! + 1 : item.mediaCount! - 1;
..mediaCount = checkValue ? item.mediaCount + 1 : item.mediaCount - 1;
favFolderData.refresh();
}

View File

@@ -9,8 +9,8 @@ import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models_new/fav/fav_video/data.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/models_new/triple/ugc_triple.dart';
import 'package:PiliPlus/models_new/video/video_ai_conclusion/data.dart';
import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';
@@ -78,7 +78,7 @@ class VideoIntroController extends GetxController {
RxBool hasFav = false.obs;
// 是否稍后再看
RxBool hasLater = false.obs;
Rx<FavVideoData> favFolderData = FavVideoData().obs;
Rx<FavFolderData> favFolderData = FavFolderData().obs;
Set? favIds;
// 关注状态 默认未关注
RxMap followStatus = {}.obs;
@@ -387,7 +387,7 @@ class VideoIntroController extends GetxController {
SmartDialog.showLoading(msg: '请求中');
queryVideoInFolder().then((res) async {
if (res['status']) {
int defaultFolderId = favFolderData.value.list!.first.id!;
int defaultFolderId = favFolderData.value.list!.first.id;
bool notInDefFolder = favFolderData.value.list!.first.favState! == 0;
var result = await FavHttp.favVideo(
aid: IdUtils.bv2av(bvid),
@@ -565,10 +565,10 @@ class VideoIntroController extends GetxController {
// 选择文件夹
void onChoose(bool checkValue, int index) {
feedBack();
FavVideoItemModel item = favFolderData.value.list![index];
FavFolderInfo item = favFolderData.value.list![index];
item
..favState = checkValue ? 1 : 0
..mediaCount = checkValue ? item.mediaCount! + 1 : item.mediaCount! - 1;
..mediaCount = checkValue ? item.mediaCount + 1 : item.mediaCount - 1;
favFolderData.refresh();
}

View File

@@ -18,7 +18,7 @@ import 'package:PiliPlus/http/validate.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/models/login/model.dart';
import 'package:PiliPlus/models_new/fav/fav_video/list.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
import 'package:PiliPlus/pages/dynamics_tab/controller.dart';
import 'package:PiliPlus/pages/group_panel/view.dart';
@@ -346,7 +346,7 @@ class RequestUtils {
if (context.mounted &&
res['status'] &&
(res['data'].list as List?)?.isNotEmpty == true) {
List<FavVideoItemModel> list = res['data'].list;
List<FavFolderInfo> list = res['data'].list;
dynamic checkedId;
showDialog(
context: context,
@@ -360,7 +360,7 @@ class RequestUtils {
children: List.generate(list.length, (index) {
return RadioWidget(
padding: const EdgeInsets.only(left: 14),
title: list[index].title ?? '',
title: list[index].title,
groupValue: checkedId,
value: list[index].id,
onChanged: (value) {