mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-08-05 04:36:41 +00:00
made DialogPicker
content scrollable
This commit is contained in:
parent
02f60956e3
commit
cfff85a7f3
1 changed files with 47 additions and 16 deletions
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue