added scroll controller in forms

This commit is contained in:
Peter Axelsson 2024-09-30 20:12:58 +00:00
parent 99b207253b
commit d323eec8ed
3 changed files with 114 additions and 108 deletions

View File

@ -16,6 +16,7 @@ class OperatingSystemSelection extends StatefulWidget {
class _OperatingSystemSelectionState extends State<OperatingSystemSelection> { class _OperatingSystemSelectionState extends State<OperatingSystemSelection> {
var term = ""; var term = "";
final focusNode = FocusNode(); final focusNode = FocusNode();
final ScrollController _scrollController = ScrollController();
@override @override
void initState() { void initState() {
@ -23,6 +24,12 @@ class _OperatingSystemSelectionState extends State<OperatingSystemSelection> {
super.initState(); super.initState();
} }
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -63,19 +70,18 @@ class _OperatingSystemSelectionState extends State<OperatingSystemSelection> {
), ),
), ),
), ),
body: SingleChildScrollView( body: Scrollbar(
child: Column( controller: _scrollController,
children: [ child: FutureBuilder(
FutureBuilder(
future: gOperatingSystems, future: gOperatingSystems,
builder: (BuildContext context, AsyncSnapshot<List> snapshot) { builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
List list = snapshot.data! List list = snapshot.data!
.where((os) => os.name.toLowerCase().contains(term.toLowerCase())) .where((os) =>
os.name.toLowerCase().contains(term.toLowerCase()))
.toList(); .toList();
return ListView.builder( return ListView.builder(
padding: const EdgeInsets.only(top: 4), controller: _scrollController,
shrinkWrap: true,
itemCount: list.length, itemCount: list.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var item = list[index]; var item = list[index];
@ -88,7 +94,6 @@ class _OperatingSystemSelectionState extends State<OperatingSystemSelection> {
height: 32, height: 32,
); );
} else { } else {
// Replace with generic icon
icon = const Icon(Icons.computer, size: 32); icon = const Icon(Icons.computer, size: 32);
} }
return Card( return Card(
@ -103,24 +108,18 @@ class _OperatingSystemSelectionState extends State<OperatingSystemSelection> {
}, },
); );
} else { } else {
return Row( return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Column( const CircularProgressIndicator(),
children: [ const SizedBox(height: 16),
const Padding(
padding: EdgeInsets.all(16.0),
child: CircularProgressIndicator()
),
Text(context.t('Loading available downloads')), Text(context.t('Loading available downloads')),
], ],
) ),
],
); );
} }
} },
),
]
), ),
), ),
); );

View File

@ -15,6 +15,7 @@ class OptionSelection extends StatefulWidget {
class _OptionSelectionState extends State<OptionSelection> { class _OptionSelectionState extends State<OptionSelection> {
var term = ""; var term = "";
final focusNode = FocusNode(); final focusNode = FocusNode();
final ScrollController _scrollController = ScrollController();
@override @override
void initState() { void initState() {
@ -22,6 +23,12 @@ class _OptionSelectionState extends State<OptionSelection> {
super.initState(); super.initState();
} }
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var list = widget.version.options var list = widget.version.options
@ -68,11 +75,10 @@ class _OptionSelectionState extends State<OptionSelection> {
), ),
), ),
), ),
body: SingleChildScrollView( body: Scrollbar(
child: Column( controller: _scrollController,
children: [ child: ListView.builder(
ListView.builder( controller: _scrollController,
shrinkWrap: true,
itemCount: list.length, itemCount: list.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var item = list[index]; var item = list[index];
@ -86,8 +92,6 @@ class _OptionSelectionState extends State<OptionSelection> {
); );
}, },
), ),
],
),
), ),
); );
} }

View File

@ -19,6 +19,7 @@ class VersionSelection extends StatefulWidget {
class _VersionSelectionState extends State<VersionSelection> { class _VersionSelectionState extends State<VersionSelection> {
var term = ""; var term = "";
final focusNode = FocusNode(); final focusNode = FocusNode();
final ScrollController _scrollController = ScrollController();
@override @override
void initState() { void initState() {
@ -26,6 +27,12 @@ class _VersionSelectionState extends State<VersionSelection> {
super.initState(); super.initState();
} }
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var list = widget.operatingSystem.versions var list = widget.operatingSystem.versions
@ -73,12 +80,11 @@ class _VersionSelectionState extends State<VersionSelection> {
), ),
), ),
), ),
body: SingleChildScrollView( body: Scrollbar(
child: Column( controller: _scrollController,
children: [ child: ListView.builder(
ListView.builder( controller: _scrollController,
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(top: 4),
shrinkWrap: true,
itemCount: list.length, itemCount: list.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var item = list[index]; var item = list[index];
@ -90,8 +96,7 @@ class _VersionSelectionState extends State<VersionSelection> {
Navigator.of(context) Navigator.of(context)
.push<Option>(MaterialPageRoute( .push<Option>(MaterialPageRoute(
fullscreenDialog: true, fullscreenDialog: true,
builder: (context) => builder: (context) => OptionSelection(list[index])))
OptionSelection(list[index])))
.then((selection) { .then((selection) {
if (selection != null) { if (selection != null) {
Navigator.of(context) Navigator.of(context)
@ -99,16 +104,14 @@ class _VersionSelectionState extends State<VersionSelection> {
} }
}); });
} else { } else {
Navigator.of(context).pop(Tuple2<Version, Option?>( Navigator.of(context).pop(
item, list[index].options[0])); Tuple2<Version, Option?>(item, list[index].options[0]));
} }
}, },
), ),
); );
}, },
), ),
],
),
), ),
); );
} }