Files
PiliPlus/lib/pages/setting/widgets/multi_select_dialog.dart
bggRGjQaUbCoE caa58e9d7d mod: lint
mod: tweaks

opt: publish page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-05-04 14:56:56 +08:00

79 lines
2.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
class MultiSelectDialog<T> extends StatefulWidget {
final Iterable<T> initValues;
final String title;
final Map<T, String> values;
const MultiSelectDialog(
{super.key,
required this.initValues,
required this.values,
required this.title});
@override
State<MultiSelectDialog<T>> createState() => _MultiSelectDialogState<T>();
}
class _MultiSelectDialogState<T> extends State<MultiSelectDialog<T>> {
late Set<T> _tempValues;
@override
void initState() {
super.initState();
_tempValues = widget.initValues.toSet();
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return AlertDialog(
clipBehavior: Clip.hardEdge,
title: Text(widget.title),
contentPadding: const EdgeInsets.only(top: 12),
content: StatefulBuilder(builder: (context, StateSetter setState) {
return SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: widget.values.entries.map((i) {
bool isChecked = _tempValues.contains(i.key);
return CheckboxListTile(
dense: true,
value: isChecked,
controlAffinity: ListTileControlAffinity.leading,
title: Text(
i.value,
style: theme.textTheme.titleMedium!,
),
onChanged: (value) {
isChecked
? _tempValues.remove(i.key)
: _tempValues.add(i.key);
setState(() {});
},
);
}).toList(),
),
);
}),
actionsPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 12),
actions: [
TextButton(
onPressed: Get.back,
child: Text(
'取消',
style: TextStyle(
color: theme.colorScheme.outline,
),
),
),
TextButton(
onPressed: () => Get.back(result: _tempValues),
child: const Text('确定'),
),
],
);
}
}