diff --git a/lib/models/member/tags.dart b/lib/models/member/tags.dart index 3476d9eed..692e3f99c 100644 --- a/lib/models/member/tags.dart +++ b/lib/models/member/tags.dart @@ -18,9 +18,11 @@ class MemberTagItemModel { tip = json['tip']; } - MemberTagItemModel.fromCreate(({int tagid, String tagName}) res) { + MemberTagItemModel.fromCreate( + ({int tagid, String tagName}) res, { + this.count = 0, + }) { tagid = res.tagid; name = res.tagName; - count = 0; } } diff --git a/lib/pages/fav_create/view.dart b/lib/pages/fav_create/view.dart index efea2da1b..36d679bff 100644 --- a/lib/pages/fav_create/view.dart +++ b/lib/pages/fav_create/view.dart @@ -90,8 +90,10 @@ class _CreateFavPageState extends State { intro: _introController.text, ).then((res) { if (res case Success(:final response)) { - Get.back(result: response); SmartDialog.showToast('${_mediaId != null ? '编辑' : '创建'}成功'); + if (mounted) { + Get.back(result: response); + } } else { res.toast(); } diff --git a/lib/pages/fav_panel/view.dart b/lib/pages/fav_panel/view.dart index bb2fc822f..96238c5ea 100644 --- a/lib/pages/fav_panel/view.dart +++ b/lib/pages/fav_panel/view.dart @@ -27,10 +27,10 @@ class _FavPanelState extends State { @override void initState() { super.initState(); - _query(); + _queryVideoInFolder(); } - Future _query() async { + Future _queryVideoInFolder() async { final res = await widget.ctr.queryVideoInFolder(); if (mounted) { loadingState = res; @@ -39,58 +39,60 @@ class _FavPanelState extends State { } Widget get _buildBody { - late final list = widget.ctr.favFolderData.value.list!; - return switch (loadingState) { - Loading() => m3eLoading, - Success() => ListView.builder( - controller: widget.scrollController, - itemCount: list.length, - itemBuilder: (context, index) { - FavFolderInfo item = list[index]; - return Material( - type: MaterialType.transparency, - child: Builder( - builder: (context) { - void onTap() { - bool isChecked = item.favState == 1; - item - ..favState = isChecked ? 0 : 1 - ..mediaCount = isChecked - ? item.mediaCount - 1 - : item.mediaCount + 1; - (context as Element).markNeedsBuild(); - } + switch (loadingState) { + case Loading(): + return m3eLoading; + case Success(): + final list = widget.ctr.favFolderData.value.list!; + return ListView.builder( + controller: widget.scrollController, + itemCount: list.length, + itemBuilder: (context, index) { + FavFolderInfo item = list[index]; + return Material( + type: .transparency, + child: Builder( + builder: (context) { + final isChecked = item.favState == 1; - return ListTile( - onTap: onTap, - dense: true, - leading: FavUtils.isPublicFav(item.attr) - ? const Icon(Icons.folder_outlined) - : const Icon(Icons.lock_outline), - minLeadingWidth: 0, - title: Text(item.title), - subtitle: Text( - '${item.mediaCount}个内容 . ${FavUtils.isPublicFavText(item.attr)}', - ), - trailing: Transform.scale( - scale: 0.9, - child: Checkbox( - value: item.favState == 1, - onChanged: (bool? checkValue) => onTap(), + void onTap() { + item + ..favState = isChecked ? 0 : 1 + ..mediaCount += isChecked ? -1 : 1; + (context as Element).markNeedsBuild(); + } + + return ListTile( + onTap: onTap, + dense: true, + leading: FavUtils.isPublicFav(item.attr) + ? const Icon(Icons.folder_outlined) + : const Icon(Icons.lock_outline), + minLeadingWidth: 0, + title: Text(item.title), + subtitle: Text( + '${item.mediaCount}个内容 . ${FavUtils.isPublicFavText(item.attr)}', ), - ), - ); - }, - ), - ); - }, - ), - Error(:final errMsg) => scrollErrorWidget( - controller: widget.scrollController, - errMsg: errMsg, - onReload: _query, - ), - }; + trailing: Transform.scale( + scale: 0.9, + child: Checkbox( + value: isChecked, + onChanged: (bool? checkValue) => onTap(), + ), + ), + ); + }, + ), + ); + }, + ); + case Error(:final errMsg): + return scrollErrorWidget( + errMsg: errMsg, + controller: widget.scrollController, + onReload: _queryVideoInFolder, + ); + } } @override @@ -109,23 +111,23 @@ class _FavPanelState extends State { actions: [ TextButton.icon( onPressed: () => Get.toNamed('/createFav')?.then((data) { - if (data != null) { - widget.ctr.favFolderData - ..value.list?.insert(1, data) - ..refresh(); + if (data is FavFolderInfo && mounted) { + widget.ctr.favFolderData.value.list?.insert( + 1, + data + ..favState = 1 + ..mediaCount = 1, + ); + setState(() {}); } }), - icon: Icon( - Icons.add, - color: theme.primary, - ), + icon: Icon(Icons.add, color: theme.primary), label: const Text('新建收藏夹'), - style: TextButton.styleFrom( - padding: const EdgeInsets.symmetric( - horizontal: 18, - vertical: 14, + style: const ButtonStyle( + visualDensity: .compact, + padding: WidgetStatePropertyAll( + .symmetric(horizontal: 18, vertical: 14), ), - visualDensity: VisualDensity.compact, ), ), const SizedBox(width: 16), @@ -137,7 +139,7 @@ class _FavPanelState extends State { color: theme.outline.withValues(alpha: 0.1), ), Padding( - padding: EdgeInsets.only( + padding: .only( left: 20, right: 20, top: 12, @@ -145,12 +147,12 @@ class _FavPanelState extends State { ), child: Row( spacing: 25, - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: .end, children: [ FilledButton.tonal( onPressed: Get.back, style: FilledButton.styleFrom( - visualDensity: VisualDensity.compact, + visualDensity: .compact, foregroundColor: theme.outline, backgroundColor: theme.onInverseSurface, ), @@ -161,9 +163,7 @@ class _FavPanelState extends State { feedBack(); widget.ctr.actionFavVideo(); }, - style: FilledButton.styleFrom( - visualDensity: VisualDensity.compact, - ), + style: const ButtonStyle(visualDensity: .compact), child: const Text('完成'), ), ], diff --git a/lib/pages/group_panel/view.dart b/lib/pages/group_panel/view.dart index 0cd9b5f5a..8ad1d2258 100644 --- a/lib/pages/group_panel/view.dart +++ b/lib/pages/group_panel/view.dart @@ -176,7 +176,9 @@ class _GroupPanelState extends State { void _onCreateFavTag(({int tagid, String tagName}) res) { if (!mounted) return; if (loadingState case Success(:final response)) { - response.add(MemberTagItemModel.fromCreate(res)); + response.add(MemberTagItemModel.fromCreate(res, count: 1)); + tags.add(res.tagid); + showDefaultBtn.value = false; setState(() {}); } else { _queryFollowUpTags();