made DialogPicker content scrollable

This commit is contained in:
Vadim 2025-07-11 22:49:16 +02:00
parent 02f60956e3
commit cfff85a7f3

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/dimens.dart';
@ -24,6 +25,24 @@ class DialogPicker<T> extends StatefulWidget {
class _DialogPickerState<T> extends State<DialogPicker<T>> { class _DialogPickerState<T> extends State<DialogPicker<T>> {
late T _selected = widget.selectedValue; late T _selected = widget.selectedValue;
final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) {
final selectedIndex = widget.values.indexOf(_selected);
if (selectedIndex >= 0) {
_scrollController.jumpTo((Dimens.grid56 * selectedIndex).clamp(0, _scrollController.position.maxScrollExtent));
}
});
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -35,24 +54,36 @@ class _DialogPickerState<T> extends State<DialogPicker<T>> {
content: SizedBox( content: SizedBox(
width: double.maxFinite, width: double.maxFinite,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: widget.values children: [
.map( const Divider(),
(e) => RadioListTile( Flexible(
value: e, child: SingleChildScrollView(
groupValue: _selected, controller: _scrollController,
title: Text(widget.titleAdapter(context, e)), child: Column(
onChanged: (T? value) { crossAxisAlignment: CrossAxisAlignment.stretch,
if (value != null) { mainAxisSize: MainAxisSize.min,
setState(() { children: widget.values
_selected = value; .map(
}); (e) => RadioListTile(
} value: e,
}, groupValue: _selected,
title: Text(widget.titleAdapter(context, e)),
onChanged: (T? value) {
if (value != null) {
setState(() {
_selected = value;
});
}
},
),
)
.toList(),
), ),
) ),
.toList(), ),
const Divider(),
],
), ),
), ),
actionsPadding: Dimens.dialogActionsPadding, actionsPadding: Dimens.dialogActionsPadding,