diff --git a/lib/pages/video/post_panel/popup_menu_text.dart b/lib/pages/video/post_panel/popup_menu_text.dart index a396f899c..3d22458ef 100644 --- a/lib/pages/video/post_panel/popup_menu_text.dart +++ b/lib/pages/video/post_panel/popup_menu_text.dart @@ -3,9 +3,9 @@ import 'package:material_design_icons_flutter/material_design_icons_flutter.dart typedef PopupMenuItemSelected = bool Function(T value); -class PopupMenuText extends StatefulWidget { +class PopupMenuText extends StatelessWidget { final String title; - final T initialValue; + final T Function() value; final PopupMenuItemSelected onSelected; final PopupMenuItemBuilder itemBuilder; final String Function(T) getSelectTitle; @@ -13,50 +13,34 @@ class PopupMenuText extends StatefulWidget { const PopupMenuText({ super.key, required this.title, - required this.initialValue, + required this.value, required this.onSelected, required this.itemBuilder, required this.getSelectTitle, }); - @override - State> createState() => _PopupMenuTextState(); -} - -class _PopupMenuTextState extends State> { - late T select = widget.initialValue; - - @override - void didUpdateWidget(PopupMenuText oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.initialValue != widget.initialValue) { - select = widget.initialValue; - } - } - @override Widget build(BuildContext context) { + final select = value(); final secondary = Theme.of(context).colorScheme.secondary; return Row( mainAxisSize: MainAxisSize.min, children: [ - Text('${widget.title}: '), + Text('$title: '), PopupMenuButton( initialValue: select, onSelected: (value) { if (value == select) return; - if (!widget.onSelected(value)) { - setState(() { - select = value; - }); + if (!onSelected(value)) { + (context as Element).markNeedsBuild(); } }, - itemBuilder: widget.itemBuilder, + itemBuilder: itemBuilder, child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( - widget.getSelectTitle(select), + getSelectTitle(select), style: TextStyle( height: 1, fontSize: 14, diff --git a/lib/pages/video/post_panel/view.dart b/lib/pages/video/post_panel/view.dart index 77eaebfd7..2352432d7 100644 --- a/lib/pages/video/post_panel/view.dart +++ b/lib/pages/video/post_panel/view.dart @@ -361,7 +361,7 @@ class _PostPanelState extends State children: [ PopupMenuText( title: '分类', - initialValue: item.category, + value: () => item.category, onSelected: (e) { bool flag = false; if (item.category == SegmentType.exclusive_access || @@ -406,7 +406,7 @@ class _PostPanelState extends State ), PopupMenuText( title: '行为类别', - initialValue: item.actionType, + value: () => item.actionType, onSelected: (e) { bool flag = false; if (item.actionType == ActionType.full) { diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 7f8376e1c..666bc6173 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -2169,7 +2169,7 @@ class _PLVideoPlayerState extends State ), PopupMenuText( title: '选择画质', - initialValue: qa.code, + value: () => qa.code, onSelected: (value) { final video = videoDetailController.findVideoByQa(value); url = video.baseUrl; @@ -2189,7 +2189,7 @@ class _PLVideoPlayerState extends State ), PopupMenuText( title: 'webp预设', - initialValue: preset, + value: () => preset, onSelected: (value) { preset = value; return false;