flet 0.70.0.dev6348__py3-none-any.whl → 0.70.0.dev6370__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flet might be problematic. Click here for more details.

Files changed (36) hide show
  1. flet/__init__.py +2 -0
  2. flet/controls/base_control.py +13 -10
  3. flet/controls/base_page.py +10 -2
  4. flet/controls/border.py +1 -1
  5. flet/controls/box.py +18 -16
  6. flet/controls/colors.py +5 -4
  7. flet/controls/context.py +1 -1
  8. flet/controls/control_event.py +2 -1
  9. flet/controls/core/dismissible.py +1 -5
  10. flet/controls/core/interactive_viewer.py +10 -23
  11. flet/controls/core/responsive_row.py +1 -2
  12. flet/controls/core/row.py +1 -2
  13. flet/controls/core/view.py +2 -4
  14. flet/controls/core/window.py +12 -8
  15. flet/controls/cupertino/cupertino_colors.py +8 -6
  16. flet/controls/material/app_bar.py +5 -6
  17. flet/controls/material/chip.py +4 -11
  18. flet/controls/material/circle_avatar.py +5 -6
  19. flet/controls/material/dropdown.py +11 -5
  20. flet/controls/material/dropdownm2.py +4 -5
  21. flet/controls/material/expansion_panel.py +19 -15
  22. flet/controls/material/menu_bar.py +7 -5
  23. flet/controls/material/snack_bar.py +1 -4
  24. flet/controls/material/tabs.py +7 -12
  25. flet/controls/page.py +48 -1
  26. flet/controls/services/shared_preferences.py +2 -1
  27. flet/controls/types.py +29 -3
  28. flet/pubsub/pubsub_hub.py +2 -1
  29. flet/testing/flet_test_app.py +11 -6
  30. flet/utils/pip.py +19 -14
  31. flet/version.py +1 -1
  32. {flet-0.70.0.dev6348.dist-info → flet-0.70.0.dev6370.dist-info}/METADATA +1 -1
  33. {flet-0.70.0.dev6348.dist-info → flet-0.70.0.dev6370.dist-info}/RECORD +36 -36
  34. {flet-0.70.0.dev6348.dist-info → flet-0.70.0.dev6370.dist-info}/WHEEL +0 -0
  35. {flet-0.70.0.dev6348.dist-info → flet-0.70.0.dev6370.dist-info}/entry_points.txt +0 -0
  36. {flet-0.70.0.dev6348.dist-info → flet-0.70.0.dev6370.dist-info}/top_level.txt +0 -0
flet/__init__.py CHANGED
@@ -491,6 +491,7 @@ from flet.controls.types import (
491
491
  ClipBehavior,
492
492
  ColorValue,
493
493
  CrossAxisAlignment,
494
+ DeviceOrientation,
494
495
  FloatingActionButtonLocation,
495
496
  FontWeight,
496
497
  IconDataOrControl,
@@ -658,6 +659,7 @@ __all__ = [
658
659
  "DateTimeValue",
659
660
  "DecorationImage",
660
661
  "DeviceInfo",
662
+ "DeviceOrientation",
661
663
  "DialogControl",
662
664
  "DialogTheme",
663
665
  "DismissDirection",
@@ -233,9 +233,10 @@ class BaseControl:
233
233
  def update(self) -> None:
234
234
  if hasattr(self, "_frozen"):
235
235
  raise Exception("Frozen control cannot be updated.")
236
- assert (
237
- self.page
238
- ), f"{self.__class__.__qualname__} Control must be added to the page first"
236
+ if not self.page:
237
+ raise RuntimeError(
238
+ f"{self.__class__.__qualname__} Control must be added to the page first"
239
+ )
239
240
  self.page.update(self)
240
241
 
241
242
  async def _invoke_method(
@@ -244,9 +245,10 @@ class BaseControl:
244
245
  arguments: Optional[dict[str, Any]] = None,
245
246
  timeout: Optional[float] = None,
246
247
  ) -> Any:
247
- assert (
248
- self.page
249
- ), f"{self.__class__.__qualname__} Control must be added to the page first"
248
+ if not self.page:
249
+ raise RuntimeError(
250
+ f"{self.__class__.__qualname__} Control must be added to the page first"
251
+ )
250
252
 
251
253
  return await self.page.session.invoke_method(
252
254
  self._i, method_name, arguments, timeout
@@ -282,10 +284,11 @@ class BaseControl:
282
284
 
283
285
  controls_log.debug(f"Trigger event {self}.{field_name} {e}")
284
286
 
285
- assert self.page, (
286
- "Control must be added to a page before triggering events. "
287
- "Use page.add(control) or add it to a parent control that's on a page."
288
- )
287
+ if not self.page:
288
+ raise RuntimeError(
289
+ "Control must be added to a page before triggering events. Use "
290
+ "page.add(control) or add it to a parent control that's on a page."
291
+ )
289
292
  session = self.page.session
290
293
 
291
294
  # Handle async and sync event handlers accordingly
@@ -35,6 +35,7 @@ from flet.controls.types import (
35
35
  LocaleConfiguration,
36
36
  MainAxisAlignment,
37
37
  Number,
38
+ Orientation,
38
39
  ScrollMode,
39
40
  ThemeMode,
40
41
  )
@@ -75,6 +76,11 @@ class PageMediaData:
75
76
  The number of device pixels for each logical pixel.
76
77
  """
77
78
 
79
+ orientation: Orientation
80
+ """
81
+ The orientation of the page.
82
+ """
83
+
78
84
 
79
85
  @dataclass
80
86
  class PageResizeEvent(Event["BasePage"]):
@@ -184,7 +190,7 @@ class BasePage(AdaptiveControl):
184
190
 
185
191
  on_media_change: Optional[EventHandler[PageMediaData]] = None
186
192
  """
187
- Called when `media` has changed.
193
+ Called when [`media`][(c).] has changed.
188
194
  """
189
195
 
190
196
  media: PageMediaData = field(
@@ -193,6 +199,7 @@ class BasePage(AdaptiveControl):
193
199
  view_padding=Padding.zero(),
194
200
  view_insets=Padding.zero(),
195
201
  device_pixel_ratio=0,
202
+ orientation=Orientation.PORTRAIT,
196
203
  )
197
204
  )
198
205
  """
@@ -231,7 +238,8 @@ class BasePage(AdaptiveControl):
231
238
  _dialogs: "Dialogs" = field(default_factory=lambda: Dialogs())
232
239
 
233
240
  def __default_view(self) -> View:
234
- assert len(self.views) > 0, "views list is empty."
241
+ if len(self.views) == 0:
242
+ raise RuntimeError("views list is empty.")
235
243
  return self.views[0]
236
244
 
237
245
  def update(self, *controls) -> None:
flet/controls/border.py CHANGED
@@ -68,7 +68,7 @@ class BorderSide:
68
68
  to [`BorderStyle.NONE`][flet.].
69
69
 
70
70
  Raises:
71
- AssertionError: If [`width`][(c).] is negative.
71
+ ValueError: If it is less than zero.
72
72
  """
73
73
 
74
74
  color: ColorValue = Colors.BLACK
flet/controls/box.py CHANGED
@@ -336,17 +336,17 @@ class BoxDecoration:
336
336
  """
337
337
 
338
338
  def __post_init__(self):
339
- assert (
339
+ if not (
340
340
  self.blend_mode is None
341
341
  or self.bgcolor is not None
342
342
  or self.gradient is not None
343
- ), (
344
- "blend_mode applies to the BoxDecoration's background color or gradient, "
345
- "but no color or gradient was provided"
346
- )
347
- assert not (self.shape == BoxShape.CIRCLE and self.border_radius), (
348
- "border_radius must be None when shape is BoxShape.CIRCLE"
349
- )
343
+ ):
344
+ raise ValueError(
345
+ "blend_mode applies to the BoxDecoration's background color "
346
+ "or gradient, but no color or gradient was provided"
347
+ )
348
+ if self.shape == BoxShape.CIRCLE and self.border_radius:
349
+ raise ValueError("border_radius must be None when shape is BoxShape.CIRCLE")
350
350
 
351
351
  def copy(
352
352
  self,
@@ -414,14 +414,16 @@ class BoxConstraints:
414
414
  """
415
415
 
416
416
  def __post_init__(self):
417
- assert 0 <= self.min_width <= self.max_width <= float("inf"), (
418
- "min_width and max_width must be between 0 and infinity "
419
- "and min_width must be less than or equal to max_width"
420
- )
421
- assert 0 <= self.min_height <= self.max_height <= float("inf"), (
422
- "min_height and max_height must be between 0 and infinity "
423
- "and min_height must be less than or equal to max_height"
424
- )
417
+ if not (0 <= self.min_width <= self.max_width <= float("inf")):
418
+ raise ValueError(
419
+ "min_width and max_width must be between 0 and infinity "
420
+ "and min_width must be less than or equal to max_width"
421
+ )
422
+ if not (0 <= self.min_height <= self.max_height <= float("inf")):
423
+ raise ValueError(
424
+ "min_height and max_height must be between 0 and infinity "
425
+ "and min_height must be less than or equal to max_height"
426
+ )
425
427
 
426
428
  def copy(
427
429
  self,
flet/controls/colors.py CHANGED
@@ -120,11 +120,12 @@ class Colors(str, Enum):
120
120
  'red,0.5'
121
121
 
122
122
  Raises:
123
- AssertionError: If the opacity is not between `0` and `1` (inclusive).
123
+ ValueError: If the opacity is not between `0` and `1` (inclusive).
124
124
  """
125
- assert 0 <= opacity <= 1, (
126
- f"opacity must be between 0.0 and 1.0 inclusive, got {opacity}"
127
- )
125
+ if not (0 <= opacity <= 1):
126
+ raise ValueError(
127
+ f"opacity must be between 0.0 and 1.0 inclusive, got {opacity}"
128
+ )
128
129
  color_str = color.value if isinstance(color, Enum) else color
129
130
  return f"{color_str},{opacity}"
130
131
 
flet/controls/context.py CHANGED
@@ -32,7 +32,7 @@ class Context:
32
32
  The current page.
33
33
 
34
34
  Raises:
35
- AssertionError: if property is called outside of Flet app.
35
+ RuntimeError: If the property is accessed outside a running Flet app.
36
36
  """
37
37
  page = _context_page.get()
38
38
  if page is None:
@@ -97,7 +97,8 @@ class Event(Generic[EventControlType]):
97
97
 
98
98
  @property
99
99
  def page(self) -> Union["Page", "BasePage"]:
100
- assert self.control.page
100
+ if not self.control.page:
101
+ raise RuntimeError("event control is not attached to a page")
101
102
  return self.control.page
102
103
 
103
104
  @property
@@ -70,12 +70,8 @@ class Dismissible(LayoutControl, AdaptiveControl):
70
70
  A control that is stacked behind the [`content`][(c).] and is
71
71
  exposed when it has been dragged up or to the left.
72
72
 
73
- Note:
74
- Can only be specified if [`background`][(c).] is also
75
- specified/visible.
76
-
77
73
  Raises:
78
- ValueError: If the [`secondary_background`][(c).] is provided and visible
74
+ ValueError: If it is provided and visible
79
75
  but the [`background`][(c).] is not provided and visible.
80
76
  """
81
77
 
@@ -58,36 +58,25 @@ class InteractiveViewer(LayoutControl):
58
58
  """
59
59
  The maximum allowed scale.
60
60
 
61
- Note:
62
- Must be greater than or equal to [`min_scale`][(c).].
63
-
64
61
  Raises:
65
- ValueError: If [`max_scale`][(c).] is not greater than `0` or is less than
62
+ ValueError: If it is not greater than `0` or is less than
66
63
  [`min_scale`][(c).].
67
- """ # noqa: E501
64
+ """
68
65
 
69
66
  min_scale: Number = 0.8
70
67
  """
71
68
  The minimum allowed scale.
72
69
 
73
- Note:
74
- Must be greater than `0` and less than or equal
75
- to [`max_scale`][(c).].
76
-
77
70
  Raises:
78
- ValueError: If [`min_scale`][(c).] is not greater than `0`.
71
+ ValueError: If it is not greater than `0` or less than [`max_scale`][(c).].
79
72
  """
80
73
 
81
74
  interaction_end_friction_coefficient: Number = 0.0000135
82
75
  """
83
76
  Changes the deceleration behavior after a gesture.
84
77
 
85
- Note:
86
- Must be greater than `0`.
87
-
88
78
  Raises:
89
- ValueError: If [`interaction_end_friction_coefficient`][(c).] is not greater
90
- than `0`.
79
+ ValueError: If it is less than or equal to `0`.
91
80
  """
92
81
 
93
82
  scale_factor: Number = 200
@@ -97,22 +86,23 @@ class InteractiveViewer(LayoutControl):
97
86
 
98
87
  clip_behavior: ClipBehavior = ClipBehavior.HARD_EDGE
99
88
  """
100
- How to clip the `content`.
89
+ Defines how to clip the [`content`][(c).].
101
90
  """
102
91
 
103
92
  alignment: Optional[Alignment] = None
104
93
  """
105
- Alignment of the `content` within.
94
+ The alignment of the [`content`][(c).] within this viewer.
106
95
  """
107
96
 
108
97
  boundary_margin: MarginValue = 0
109
98
  """
110
- A margin for the visible boundaries of the `content`.
99
+ A margin for the visible boundaries of the [`content`][(c).].
111
100
  """
112
101
 
113
102
  interaction_update_interval: int = 200
114
103
  """
115
- The interval (in milliseconds) at which the `on_interaction_update` event is fired.
104
+ The interval (in milliseconds) at which the
105
+ [`on_interaction_update`][(c).] event is fired.
116
106
  """
117
107
 
118
108
  on_interaction_start: Optional[
@@ -149,10 +139,7 @@ class InteractiveViewer(LayoutControl):
149
139
  "max_scale must be greater than or equal to min_scale, "
150
140
  f"got max_scale={self.max_scale}, min_scale={self.min_scale}"
151
141
  )
152
- if (
153
- self.interaction_end_friction_coefficient is not None
154
- and self.interaction_end_friction_coefficient <= 0
155
- ):
142
+ if self.interaction_end_friction_coefficient <= 0:
156
143
  raise ValueError(
157
144
  "interaction_end_friction_coefficient must be greater than 0, "
158
145
  f"got {self.interaction_end_friction_coefficient}"
@@ -56,8 +56,7 @@ class ResponsiveRow(LayoutControl, AdaptiveControl):
56
56
 
57
57
  Note:
58
58
  Has effect only when [`alignment`][(c).] is set to
59
- [`MainAxisAlignment.START`][flet.],
60
- [`MainAxisAlignment.END`][flet.],
59
+ [`MainAxisAlignment.START`][flet.], [`MainAxisAlignment.END`][flet.],
61
60
  or [`MainAxisAlignment.CENTER`][flet.].
62
61
  """
63
62
 
flet/controls/core/row.py CHANGED
@@ -40,8 +40,7 @@ class Row(LayoutControl, ScrollableControl, AdaptiveControl):
40
40
 
41
41
  Note:
42
42
  Has effect only when [`alignment`][(c).] is set to
43
- [`MainAxisAlignment.START`][flet.],
44
- [`MainAxisAlignment.END`][flet.],
43
+ [`MainAxisAlignment.START`][flet.], [`MainAxisAlignment.END`][flet.],
45
44
  or [`MainAxisAlignment.CENTER`][flet.].
46
45
  """
47
46
 
@@ -131,10 +131,8 @@ class View(ScrollableControl, LayoutControl):
131
131
 
132
132
  Note:
133
133
  Has effect only when [`vertical_alignment`][(c).]
134
- is set to
135
- [`MainAxisAlignment.START`][flet.],
136
- [`MainAxisAlignment.END`][flet.],
137
- or [`MainAxisAlignment.CENTER`][flet.].
134
+ is set to [`MainAxisAlignment.START`][flet.],
135
+ [`MainAxisAlignment.END`][flet.], or [`MainAxisAlignment.CENTER`][flet.].
138
136
  """
139
137
 
140
138
  padding: Optional[PaddingValue] = field(default_factory=lambda: Padding.all(10))
@@ -54,7 +54,7 @@ class Window(BaseControl):
54
54
  """
55
55
  Controls the app window.
56
56
 
57
- Note:
57
+ Limitation:
58
58
  This control is for Desktop platforms (macOS, Windows, Linux) only.
59
59
  """
60
60
 
@@ -113,8 +113,8 @@ class Window(BaseControl):
113
113
  """
114
114
  Defines the opacity of the app window.
115
115
 
116
- Note:
117
- Must be between `0.0` and `1.0`.
116
+ Raises:
117
+ ValueError: If it is not between `0.0` and `1.0` inclusive.
118
118
  """
119
119
 
120
120
  aspect_ratio: Optional[Number] = None
@@ -160,7 +160,7 @@ class Window(BaseControl):
160
160
  """
161
161
  Whether the app window can be moved.
162
162
 
163
- Note:
163
+ Limitation:
164
164
  Has effect on macOS only.
165
165
  """
166
166
 
@@ -178,7 +178,7 @@ class Window(BaseControl):
178
178
  """
179
179
  Whether the app window should always be displayed below other windows.
180
180
 
181
- Note:
181
+ Limitation:
182
182
  Has effect on Linux and Windows only.
183
183
  """
184
184
 
@@ -204,7 +204,7 @@ class Window(BaseControl):
204
204
  """
205
205
  Whether to hide the app window's title bar buttons.
206
206
 
207
- Note:
207
+ Limitation:
208
208
  Has effect on macOS only.
209
209
  """
210
210
 
@@ -246,7 +246,7 @@ class Window(BaseControl):
246
246
  """
247
247
  Sets a badge label on the app window.
248
248
 
249
- Note:
249
+ Limitation:
250
250
  Has effect on macOS only.
251
251
  """
252
252
 
@@ -256,7 +256,7 @@ class Window(BaseControl):
256
256
 
257
257
  The file should have the `.ico` extension.
258
258
 
259
- Note:
259
+ Limitation:
260
260
  Has effect on Windows only.
261
261
  """
262
262
 
@@ -275,6 +275,10 @@ class Window(BaseControl):
275
275
  def __post_init__(self, ref) -> None:
276
276
  super().__post_init__(ref)
277
277
  self._i = 2
278
+ if self.opacity < 0.0 or self.opacity > 1.0:
279
+ raise ValueError(
280
+ f"opacity must be between 0.0 and 1.0 inclusive, got {self.opacity}"
281
+ )
278
282
 
279
283
  async def wait_until_ready_to_show(self):
280
284
  """
@@ -19,7 +19,7 @@ Code to sort the members:
19
19
  ```
20
20
  s = sorted(CupertinoColors, key=lambda i: i.name)
21
21
  for i in s:
22
- print(f"{i.name} = \"{i.value}\"")
22
+ print(f'{i.name} = "{i.value}"')
23
23
  ```
24
24
  """
25
25
 
@@ -54,18 +54,20 @@ class CupertinoColors(str, Enum):
54
54
  color: The color to apply opacity to.
55
55
 
56
56
  Returns:
57
- A string representing the color with opacity, in the format `"color,opacity"`.
57
+ A string representing the color with opacity,
58
+ in the format `"color,opacity"`.
58
59
 
59
60
  Examples:
60
61
  >>> CupertinoColors.with_opacity(0.5, CupertinoColors.WHITE)
61
62
  'white,0.5'
62
63
 
63
64
  Raises:
64
- AssertionError: If the opacity is not between `0` and `1` (inclusive).
65
+ ValueError: If the opacity is not between `0` and `1` (inclusive).
65
66
  """
66
- assert 0 <= opacity <= 1, (
67
- f"opacity must be between 0.0 and 1.0 inclusive, got {opacity}"
68
- )
67
+ if not (0 <= opacity <= 1):
68
+ raise ValueError(
69
+ f"opacity must be between 0.0 and 1.0 inclusive, got {opacity}"
70
+ )
69
71
  color_str = color.value if isinstance(color, Enum) else color
70
72
  return f"{color_str},{opacity}"
71
73
 
@@ -103,7 +103,7 @@ class AppBar(AdaptiveControl):
103
103
  (when [`Theme.use_material3`][flet.] is `False`).
104
104
 
105
105
  Raises:
106
- ValueError: If [`elevation`][(c).] is negative.
106
+ ValueError: If it is less than `0.0`.
107
107
  """
108
108
 
109
109
  elevation_on_scroll: Optional[Number] = None
@@ -111,7 +111,7 @@ class AppBar(AdaptiveControl):
111
111
  The elevation to be used if this app bar has something scrolled underneath it.
112
112
 
113
113
  Raises:
114
- ValueError: If [`elevation_on_scroll`][(c).] is negative.
114
+ ValueError: If it is less than `0.0`.
115
115
  """
116
116
 
117
117
  shadow_color: Optional[ColorValue] = None
@@ -183,12 +183,11 @@ class AppBar(AdaptiveControl):
183
183
  """
184
184
  The opacity of the toolbar.
185
185
 
186
- Note:
187
- Must be in the range `0.0` (transparent) to `1.0` (fully opaque).
186
+ - `0.0`: transparent
187
+ - `1.0`: fully opaque
188
188
 
189
189
  Raises:
190
- ValueError: If [`toolbar_opacity`][(c).] is not between `0.0`
191
- and `1.0` inclusive.
190
+ ValueError: If it is not between `0.0` and `1.0` inclusive.
192
191
  """
193
192
 
194
193
  title_text_style: Optional[TextStyle] = None
@@ -168,11 +168,8 @@ class Chip(LayoutControl):
168
168
 
169
169
  Defaults to `8.0`.
170
170
 
171
- Note:
172
- Must be non-negative.
173
-
174
171
  Raises:
175
- ValueError: If [`elevation_on_click`][(c).] is negative.
172
+ ValueError: If it is less than `0.0`.
176
173
  """
177
174
 
178
175
  clip_behavior: ClipBehavior = ClipBehavior.NONE
@@ -230,12 +227,8 @@ class Chip(LayoutControl):
230
227
  """
231
228
  Called when the user clicks on this chip.
232
229
 
233
- Note:
234
- Cannot be specified together with [`on_select`][(c).].
235
-
236
230
  Raises:
237
- ValueError: If both [`on_click`][(c).] and [`on_select`][(c).] callbacks
238
- are provided.
231
+ ValueError: If specified together with [`on_select`][(c).].
239
232
  """
240
233
 
241
234
  on_delete: Optional[ControlEventHandler["Chip"]] = None
@@ -249,8 +242,8 @@ class Chip(LayoutControl):
249
242
 
250
243
  It internally changes [`selected`][(c).] property to the opposite value.
251
244
 
252
- Note:
253
- Cannot be specified together with [`on_click`][(c).].
245
+ Raises:
246
+ ValueError: If specified together with [`on_click`][(c).].
254
247
  """
255
248
 
256
249
  on_focus: Optional[ControlEventHandler["Chip"]] = None
@@ -79,9 +79,8 @@ class CircleAvatar(LayoutControl):
79
79
  [`max_radius`][(c).] may be specified.
80
80
 
81
81
  Raises:
82
- ValueError: If [`radius`][(c).] is negative.
83
- ValueError: If [`radius`][(c).] is set while [`min_radius`][(c).]
84
- or [`max_radius`][(c).] is provided.
82
+ ValueError: If it is less than `0.0` or if it is
83
+ provided while [`min_radius`][(c).] or [`max_radius`][(c).] is set.
85
84
  """
86
85
 
87
86
  min_radius: Optional[Number] = None
@@ -92,7 +91,7 @@ class CircleAvatar(LayoutControl):
92
91
  Defaults to `0.0`.
93
92
 
94
93
  Raises:
95
- ValueError: If [`min_radius`][(c).] is negative.
94
+ ValueError: If it is negative.
96
95
  """
97
96
 
98
97
  max_radius: Optional[Number] = None
@@ -105,8 +104,8 @@ class CircleAvatar(LayoutControl):
105
104
  If `max_radius` is specified, then [`radius`][(c).] should not be specified.
106
105
 
107
106
  Raises:
108
- ValueError: If [`max_radius`][(c).] is negative.
109
- ValueError: If [`max_radius`][(c).] is provided while [`radius`][(c).] is set.
107
+ ValueError: If it is less than `0.0` or if it is
108
+ provided while [`radius`][(c).] is set.
110
109
  """
111
110
 
112
111
  on_image_error: Optional[ControlEventHandler["CircleAvatar"]] = None
@@ -29,7 +29,7 @@ __all__ = ["Dropdown", "DropdownOption"]
29
29
  class DropdownOption(Control):
30
30
  """
31
31
  Represents an item in a dropdown. Either `key` or `text` must be specified, else an
32
- `AssertionError` will be raised.
32
+ A `ValueError` will be raised.
33
33
  """
34
34
 
35
35
  key: Optional[str] = None
@@ -247,7 +247,8 @@ class Dropdown(LayoutControl):
247
247
  """
248
248
  Text that appears below the input border.
249
249
 
250
- If non-null, the border's color animates to red and the `helper_text` is not shown.
250
+ If non-null, the border's color animates to red and the [`helper_text`][(c).] is
251
+ not shown.
251
252
  """
252
253
 
253
254
  text_size: Optional[Number] = None
@@ -291,13 +292,18 @@ class Dropdown(LayoutControl):
291
292
 
292
293
  border_width: Number = 1
293
294
  """
294
- The width of the border in virtual pixels. Set to `0` to completely remove border.
295
+ The width of the border in virtual pixels.
296
+
297
+ Tip:
298
+ Set to `0` to completely remove the border.
295
299
  """
296
300
 
297
301
  border_color: Optional[ColorValue] = None
298
302
  """
299
- Border color. Could be `transparent` to
300
- hide the border.
303
+ Border color.
304
+
305
+ Tip:
306
+ Set to [`Colors.TRANSPARENT`][flet.] to hide the border.
301
307
  """
302
308
 
303
309
  border_radius: Optional[BorderRadiusValue] = None
@@ -19,8 +19,8 @@ __all__ = ["DropdownM2", "Option"]
19
19
  @control("Option")
20
20
  class Option(Control):
21
21
  """
22
- Represents an item in a dropdown. Either `key` or `text` must be specified, else an
23
- `AssertionError` will be raised.
22
+ Represents an item in a dropdown. Either `key` or `text` must be specified, else a
23
+ `ValueError` will be raised.
24
24
  """
25
25
 
26
26
  key: Optional[str] = None
@@ -58,9 +58,8 @@ class Option(Control):
58
58
 
59
59
  def before_update(self):
60
60
  super().before_update()
61
- assert self.key is not None or self.text is not None, (
62
- "key or text must be specified"
63
- )
61
+ if self.key is None and self.text is None:
62
+ raise ValueError("key or text must be specified")
64
63
 
65
64
 
66
65
  @control("DropdownM2")
@@ -64,13 +64,12 @@ class ExpansionPanel(LayoutControl, AdaptiveControl):
64
64
 
65
65
  expanded: bool = False
66
66
  """
67
- Whether expanded(`True`) or collapsed(`False`). Defaults to `False`.
67
+ Whether expanded(`True`) or collapsed(`False`).
68
68
  """
69
69
 
70
70
  can_tap_header: bool = False
71
71
  """
72
- If `True`, tapping on the panel's `header` will expand or collapse it. Defaults to
73
- `False`.
72
+ If `True`, tapping on the panel's `header` will expand or collapse it.
74
73
  """
75
74
 
76
75
  splash_color: Optional[ColorValue] = None
@@ -109,19 +108,21 @@ class ExpansionPanelList(LayoutControl):
109
108
 
110
109
  controls: list[ExpansionPanel] = field(default_factory=list)
111
110
  """
112
- A list of `ExpansionPanel`s to display inside `ExpansionPanelList`.
111
+ A list of panels to display.
113
112
  """
114
113
 
115
114
  divider_color: Optional[ColorValue] = None
116
115
  """
117
116
  The color of the divider when
118
- `ExpansionPanel.expanded` is `False`.
117
+ [`ExpansionPanel.expanded`][flet.] is `False`.
119
118
  """
120
119
 
121
120
  elevation: Number = 2
122
121
  """
123
- Defines the elevation of the children controls (`ExpansionPanel`s), while it is
124
- expanded. Default value is `2`.
122
+ Defines the elevation of the [`controls`][(c).], when expanded.
123
+
124
+ Raises:
125
+ ValueError: If it is less than zero.
125
126
  """
126
127
 
127
128
  expanded_header_padding: PaddingValue = field(
@@ -133,23 +134,26 @@ class ExpansionPanelList(LayoutControl):
133
134
 
134
135
  expand_icon_color: Optional[ColorValue] = None
135
136
  """
136
- The color of the icon. Defaults to
137
- `colors.BLACK_54` in light theme mode and `colors.WHITE_60` in dark theme mode.
137
+ The color of the icon.
138
+
139
+ Defaults to [`Colors.BLACK_54`][flet.] in light theme mode and
140
+ [`Colors.WHITE_60`][flet.] in dark theme mode.
138
141
  """
139
142
 
140
143
  spacing: Optional[Number] = None
141
144
  """
142
- The size of the gap between the `ExpansionPanel`s when expanded.
145
+ The size of the gap between the [`controls`][(c).]s when expanded.
143
146
  """
144
147
 
145
148
  on_change: Optional[ControlEventHandler["ExpansionPanelList"]] = None
146
149
  """
147
- Called when an `ExpansionPanel` is expanded or collapsed. The event's data
148
- (`e.data`), contains the index of the `ExpansionPanel` which triggered this event.
150
+ Called when an item of [`controls`][(c).] is expanded or collapsed.
151
+
152
+ The event's [`data`][flet.Event.], contains the index of the
153
+ child panel (in [`controls`][(c).]) which triggered this event.
149
154
  """
150
155
 
151
156
  def before_update(self):
152
157
  super().before_update()
153
- assert self.elevation is None or self.elevation >= 0, (
154
- "elevation cannot be negative"
155
- )
158
+ if self.elevation < 0:
159
+ raise ValueError("elevation must be greater than or equal to zero")
@@ -48,7 +48,10 @@ class MenuBar(Control):
48
48
 
49
49
  controls: list[Control] = field(default_factory=list)
50
50
  """
51
- The list of menu items that are the top level children of the `MenuBar`.
51
+ A list of top-level menu controls to display in this menu bar.
52
+
53
+ Raises:
54
+ ValueError: If none of the controls are visible.
52
55
  """
53
56
 
54
57
  clip_behavior: ClipBehavior = ClipBehavior.NONE
@@ -58,11 +61,10 @@ class MenuBar(Control):
58
61
 
59
62
  style: Optional[MenuStyle] = None
60
63
  """
61
- TBD
64
+ The menu bar style.
62
65
  """
63
66
 
64
67
  def before_update(self):
65
68
  super().before_update()
66
- assert any(c.visible for c in self.controls), (
67
- "MenuBar must have at minimum one visible control"
68
- )
69
+ if not any(c.visible for c in self.controls):
70
+ raise ValueError("MenuBar must have at minimum one visible control")
@@ -219,11 +219,8 @@ class SnackBar(DialogControl):
219
219
 
220
220
  At a value of `0.0`, the `action` will not overflow to a new line.
221
221
 
222
- Note:
223
- Must be between `0.0` and `1.0` inclusive.
224
-
225
222
  Raises:
226
- ValueError: If [`action_overflow_threshold`][(c).] is not between `0` and `1`.
223
+ ValueError: If it is not between `0.0` and `1.0` inclusive.
227
224
  """
228
225
 
229
226
  on_action: Optional[ControlEventHandler["SnackBar"]] = None
@@ -172,7 +172,7 @@ class Tabs(LayoutControl, AdaptiveControl):
172
172
  it when adding/removing tabs.
173
173
 
174
174
  Raises:
175
- ValueError: If [`length`][(c).] is negative.
175
+ ValueError: If it is negative.
176
176
  """
177
177
 
178
178
  selected_index: int = 0
@@ -191,8 +191,7 @@ class Tabs(LayoutControl, AdaptiveControl):
191
191
  use [`move_to`][(c).] directly.
192
192
 
193
193
  Raises:
194
- IndexError: If [`selected_index`][(c).] is not in the range
195
- `[-length, length - 1]`.
194
+ IndexError: If it is not in the range `[-length, length - 1]`.
196
195
  """
197
196
 
198
197
  animation_duration: DurationValue = field(
@@ -353,18 +352,14 @@ class TabBar(LayoutControl, AdaptiveControl):
353
352
  otherwise [`TabAlignment.FILL`][flet.] is used.
354
353
 
355
354
  Note:
356
- - If [`scrollable`][(c).] is `False`, then
357
- [`tab_alignment`][(c).] must be either
358
- [`TabAlignment.FILL`][flet.] or
359
- [`TabAlignment.CENTER`][flet.].
360
- - If [`scrollable`][(c).] is `True`, then
361
- [`tab_alignment`][(c).] must be
362
- [`TabAlignment.START`][flet.],
363
- [`TabAlignment.START_OFFSET`][flet.]
355
+ - If [`scrollable`][(c).] is `False`, then [`tab_alignment`][(c).] must be
356
+ either [`TabAlignment.FILL`][flet.] or [`TabAlignment.CENTER`][flet.].
357
+ - If [`scrollable`][(c).] is `True`, then [`tab_alignment`][(c).] must be
358
+ [`TabAlignment.START`][flet.], [`TabAlignment.START_OFFSET`][flet.]
364
359
  or [`TabAlignment.CENTER`][flet.].
365
360
 
366
361
  Raises:
367
- ValueError: If [`tab_alignment`][(c).] is not valid for the current
362
+ ValueError: If it is not valid for the current
368
363
  [`scrollable`][(c).] configuration.
369
364
  """
370
365
 
flet/controls/page.py CHANGED
@@ -42,6 +42,7 @@ from flet.controls.device_info import (
42
42
  WebDeviceInfo,
43
43
  WindowsDeviceInfo,
44
44
  )
45
+ from flet.controls.exceptions import FletUnsupportedPlatformException
45
46
  from flet.controls.multi_view import MultiView
46
47
  from flet.controls.query_string import QueryString
47
48
  from flet.controls.ref import Ref
@@ -54,6 +55,7 @@ from flet.controls.services.url_launcher import UrlLauncher
54
55
  from flet.controls.types import (
55
56
  AppLifecycleState,
56
57
  Brightness,
58
+ DeviceOrientation,
57
59
  PagePlatform,
58
60
  Url,
59
61
  UrlTarget,
@@ -198,7 +200,7 @@ class Page(BasePage):
198
200
  Used to enable or disable the context menu that appears when the user
199
201
  right-clicks on the web page.
200
202
 
201
- Note:
203
+ Limitation:
202
204
  Web only.
203
205
  """
204
206
 
@@ -939,3 +941,48 @@ class Page(BasePage):
939
941
  return from_dict(WindowsDeviceInfo, info)
940
942
  else:
941
943
  return None
944
+
945
+ async def set_allowed_device_orientations(
946
+ self, orientations: list[DeviceOrientation]
947
+ ) -> None:
948
+ """
949
+ Constrains the allowed orientations for the app when running on a mobile device.
950
+
951
+ Args:
952
+ orientations: A list of allowed device orientations.
953
+ Set to an empty list to use the system default behavior.
954
+
955
+ Raises:
956
+ FletUnsupportedPlatformException: If the method is called
957
+ on a non-mobile platform.
958
+
959
+ Limitations:
960
+ - **Android**: On Android 16 (API 36) or later, this method won't be able to
961
+ change the orientation of **devices with a display width ≥ 600 dp**
962
+ cannot change orientation. For more details see Android 16 docs
963
+ [here](https://developer.android.com/about/versions/16/behavior-changes-16#ignore-orientation).
964
+ Also, Android limits the [orientations](https://developer.android.com/reference/android/R.attr#screenOrientation) to the following combinations:
965
+ - `[]` → `unspecified`
966
+ - `[PORTRAIT_UP]` → `portrait`
967
+ - `[LANDSCAPE_LEFT]` → `landscape`
968
+ - `[PORTRAIT_DOWN]` → `reversePortrait`
969
+ - `[PORTRAIT_UP, PORTRAIT_DOWN]` → `userPortrait`
970
+ - `[LANDSCAPE_RIGHT]` → `reverseLandscape`
971
+ - `[LANDSCAPE_LEFT, LANDSCAPE_RIGHT]` → `userLandscape`
972
+ - `[PORTRAIT_UP, LANDSCAPE_LEFT, LANDSCAPE_RIGHT]` → `user`
973
+ - `[PORTRAIT_UP, PORTRAIT_DOWN, LANDSCAPE_LEFT, LANDSCAPE_RIGHT]` → `fullUser`
974
+
975
+ - **iOS**: This setting will only be respected on iPad if multitasking is disabled.
976
+ You can decide to opt out of multitasking on iPad, then this will work
977
+ but your app will not support Slide Over and Split View multitasking
978
+ anymore. Should you decide to opt out of multitasking you can do this by
979
+ setting "Requires full screen" to true in the Xcode Deployment Info.
980
+ """ # noqa: E501
981
+ if not self.platform.is_mobile():
982
+ raise FletUnsupportedPlatformException(
983
+ "set_allowed_device_orientations is only supported on mobile platforms"
984
+ )
985
+ await self._invoke_method(
986
+ "set_allowed_device_orientations",
987
+ arguments={"orientations": orientations},
988
+ )
@@ -9,7 +9,8 @@ __all__ = ["SharedPreferences"]
9
9
  @control("SharedPreferences")
10
10
  class SharedPreferences(Service):
11
11
  async def set(self, key: str, value: Any) -> bool:
12
- assert value is not None
12
+ if value is None:
13
+ raise ValueError("value can't be None")
13
14
  return await self._invoke_method("set", {"key": key, "value": value})
14
15
 
15
16
  async def get(self, key: str):
flet/controls/types.py CHANGED
@@ -544,17 +544,43 @@ class Brightness(Enum):
544
544
 
545
545
  class Orientation(Enum):
546
546
  """
547
- Whether in portrait or landscape.
547
+ Represents the layout orientation.
548
548
  """
549
549
 
550
550
  PORTRAIT = "portrait"
551
551
  """
552
- Taller than wide.
552
+ Orientation with greater height than width.
553
553
  """
554
554
 
555
555
  LANDSCAPE = "landscape"
556
556
  """
557
- Wider than tall.
557
+ Orientation with greater width than height.
558
+ """
559
+
560
+
561
+ class DeviceOrientation(Enum):
562
+ """
563
+ Supported physical orientations for mobile devices.
564
+ """
565
+
566
+ PORTRAIT_UP = "portraitUp"
567
+ """
568
+ Device held upright in portrait mode.
569
+ """
570
+
571
+ PORTRAIT_DOWN = "portraitDown"
572
+ """
573
+ Device held upside-down in portrait mode.
574
+ """
575
+
576
+ LANDSCAPE_LEFT = "landscapeLeft"
577
+ """
578
+ Device rotated 90° counter-clockwise (home button or primary edge on the right).
579
+ """
580
+
581
+ LANDSCAPE_RIGHT = "landscapeRight"
582
+ """
583
+ Device rotated 90° clockwise (home button or primary edge on the left).
558
584
  """
559
585
 
560
586
 
flet/pubsub/pubsub_hub.py CHANGED
@@ -147,7 +147,8 @@ class PubSubHub:
147
147
  def __send(
148
148
  self, handler: Union[Callable, Callable[..., Awaitable[Any]]], args: Iterable
149
149
  ):
150
- assert self.__loop, "PubSub event loop is not set"
150
+ if not self.__loop:
151
+ raise RuntimeError("PubSub event loop is not set")
151
152
 
152
153
  if asyncio.iscoroutinefunction(handler):
153
154
  asyncio.run_coroutine_threadsafe(handler(*args), self.__loop)
@@ -136,7 +136,8 @@ class FletTestApp:
136
136
  """
137
137
  Returns an instance of Flet's app [`Page`][flet.].
138
138
  """
139
- assert self.__page
139
+ if self.__page is None:
140
+ raise RuntimeError("page is not initialized")
140
141
  return self.__page
141
142
 
142
143
  @property
@@ -145,7 +146,8 @@ class FletTestApp:
145
146
  Returns an instance of [`Tester`][flet.testing.] class
146
147
  that programmatically interacts with page controls and the test environment.
147
148
  """
148
- assert self.__tester
149
+ if self.__tester is None:
150
+ raise RuntimeError("tester is not initialized")
149
151
  return self.__tester
150
152
 
151
153
  async def start(self):
@@ -330,10 +332,13 @@ class FletTestApp:
330
332
  name: Screenshot name - will be used as a base for a screenshot filename.
331
333
  screenshot: Screenshot contents in PNG format.
332
334
  """
333
- assert self.test_platform, (
334
- "FLET_TEST_PLATFORM must be set to test with screenshots"
335
- )
336
- assert self.__test_path, "test_path must be set to test with screenshots"
335
+ if not self.test_platform:
336
+ raise RuntimeError(
337
+ "FLET_TEST_PLATFORM environment variable must be set "
338
+ "to test with screenshots"
339
+ )
340
+ if not self.__test_path:
341
+ raise RuntimeError("test_path must be set to test with screenshots")
337
342
 
338
343
  golden_image_path = (
339
344
  Path(self.__test_path).parent
flet/utils/pip.py CHANGED
@@ -28,26 +28,30 @@ def install_flet_package(name: str):
28
28
 
29
29
  def ensure_flet_desktop_package_installed():
30
30
  try:
31
- import flet.version
32
31
  import flet_desktop.version
33
32
 
34
- assert (
35
- not flet_desktop.version.version
36
- or flet_desktop.version.version == flet.version.version
37
- )
33
+ import flet.version
34
+
35
+ if (
36
+ flet_desktop.version.version
37
+ and flet_desktop.version.version != flet.version.version
38
+ ):
39
+ raise RuntimeError("flet-desktop version mismatch")
38
40
  except:
39
41
  install_flet_package("flet-desktop")
40
42
 
41
43
 
42
44
  def ensure_flet_web_package_installed():
43
45
  try:
44
- import flet.version
45
46
  import flet_web.version
46
47
 
47
- assert (
48
- not flet_web.version.version
49
- or flet_web.version.version == flet.version.version
50
- )
48
+ import flet.version
49
+
50
+ if (
51
+ flet_web.version.version
52
+ and flet_web.version.version != flet.version.version
53
+ ):
54
+ raise RuntimeError("flet-web version mismatch")
51
55
  except:
52
56
  install_flet_package("flet-web")
53
57
 
@@ -57,9 +61,10 @@ def ensure_flet_cli_package_installed():
57
61
  import flet.version
58
62
  import flet_cli.version
59
63
 
60
- assert (
61
- not flet_cli.version.version
62
- or flet_cli.version.version == flet.version.version
63
- )
64
+ if (
65
+ flet_cli.version.version
66
+ and flet_cli.version.version != flet.version.version
67
+ ):
68
+ raise RuntimeError("flet-cli version mismatch")
64
69
  except:
65
70
  install_flet_package("flet-cli")
flet/version.py CHANGED
@@ -10,7 +10,7 @@ from flet.utils import is_mobile, is_windows, which
10
10
  DEFAULT_VERSION = "0.1.0"
11
11
 
12
12
  # will be replaced by CI
13
- version = "0.70.0.dev6348"
13
+ version = "0.70.0.dev6370"
14
14
 
15
15
 
16
16
  def update_version():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.70.0.dev6348
3
+ Version: 0.70.0.dev6370
4
4
  Summary: Flet for Python - easily build interactive multi-platform apps in Python
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -1,7 +1,7 @@
1
- flet/__init__.py,sha256=rj0DuM9ZNrzkM-TpQ35iIspYLzsrxOCwkVxOHRX6oiU,26152
1
+ flet/__init__.py,sha256=39Ci10DOyWcl-9adUYDbIX7eR0PHsRELpESPQZnCw9M,26200
2
2
  flet/app.py,sha256=HSws0Zm4ZO0-Hp2P9h7xirCVnRkKCVXhuekyAXT_9Fo,11883
3
3
  flet/cli.py,sha256=IUM25fY_sqMtl0hlQGhlMQaBb1oNyO0VZeeBgRodhuA,204
4
- flet/version.py,sha256=62NHkDMCuuXOPOn4bH5uVv_TOt88P483IlIpVb7LeZA,2512
4
+ flet/version.py,sha256=G79_e0GaEWAHubI5qUf3Oswkoj0--Y3hrdFTF03GxoM,2512
5
5
  flet/auth/__init__.py,sha256=eDqmi0Ki8Resd198S7XxgYa2R14wnNqIXnYhBLPl8fQ,289
6
6
  flet/auth/authorization.py,sha256=hP_36RiRPtSwmK_Yp6MMzAjQdDxbBiEcZ2yFNqyNiRs,357
7
7
  flet/auth/authorization_service.py,sha256=6N2LvisSt7KI_VgfyCH0OaJ6jTcmXCkAldN1yYlakzQ,6410
@@ -34,17 +34,17 @@ flet/controls/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  flet/controls/adaptive_control.py,sha256=Pw0E7z0IlNSe05cQTi5BLElLF3OnlVLzwfvtOQpsRr8,1594
35
35
  flet/controls/alignment.py,sha256=re4jnpuqNPPWs55bf8RB_c9llqcuGhZcCjdNutx2N5M,3257
36
36
  flet/controls/animation.py,sha256=C3Sxqte4S225m3UvlQOm-DGxd1WJaqfdLpA6e10B_BM,3763
37
- flet/controls/base_control.py,sha256=Pn9b6ez81iFuWZw_rRsEHQw7CEkZVL8XHChORXgenPc,10545
38
- flet/controls/base_page.py,sha256=SuuoK-XHqsTmOQZXYz84DxOibE9_43sKZulalSjIxYI,17927
37
+ flet/controls/base_control.py,sha256=MtePz5xzgVpAQQxb-wNr-roAs3Oud3G8DY__zmf1Gzg,10667
38
+ flet/controls/base_page.py,sha256=JhkaB0Fm5S4nAKLuNRpZQFbVnJcFUPmNh9fjcVulOZs,18106
39
39
  flet/controls/blur.py,sha256=taMH4qtILyAFn1qNsgBGRV3z0GSH6V7VKPV3ZSBhOL4,602
40
- flet/controls/border.py,sha256=bZS9piQD_smyHeO6r30KejYvJIThwiqcZPpAUL34Tb0,8819
40
+ flet/controls/border.py,sha256=aBxj8OzEoufGPZb5yibsg2SO2OHeBAFmti63-y_oQtY,8808
41
41
  flet/controls/border_radius.py,sha256=ePfpA_uNhR6bfBSmYxy2cO0mZ3FU1r63qX_5RuHWwDM,6605
42
- flet/controls/box.py,sha256=f9T25pJYOk-VzmzapgYHKprucTuIPMMJRphIBinrZQ4,12606
42
+ flet/controls/box.py,sha256=UAz27hMyzXtUGjgm0bTtVupaEkWqUkhAeA1wR1YKoOs,12726
43
43
  flet/controls/buttons.py,sha256=0mLPx4fBjQNGn-ejMuNu1wHb38_0BGU0JOggmqbUs1E,9943
44
- flet/controls/colors.py,sha256=J5A9ZQ25xqyKkM7X1SjX3uRlBP9PCsUJoHhCdM-YNOw,15345
45
- flet/controls/context.py,sha256=xmmkrF2r4jD9ILe9lIrwtmkhvXv6awYpnwjHeqM5jFk,4239
44
+ flet/controls/colors.py,sha256=SIdze3v4ZACxVumHqD-zI8VWsS2cUU_W8ILGSYbKxfU,15379
45
+ flet/controls/context.py,sha256=5daq2ixcHNcs2pyYbH9KCe-tHCq2_ebPjvORMs1TtD4,4250
46
46
  flet/controls/control.py,sha256=12Y_b8g8iSY8FlafeYZpaeJSgZQaKNzBLUof5JW4YlU,4488
47
- flet/controls/control_event.py,sha256=wuI62LF8K42U6Ba2LK5R5YyhBtmxyTHBgZN4XfRKGRk,3107
47
+ flet/controls/control_event.py,sha256=lM3H2V388JUQj9uCbPuUD7t2GxdEwX6F2nBluPzvzBc,3182
48
48
  flet/controls/control_state.py,sha256=7Pi_WirBkE5dmUN0QnQLjSaW17Nj_escRlUvNxlrNR8,433
49
49
  flet/controls/device_info.py,sha256=fWhy73oldll9BZagLcPZG-YKi_wu6caEKCdOwP6SZXA,23465
50
50
  flet/controls/dialog_control.py,sha256=4a1poIK4al6DAsdiV56jE-Q4E-eKrvP12DqYw5HFvYM,507
@@ -62,7 +62,7 @@ flet/controls/margin.py,sha256=ni5FwkchO1LPKPTKV0Cimvh2YzABi-t5DhOqTS25eIQ,2305
62
62
  flet/controls/multi_view.py,sha256=7RbM1nt8t75qgTKyfemsV06XQ04Mer0Op409Nu9q9Vs,304
63
63
  flet/controls/object_patch.py,sha256=0OE8TswTyYH_l1yEqJPIf-Z6kLnOCCQCYiV-gNUvuSA,44111
64
64
  flet/controls/padding.py,sha256=AdxAZ5dbg1-Bo8aKeJ7AptUdyjaX7VWBIJto5mBT9Pk,2485
65
- flet/controls/page.py,sha256=vJAJo1purDrX-RFeWzsFtoHeI1ttUrXhbpQoyKrroj8,27788
65
+ flet/controls/page.py,sha256=Hkxq5mv8UEhtWra9EOA7buytW7Bae3NrlHo-UwTpqj8,30361
66
66
  flet/controls/painting.py,sha256=GCEycacejiCAdA4eZBQlTgxmE2ccXyad4Gy7VsjIwn0,12108
67
67
  flet/controls/query_string.py,sha256=HbepJ8YUjyPj12gMiJRrTpUXdlfS7XQlbRb5AGFX_sM,3577
68
68
  flet/controls/ref.py,sha256=Lde_Nlly6NEtJX_LYv_DxIDkao6w4Buo7Nus4XUPQDA,580
@@ -71,12 +71,12 @@ flet/controls/template_route.py,sha256=qP5KvFY5gazw-G9Q9bcoADlWAh-MJ_9wsIyIxjElk
71
71
  flet/controls/text_style.py,sha256=WC8uPdfps5PyZ64cdPBnWhC2HULK39Uah5V368JdVoI,9386
72
72
  flet/controls/theme.py,sha256=jed561Y3ENTgp1aHB6z5djzJdZdmazaDjfMy1acpWuI,97055
73
73
  flet/controls/transform.py,sha256=gZQGM5nhfiapvm25uxvswbTWu0qQM3oBGRVxSTDhGYY,2782
74
- flet/controls/types.py,sha256=f4rUZ36Ul5FID2ZTgamPXAT7wZTfJl4Lbam9dpANtvI,25574
74
+ flet/controls/types.py,sha256=t9yWNzzJMI-o9Ji4Ia59OdFonNiKwQoj2WGP7qhjHbI,26194
75
75
  flet/controls/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  flet/controls/core/animated_switcher.py,sha256=6aYrxH_3wc-9YSdS-6BqKR6F75sBzykbi2ttnqeglr4,1873
77
77
  flet/controls/core/autofill_group.py,sha256=RqaO3dJo6eXnHmIeIg-NnEEeTq6-PlkhIlwscngVz4A,3709
78
78
  flet/controls/core/column.py,sha256=Xjxa1JAVBB4PyZzQ8UwLwggW1oGYfGbiObr07JSgS8A,2425
79
- flet/controls/core/dismissible.py,sha256=BLHxUftho32A2fbTAKlP7N5WVyd5HYizXhAVnvorHnE,5577
79
+ flet/controls/core/dismissible.py,sha256=g9aU73tilvloZBvRTr7Q7WAmIn4zBEX8T2B0Jo-nXho,5445
80
80
  flet/controls/core/drag_target.py,sha256=VtvBFtMrQgN8ErdF4QfVVMVms-ZhwXQwhgO5nQeDAEg,2832
81
81
  flet/controls/core/draggable.py,sha256=tmY5muNn84JvFYMPuQlJ61dOj7bgpoCD8pYnVXlt5JE,3859
82
82
  flet/controls/core/flet_app.py,sha256=5WvbgRiktRxAMRKiZ667o1Yt7ozfuSM811yTE6D2rfA,1116
@@ -84,7 +84,7 @@ flet/controls/core/gesture_detector.py,sha256=dcSzIiIjD7QOPVGcKDdW2MxvCdtla8M_yH
84
84
  flet/controls/core/grid_view.py,sha256=s9otiOfKffHMg6u7REN6bQt9j7ykl9GIbWBZIhaYmFg,3760
85
85
  flet/controls/core/icon.py,sha256=LVjdByVXnVjR_vxb_kJT2BMqiF7vgvp0OR-iV9LTw30,4115
86
86
  flet/controls/core/image.py,sha256=Qbooag88pvfqUq-hzf6C-Q1awib_bT3_cOeEAGhyjDA,5455
87
- flet/controls/core/interactive_viewer.py,sha256=xiS6UMOzTHed7xAnOr3D0Yi-Msv40wR_ugudRayi2lg,4897
87
+ flet/controls/core/interactive_viewer.py,sha256=t76mVE29Us9wNCccZBM-RyMrHsmubumnvLf5HYxwxGk,4580
88
88
  flet/controls/core/keyboard_listener.py,sha256=Rml7c7pHNzTyBiSbW15cUXwhr5YddTrSo98z2tzWhaI,2527
89
89
  flet/controls/core/list_view.py,sha256=zyWHHG8Tpr4VYztQFWA_mRipLXKO6bVJ-Ra1Gso4qp4,3273
90
90
  flet/controls/core/markdown.py,sha256=m6CE398R7uNpvNzxtRH3lS13It5-SBg79WvMToNidLo,11075
@@ -92,8 +92,8 @@ flet/controls/core/merge_semantics.py,sha256=o2olHjIDU-QNKAc8JHdQABiZUKeR4dWJApO
92
92
  flet/controls/core/pagelet.py,sha256=VCcPOtlqfL-A0vnDKsUkVdKZkveFVvk5sK_8oWsESpU,4163
93
93
  flet/controls/core/placeholder.py,sha256=XqqP1QmjlboezVKIrwZHA4FCcl06cptqxvYQs7kVkB8,992
94
94
  flet/controls/core/reorderable_draggable.py,sha256=BOIV_-qxFQZEcbZ1gHXplDlhbqqo3gVd2zsKFY9iBLE,1038
95
- flet/controls/core/responsive_row.py,sha256=Ij02f54UuB2qPUfJ3Y6l-W06nZQcZnEuY3ef3mn44EI,2382
96
- flet/controls/core/row.py,sha256=u_mWESVQv9Q9zV19Rzag0eMA5TCugh7mRNZFGvTwPeA,2167
95
+ flet/controls/core/responsive_row.py,sha256=IQUwUn1lHGlDaso0Bevna4LVpdOxwu60pKS9TaX-gy0,2374
96
+ flet/controls/core/row.py,sha256=riNdAC15kB7zQdSf4NRizLuNfiHF6YxT837iLNyK58U,2159
97
97
  flet/controls/core/safe_area.py,sha256=Yf2ZWmZpGZ_xpNw16xozbc99KTXXmyXGYo-gPlC9b84,2252
98
98
  flet/controls/core/screenshot.py,sha256=6X3f6rYaX7PHkvWM7gpFlyhA2xzt-M15ax-Nfd45n1g,1110
99
99
  flet/controls/core/semantics.py,sha256=tiRTyFMYYNIcj8kuiopZMPGxeo_n4L7eCchHcywColI,7413
@@ -102,8 +102,8 @@ flet/controls/core/stack.py,sha256=JqCIXFcDxd4C7dhJik0qwOu7IoHRmkj7BpvF6LhM03k,1
102
102
  flet/controls/core/text.py,sha256=jKl-j9Zzoj0nuxIbj-wRj4re6VLSvygvsqTwAIiMKqg,8903
103
103
  flet/controls/core/text_span.py,sha256=-f60CaJ6H31_f6JcYLEogiwe14Lw_HdvCAccRRsANP8,2939
104
104
  flet/controls/core/transparent_pointer.py,sha256=BGDFuDWyDUIYOmwaEgMMks6OWS_lVjZObAw2M-3r2bQ,963
105
- flet/controls/core/view.py,sha256=WuXwdjKtMwhzy1foPJa5kPsrwnpti_b85g8w_ldhOeQ,5031
106
- flet/controls/core/window.py,sha256=7SbbEoprqCoO_xz9-tHppOMYj0m9nJwDi3tRlnuVSoo,7157
105
+ flet/controls/core/view.py,sha256=J0C7VNl-qSyNlVMyCaesFFmuBFFskz9kS3-QsxqI2hc,5015
106
+ flet/controls/core/window.py,sha256=_WhYjRL46YjMY0Uy41bwps3d0iy1AP5JZL_aFgCCfv0,7404
107
107
  flet/controls/core/window_drag_area.py,sha256=fH0fczp-LUN9n3XgL85tEsQzVH1F_OoWjYwq6gSIS1E,1834
108
108
  flet/controls/core/canvas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  flet/controls/core/canvas/arc.py,sha256=pgZ6e2yhzx2cAbb3zBnlhwtuJR_YEyVTjo_11GAra_Q,1772
@@ -129,7 +129,7 @@ flet/controls/cupertino/cupertino_app_bar.py,sha256=CxhgW5Z_tohnyn7WkGxes9aN_KBD
129
129
  flet/controls/cupertino/cupertino_bottom_sheet.py,sha256=o8154fJuBtJUSJtqJFrjE6tEBv1ylNtgDW8qn6vwSxs,938
130
130
  flet/controls/cupertino/cupertino_button.py,sha256=0k8kVgbA7O1yEOf_t1eokKIamoQ6niahsh-IMXjVhvU,4560
131
131
  flet/controls/cupertino/cupertino_checkbox.py,sha256=NsCpe6UxRx7c_s-tbC1th1Jsw_2Y-wSF_ohS5uCwzJU,4719
132
- flet/controls/cupertino/cupertino_colors.py,sha256=nbkvUsvt4hN1Z5Ay5tqX24pX56qFfPK2qB1DSnrEuvw,5106
132
+ flet/controls/cupertino/cupertino_colors.py,sha256=9F3EEruUZW8RYDZcrbkX2OssLP3aSwXguNq6P8mUokg,5154
133
133
  flet/controls/cupertino/cupertino_context_menu.py,sha256=TbKXLcmvm4dNVyUO0X5vH_dq2gQBpqZdhtrcpffwU1s,1503
134
134
  flet/controls/cupertino/cupertino_context_menu_action.py,sha256=JaY38NA_S8tI2VAodlB4M2xRFXeeM9Sn4BqboDMG3HE,1427
135
135
  flet/controls/cupertino/cupertino_date_picker.py,sha256=5Qczw4_oYox_jJoBDJlohOCizb3u5GYduSYY9zVnkk0,8456
@@ -149,7 +149,7 @@ flet/controls/cupertino/cupertino_timer_picker.py,sha256=BNS2W8hUfiozKpiUZueo1h4
149
149
  flet/controls/cupertino/cupertino_tinted_button.py,sha256=SmLukUZWYU_c2roz81a1hY7x6KLYr3RaP2TKyLxVIXM,375
150
150
  flet/controls/material/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  flet/controls/material/alert_dialog.py,sha256=_6D1a0iBDNImmExHjXzpxyGOnEA0DLk2Cj_Akl_uXio,7822
152
- flet/controls/material/app_bar.py,sha256=Ol2UNCcUGi8HLmIdaxGQtIr-CM5HSD2iKIPg6Za1iOk,6703
152
+ flet/controls/material/app_bar.py,sha256=hEaZLSSKcJc5WQ7BcIPhB0m5_C9CnBVOkiYiMYQsJRY,6605
153
153
  flet/controls/material/auto_complete.py,sha256=MVesy4fUvLvY0pw_BDQXpRB5o9ac1Ci7icTdG4nC5oM,1856
154
154
  flet/controls/material/badge.py,sha256=gWkDrqoZMIrjEreWeTaANlnzJn394Gj4vQZikuVAEIk,3365
155
155
  flet/controls/material/banner.py,sha256=gFj9oNpPMNiAMnFNWkZiUdgGcE6T72VVVw73BeIRMvU,4512
@@ -158,17 +158,17 @@ flet/controls/material/bottom_sheet.py,sha256=TRa6RgPiz3PLnmVHnJHXp3CW2pkZbx_RQ4
158
158
  flet/controls/material/button.py,sha256=8_CLLvjPO9ZXsaGkJhO1a3cVbG2Abe-40cEQcT9BPpY,4189
159
159
  flet/controls/material/card.py,sha256=kR87buDfX_mSTOlj4HRicq2hDfIRPyigIdLlxa5Q7Fw,2872
160
160
  flet/controls/material/checkbox.py,sha256=FUa77no8mpDI7p7wIQebiyu7ul69aMMDkychkoTxo2I,5851
161
- flet/controls/material/chip.py,sha256=ksFGi9S32nPkOCEWbuYWOA-kx5UuabO6T2KaW_dwGA4,7978
162
- flet/controls/material/circle_avatar.py,sha256=_TY50hrMJoN70X35yEznfRzSFrfdQY3J6JIWM98T7ws,4335
161
+ flet/controls/material/chip.py,sha256=mR64l9UWC2OehmWChvLFhn5c1cXVLcISQJdXqi-lvAk,7812
162
+ flet/controls/material/circle_avatar.py,sha256=_m2vjE-RYtfwOb57P-QkxHBOpyWpkGZ7AX7Mnk61JjM,4243
163
163
  flet/controls/material/container.py,sha256=quw_KEu7N5tbEFK7EuX39OQ4Idd0i4qa4Nu6HIeS440,6875
164
164
  flet/controls/material/datatable.py,sha256=Rx937BudxdgModJeXImX9uXtrQAuVCiXujVmRKgkLnc,18354
165
165
  flet/controls/material/date_picker.py,sha256=JCuU3-BcwFkb8KHQdcRQm0Scfdur7FGiMXElUX4WSxU,5336
166
166
  flet/controls/material/date_range_picker.py,sha256=7KJKE78bQYLJRdsTKgNu9JZbmyu3xh8xQUbrgwN5HwY,5350
167
167
  flet/controls/material/divider.py,sha256=Y7T5FYz8X0xHb137QiNMXNRwXRFEWsxLHa8P0DD0k3U,3182
168
- flet/controls/material/dropdown.py,sha256=OqisJ0GxPTtHfOEvPTPtF_nCKpNfKNhx3YRegTFYzbA,10094
169
- flet/controls/material/dropdownm2.py,sha256=WBg4EEtCDuKRiZGXbrBTudPR0SrF2ApVQR0r0IhwIdA,5689
168
+ flet/controls/material/dropdown.py,sha256=OswSZaxdSosDL5qgfb_3kFJaBZpTLSxr6R-ZS1JbfAQ,10154
169
+ flet/controls/material/dropdownm2.py,sha256=tl_YXIQFbg0824JgOUEiOUDb4z4CYFM7cpV4IbVrlyE,5679
170
170
  flet/controls/material/elevated_button.py,sha256=AjrLkxn1ViwGE7ms8aNlNTgaR1-qIFhN8aU254Hx9Vc,274
171
- flet/controls/material/expansion_panel.py,sha256=8h7WwE8TtKcWmbBwlwWJLtjNz3LKz4T7HthnsIApWp0,4287
171
+ flet/controls/material/expansion_panel.py,sha256=hIPBDCT3Gq7oI2UlgqjhUHjCQWvvwjjfhjRU79DFoSs,4276
172
172
  flet/controls/material/expansion_tile.py,sha256=sEAXoc7-FkjFUEIgM5pK3LVKIpjsTxI2BSedKvC9GSU,5744
173
173
  flet/controls/material/filled_button.py,sha256=ZtCy47Yrv2B1RyDk1pszVKiUj-YtMcLI7koTf5Bz0Mo,452
174
174
  flet/controls/material/filled_tonal_button.py,sha256=t9zXaMvakzmHUWtPfJK1ORAd8P3O5XCPi098PYAiOCU,574
@@ -177,7 +177,7 @@ flet/controls/material/form_field_control.py,sha256=8T3wrdfJ3j9Npz_A90TjJSFOzuVu
177
177
  flet/controls/material/icon_button.py,sha256=ZmOmOtk7fv1B2gWOvf0yTvwxxRdI7UDl5YsNLsEzLNA,7788
178
178
  flet/controls/material/icons.py,sha256=dsBk2nwUW3SQjwpzPv8G53ILP_zCg7tJocylHQLC-RU,287261
179
179
  flet/controls/material/list_tile.py,sha256=RIBO8ibubZjnGyWV4iTw7FOhMVNJM6jImoUYumAvjfw,8061
180
- flet/controls/material/menu_bar.py,sha256=P0bn4HDtNgrfe0GzWbEH4A-oiGA-n4dFoeyvUle3HeY,2168
180
+ flet/controls/material/menu_bar.py,sha256=78RmnKy9npkdcp8QYqp4kHqXnVHaZWkRNqEURJISGZg,2250
181
181
  flet/controls/material/menu_item_button.py,sha256=ICiTw3FMCTL7maI04KggHOcuxEOEHLPxAU08D_XVVxY,2523
182
182
  flet/controls/material/navigation_bar.py,sha256=HzSiMT6P6bgkxz-d1iWxRNACMuOqnPKi2qbLBmp7BCg,4998
183
183
  flet/controls/material/navigation_drawer.py,sha256=_Wraal9cxMqyXUbDC26wMEUWlWu0pVT7V28DR-MCoQE,3794
@@ -194,10 +194,10 @@ flet/controls/material/search_bar.py,sha256=hoeZxdTG4vqCqgWlRBaJi-iGenDOpIpedHrU
194
194
  flet/controls/material/segmented_button.py,sha256=f01DPN_QbUvzGS8tEilASVI6VFQwURDZ-uy2en_0U74,5510
195
195
  flet/controls/material/selection_area.py,sha256=KYjMBMuuSKmi6sKBl0UZgZurBOeJMbgNazi-jsR1KU4,1032
196
196
  flet/controls/material/slider.py,sha256=zV0Jres_HPwP590kNe663GeML9gIx4U24W_R7BpCV6o,6952
197
- flet/controls/material/snack_bar.py,sha256=82UNnu8ta33qiYrws41K6Em1go5Vn-dkSWlR2idHQx4,7455
197
+ flet/controls/material/snack_bar.py,sha256=8X3P_TgHBAWafMzaC6NskPey2_k-JeheL29PrgxAVYc,7374
198
198
  flet/controls/material/submenu_button.py,sha256=4iQvOPTNRjNwXx3in8FWqBFKW6Mt22awwAhL8HiWd_I,2683
199
199
  flet/controls/material/switch.py,sha256=EaeAF1qDQfzmHz_uLzQTurc5vKUXXYuCSmoKdXjmQCg,6892
200
- flet/controls/material/tabs.py,sha256=C7SHqCuQPhQA5zFr5hNbuoQ46FFTzK8E7ECcJcuyvPo,18682
200
+ flet/controls/material/tabs.py,sha256=WIGsEs6lpw3LwqWsgIAJ4a0PpWKgLVOKkZRKfarnNY4,18565
201
201
  flet/controls/material/text_button.py,sha256=Mkvz4LIl0yH1-e0ekOjPD6z8CZ5ZUIyE00zcb7sLKns,2578
202
202
  flet/controls/material/textfield.py,sha256=_JrdBKfVwwSeROm3Yh-0u2TsuovYcW7P8nQevIP7g2I,11816
203
203
  flet/controls/material/time_picker.py,sha256=_gUTaQi4N-mo1Oj_yJEsti8ToM0WhwhofbCjP5v2gzA,3070
@@ -211,7 +211,7 @@ flet/controls/services/haptic_feedback.py,sha256=JZMveq3loC3CWt3LPp87iWl6IeAzyUO
211
211
  flet/controls/services/semantics_service.py,sha256=eF_EcVqOMsgUyyZYhKTNLP-PcFTX0a8NQsQkAU-jxyk,1662
212
212
  flet/controls/services/service.py,sha256=1k3PGJxkJOub5Eb9SIjrRo2-Ik_xrmERQD0TfxjHYC0,378
213
213
  flet/controls/services/shake_detector.py,sha256=A9o5Z89lBUL7j6OhhMWv3Qna2O_ke1h3R1AFwKgmMwk,895
214
- flet/controls/services/shared_preferences.py,sha256=xCwAxSf52PL56KfObLLG8DGQvSZRLtQmKXP3nB0kdDY,949
214
+ flet/controls/services/shared_preferences.py,sha256=ec_dMBMozfAalyw1exdXd9ayDY7g08oC-oE8JkqU-PE,994
215
215
  flet/controls/services/storage_paths.py,sha256=q6ykCW33IeMhvMQKAWaXZ8HKzsfdUpHGWAC52SM2NAQ,7800
216
216
  flet/controls/services/url_launcher.py,sha256=YfvNGaivvwJ2vrSkxwgQ2R1l3A5wbgY6AxX8n2Fe02U,2735
217
217
  flet/fastapi/__init__.py,sha256=crLmmKE-B-O-cm5MTlXFreYCUnqkw6mK4eIPUUMvSCM,45
@@ -223,11 +223,11 @@ flet/messaging/session.py,sha256=RQkYkZDIKW-l9ShUvbYKPD6ZXgfD4yVz2WERgUnp_OA,123
223
223
  flet/messaging/session_store.py,sha256=80yy3fjEGJs_60UxS_o2tXl2QCenFb9IVDaJCK8wckY,557
224
224
  flet/pubsub/__init__.py,sha256=qWcHYUa7oQEKysceGCeYG2AgIe0IO18NRXiP47jb_6o,126
225
225
  flet/pubsub/pubsub_client.py,sha256=Wamm3T_md2ObOu5odN5-bPuMgt9Si8YvbYhSC2TtAIA,1245
226
- flet/pubsub/pubsub_hub.py,sha256=1loRKhFYq23E89EYPaK4RMCbFdOW2qVeTQk8JqnbNp8,6514
226
+ flet/pubsub/pubsub_hub.py,sha256=7fEHZP9vON5LKt6hzg38EcyOtfyHwyJGG3NUynNe2LQ,6546
227
227
  flet/security/__init__.py,sha256=LcBftVee6pXMB2MiDsc0PPUXnTlR2CT53VAPiPadaHI,2189
228
228
  flet/testing/__init__.py,sha256=Yb9e6h11b2hV7O3TuqsJ7zwFAgNcbB7tY7Gp2ssxtN4,176
229
229
  flet/testing/finder.py,sha256=Rqv4qwjMcVx4ZYAJgZgGT2GVH5OR4ZgoQeKj5ZsFsRc,346
230
- flet/testing/flet_test_app.py,sha256=T9SZMl1swPqhyu-BXhymVckxX0WuFbOO1AjbBJ3bE-U,16342
230
+ flet/testing/flet_test_app.py,sha256=adDF_CPo9nWXyGxllYVDRt4skq7yfNQoqI2RpFZUTcQ,16580
231
231
  flet/testing/tester.py,sha256=_DSRFQQoGISve5JR2nq3AdSbUf18E6FfG3ytRD5tAfo,4946
232
232
  flet/utils/__init__.py,sha256=LVgyCBf1VNqGXkdtf1JCP20Rx2oaPITF4nAGw2zquVI,1739
233
233
  flet/utils/browser.py,sha256=Z2PomJjClBXRRiPvGP7WRzbguvXQ8W2HQAzd_A5cmvE,157
@@ -241,13 +241,13 @@ flet/utils/locks.py,sha256=pWx3QKhIUIx_ZWCXN-30M6u0jZeuLxVCChUJE7OPQu8,219
241
241
  flet/utils/network.py,sha256=eP_ChGF3GSBhQ8JehDDdlbMBFoIPyVdHoJZ4l3RdMJ0,437
242
242
  flet/utils/object_model.py,sha256=OC0i5CXYQ4DsVsIKP4KpnYBE5hvWlPIi_SrypFPtBXw,2667
243
243
  flet/utils/once.py,sha256=SsQ2mMm6NVrfr7Cd6jhKY9zVvCS6eGm4qkKSJT63occ,347
244
- flet/utils/pip.py,sha256=_bxAFer_5VbpV8gv9ZsfW71Mhw4nmxrEKt7ZULti2c0,1605
244
+ flet/utils/pip.py,sha256=cPa4ItpVJeke1pr8HfE8w00FloHPCKoOdlQtwVHw4kk,1773
245
245
  flet/utils/platform_utils.py,sha256=U4cqV3EPi5QNYjbhfZmtk41-KMtI_P7KvVdnZzMOgJA,1927
246
246
  flet/utils/slugify.py,sha256=e-lsoDc2_dk5jQnySaHCU83AA4O6mguEgCEdk2smW2Y,466
247
247
  flet/utils/strings.py,sha256=R63_i7PdSAStCDPJ-O_WHBt3H02JQ14GSbnjLIpPTUc,178
248
248
  flet/utils/vector.py,sha256=pYZzjldBWCZbSeSkZ8VmujwcZC7VBWk1NLBPA-2th3U,3207
249
- flet-0.70.0.dev6348.dist-info/METADATA,sha256=pU5esLo0SL-Pc8IQhfQ7E7pFo5jDRJHbRzjAwpQwbEw,6109
250
- flet-0.70.0.dev6348.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
251
- flet-0.70.0.dev6348.dist-info/entry_points.txt,sha256=mbBhHNUnLHiDqR36WeJrfLJU0Y0y087-M4wagQmaQ_Y,39
252
- flet-0.70.0.dev6348.dist-info/top_level.txt,sha256=HbLrSnWJX2jZOEZAI14cGzW8Q5BbOGTtE-7knD5FDh0,5
253
- flet-0.70.0.dev6348.dist-info/RECORD,,
249
+ flet-0.70.0.dev6370.dist-info/METADATA,sha256=u9p6dNcRA2r0bUV9wWwDITiJtju60zql11_kt2JL7R4,6109
250
+ flet-0.70.0.dev6370.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
251
+ flet-0.70.0.dev6370.dist-info/entry_points.txt,sha256=mbBhHNUnLHiDqR36WeJrfLJU0Y0y087-M4wagQmaQ_Y,39
252
+ flet-0.70.0.dev6370.dist-info/top_level.txt,sha256=HbLrSnWJX2jZOEZAI14cGzW8Q5BbOGTtE-7knD5FDh0,5
253
+ flet-0.70.0.dev6370.dist-info/RECORD,,