Skip to content

Commit 293c3d3

Browse files
committed
Auto-scrollable ListView
1 parent 1e5bf3a commit 293c3d3

File tree

6 files changed

+105
-45
lines changed

6 files changed

+105
-45
lines changed

client/lib/controls/column.dart

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/widgets.dart';
2+
23
import '../models/control.dart';
34
import '../utils/alignment.dart';
45
import 'create_control.dart';
@@ -53,40 +54,34 @@ class ColumnControl extends StatelessWidget {
5354
controls.add(createControl(control, ctrl.id, disabled));
5455
}
5556

57+
Widget widget = wrap
58+
? Wrap(
59+
direction: Axis.vertical,
60+
children: controls,
61+
spacing: spacing,
62+
runSpacing: control.attrDouble("runSpacing", 10)!,
63+
alignment:
64+
parseWrapAlignment(control, "alignment", WrapAlignment.start),
65+
crossAxisAlignment: parseWrapCrossAlignment(
66+
control, "horizontalAlignment", WrapCrossAlignment.start),
67+
)
68+
: Column(
69+
mainAxisAlignment: mainAlignment,
70+
mainAxisSize: tight ? MainAxisSize.min : MainAxisSize.max,
71+
crossAxisAlignment: parseCrossAxisAlignment(
72+
control, "horizontalAlignment", CrossAxisAlignment.start),
73+
children: controls,
74+
);
75+
5676
return constrainedControl(
57-
wrapAutoScroll(
58-
wrap
59-
? Wrap(
60-
direction: Axis.vertical,
61-
children: controls,
62-
spacing: spacing,
63-
runSpacing: control.attrDouble("runSpacing", 10)!,
64-
alignment: parseWrapAlignment(
65-
control, "alignment", WrapAlignment.start),
66-
crossAxisAlignment: parseWrapCrossAlignment(control,
67-
"horizontalAlignment", WrapCrossAlignment.start),
68-
)
69-
: Column(
70-
mainAxisAlignment: mainAlignment,
71-
mainAxisSize: tight ? MainAxisSize.min : MainAxisSize.max,
72-
crossAxisAlignment: parseCrossAxisAlignment(control,
73-
"horizontalAlignment", CrossAxisAlignment.start),
74-
children: controls,
75-
),
76-
wrap: wrap,
77-
scrollMode: scrollMode),
77+
scrollMode != ScrollMode.none
78+
? ScrollableControl(
79+
child: widget,
80+
scrollDirection: wrap ? Axis.horizontal : Axis.vertical,
81+
scrollMode: scrollMode,
82+
)
83+
: widget,
7884
parent,
7985
control);
8086
}
81-
82-
Widget wrapAutoScroll(Widget child,
83-
{required bool wrap, required ScrollMode scrollMode}) {
84-
return scrollMode != ScrollMode.none
85-
? ScrollableControl(
86-
child: child,
87-
scrollDirection: wrap ? Axis.horizontal : Axis.vertical,
88-
scrollMode: scrollMode,
89-
)
90-
: child;
91-
}
9287
}

client/lib/controls/list_view.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,33 @@ class ListViewControl extends StatelessWidget {
1010
final bool parentDisabled;
1111
final List<Control> children;
1212

13-
const ListViewControl(
13+
ListViewControl(
1414
{Key? key,
1515
this.parent,
1616
required this.control,
1717
required this.children,
1818
required this.parentDisabled})
1919
: super(key: key);
2020

21+
final ScrollController _controller = ScrollController();
22+
23+
// This is what you're looking for!
24+
void _scrollDown() {
25+
_controller.animateTo(
26+
_controller.position.maxScrollExtent,
27+
duration: const Duration(seconds: 1),
28+
curve: Curves.fastOutSlowIn,
29+
);
30+
}
31+
2132
@override
2233
Widget build(BuildContext context) {
2334
debugPrint("ListViewControl build: ${control.id}");
2435

2536
bool disabled = control.isDisabled || parentDisabled;
2637

2738
final horizontal = control.attrBool("horizontal", false)!;
39+
final autoScroll = control.attrBool("autoScroll", false)!;
2840
final spacing = control.attrDouble("spacing", 0)!;
2941
final padding = parseEdgeInsets(control, "padding");
3042

@@ -43,8 +55,15 @@ class ListViewControl extends StatelessWidget {
4355
controls.add(createControl(control, ctrl.id, disabled));
4456
}
4557

58+
if (autoScroll) {
59+
WidgetsBinding.instance!.addPostFrameCallback((_) {
60+
_scrollDown();
61+
});
62+
}
63+
4664
return constrainedControl(
4765
ListView(
66+
controller: _controller,
4867
scrollDirection: horizontal ? Axis.horizontal : Axis.vertical,
4968
padding: padding,
5069
children: controls,

docs/roadmap.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
* [x] Slider
3333
* [x] Switch
3434
* Dialogs, alerts and panels
35-
* [ ] Banner
35+
* [x] Banner
3636
* [x] SnackBar
37-
* [ ] AlertDialog
37+
* [x] AlertDialog
3838

3939
* Flet Client
4040
* [ ] Web

sdk/python/flet/list_view.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(
2828
horizontal: bool = None,
2929
spacing: OptionalNumber = None,
3030
padding: PaddingValue = None,
31+
auto_scroll: bool = None,
3132
):
3233
ConstrainedControl.__init__(
3334
self,
@@ -46,6 +47,7 @@ def __init__(
4647
self.horizontal = horizontal
4748
self.spacing = spacing
4849
self.padding = padding
50+
self.auto_scroll = auto_scroll
4951

5052
def _get_control_name(self):
5153
return "listview"
@@ -96,3 +98,13 @@ def controls(self):
9698
@controls.setter
9799
def controls(self, value):
98100
self.__controls = value or []
101+
102+
# auto_scroll
103+
@property
104+
def auto_scroll(self):
105+
return self._get_attr("autoScroll")
106+
107+
@auto_scroll.setter
108+
@beartype
109+
def auto_scroll(self, value: Optional[bool]):
110+
self._set_attr("autoScroll", value)

sdk/python/playground/banner-test.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,8 @@
66
logging.basicConfig(level=logging.DEBUG)
77

88

9-
class Data:
10-
def __init__(self) -> None:
11-
self.counter = 0
12-
13-
14-
d = Data()
15-
16-
179
def main(page):
18-
page.title = "SnackBar Example"
10+
page.title = "Banner Example"
1911
page.update()
2012

2113
def close_banner(e):
@@ -42,4 +34,4 @@ def show_banner_click(e):
4234
page.add(ElevatedButton("Show Banner", on_click=show_banner_click))
4335

4436

45-
flet.app(name="test1", port=8550, target=main, view=flet.WEB_BROWSER)
37+
flet.app(name="test1", port=8550, target=main, view=flet.FLET_APP)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import json
2+
import logging
3+
from datetime import datetime
4+
from msilib.schema import Icon
5+
from time import sleep
6+
7+
from click import style
8+
9+
import flet
10+
from flet import Column, ElevatedButton, ListView, Page, Row, Text, Theme
11+
from flet.stack import Stack
12+
13+
logging.basicConfig(level=logging.DEBUG)
14+
15+
16+
def main(page: Page):
17+
page.title = "Text Examples"
18+
page.padding = 50
19+
page.spacing = 30
20+
page.vertical_alignment = "start"
21+
page.horizontal_alignment = "center"
22+
page.bgcolor = "blueGrey200"
23+
page.update()
24+
25+
lv = ListView(expand=1, spacing=10, padding=20, auto_scroll=True)
26+
27+
count = 1
28+
29+
for i in range(0, 60):
30+
lv.controls.append(Text(f"Line {count}"))
31+
count += 1
32+
33+
page.add(lv)
34+
35+
for i in range(0, 60):
36+
sleep(1)
37+
lv.controls.append(Text(f"Line {count}"))
38+
count += 1
39+
page.update()
40+
41+
42+
flet.app(name="test1", port=8550, target=main, view=flet.FLET_APP)

0 commit comments

Comments
 (0)