fix PopupMenuText

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-12-14 14:04:00 +08:00
parent cef4beaa0c
commit bc5ce11449
3 changed files with 13 additions and 29 deletions

View File

@@ -3,9 +3,9 @@ import 'package:material_design_icons_flutter/material_design_icons_flutter.dart
typedef PopupMenuItemSelected<T> = bool Function(T value);
class PopupMenuText<T> extends StatefulWidget {
class PopupMenuText<T> extends StatelessWidget {
final String title;
final T initialValue;
final T Function() value;
final PopupMenuItemSelected<T> onSelected;
final PopupMenuItemBuilder<T> itemBuilder;
final String Function(T) getSelectTitle;
@@ -13,50 +13,34 @@ class PopupMenuText<T> 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<PopupMenuText<T>> createState() => _PopupMenuTextState();
}
class _PopupMenuTextState<T> extends State<PopupMenuText<T>> {
late T select = widget.initialValue;
@override
void didUpdateWidget(PopupMenuText<T> 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<T>(
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,