flet 0.82.3.dev7863__tar.gz → 0.82.3.dev7877__tar.gz

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.
Files changed (300) hide show
  1. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/PKG-INFO +9 -9
  2. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/pyproject.toml +9 -9
  3. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/context.py +22 -0
  4. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/reorderable_list_view.py +44 -14
  5. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/page.py +1 -0
  6. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/session.py +2 -1
  7. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/version.py +1 -1
  8. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/PKG-INFO +9 -9
  9. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/SOURCES.txt +2 -1
  10. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/requires.txt +8 -8
  11. flet-0.82.3.dev7877/tests/test_skip_double_update.py +137 -0
  12. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/README.md +0 -0
  13. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/setup.cfg +0 -0
  14. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/__init__.py +0 -0
  15. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/app.py +0 -0
  16. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/__init__.py +0 -0
  17. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/authorization.py +0 -0
  18. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/authorization_service.py +0 -0
  19. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/group.py +0 -0
  20. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/oauth_provider.py +0 -0
  21. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/oauth_token.py +0 -0
  22. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/providers/__init__.py +0 -0
  23. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  24. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  25. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  26. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  27. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/auth/user.py +0 -0
  28. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/canvas/__init__.py +0 -0
  29. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/cli.py +0 -0
  30. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/__init__.py +0 -0
  31. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/component.py +0 -0
  32. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/component_decorator.py +0 -0
  33. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/component_owned.py +0 -0
  34. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/__init__.py +0 -0
  35. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/hook.py +0 -0
  36. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_callback.py +0 -0
  37. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_context.py +0 -0
  38. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_effect.py +0 -0
  39. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_memo.py +0 -0
  40. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_ref.py +0 -0
  41. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_state.py +0 -0
  42. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/memo.py +0 -0
  43. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/observable.py +0 -0
  44. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/public_utils.py +0 -0
  45. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/components/utils.py +0 -0
  46. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/__init__.py +0 -0
  47. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/adaptive_control.py +0 -0
  48. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/alignment.py +0 -0
  49. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/animation.py +0 -0
  50. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/base_control.py +0 -0
  51. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/base_page.py +0 -0
  52. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/blur.py +0 -0
  53. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/border.py +0 -0
  54. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/border_radius.py +0 -0
  55. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/box.py +0 -0
  56. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/buttons.py +0 -0
  57. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/colors.py +0 -0
  58. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/control.py +0 -0
  59. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/control_event.py +0 -0
  60. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/control_state.py +0 -0
  61. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/__init__.py +0 -0
  62. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/animated_switcher.py +0 -0
  63. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/autofill_group.py +0 -0
  64. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/__init__.py +0 -0
  65. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/arc.py +0 -0
  66. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/canvas.py +0 -0
  67. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/circle.py +0 -0
  68. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/color.py +0 -0
  69. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/fill.py +0 -0
  70. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/image.py +0 -0
  71. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/line.py +0 -0
  72. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/oval.py +0 -0
  73. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/path.py +0 -0
  74. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/points.py +0 -0
  75. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/rect.py +0 -0
  76. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/shadow.py +0 -0
  77. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/shape.py +0 -0
  78. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/text.py +0 -0
  79. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/column.py +0 -0
  80. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/dismissible.py +0 -0
  81. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/drag_target.py +0 -0
  82. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/draggable.py +0 -0
  83. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/flet_app.py +0 -0
  84. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/gesture_detector.py +0 -0
  85. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/grid_view.py +0 -0
  86. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/hero.py +0 -0
  87. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/icon.py +0 -0
  88. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/image.py +0 -0
  89. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/interactive_viewer.py +0 -0
  90. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/keyboard_listener.py +0 -0
  91. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/list_view.py +0 -0
  92. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/markdown.py +0 -0
  93. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/merge_semantics.py +0 -0
  94. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/page_view.py +0 -0
  95. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/pagelet.py +0 -0
  96. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/placeholder.py +0 -0
  97. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  98. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/responsive_row.py +0 -0
  99. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/rotated_box.py +0 -0
  100. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/row.py +0 -0
  101. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/safe_area.py +0 -0
  102. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/screenshot.py +0 -0
  103. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/semantics.py +0 -0
  104. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/shader_mask.py +0 -0
  105. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/shimmer.py +0 -0
  106. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/stack.py +0 -0
  107. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/text.py +0 -0
  108. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/text_span.py +0 -0
  109. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/transparent_pointer.py +0 -0
  110. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/view.py +0 -0
  111. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/window.py +0 -0
  112. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/core/window_drag_area.py +0 -0
  113. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/__init__.py +0 -0
  114. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  115. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  116. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  117. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  118. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  119. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  120. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  121. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  122. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  123. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  124. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  125. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  126. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  127. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  128. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  129. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  130. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  131. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  132. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  133. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  134. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  135. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  136. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  137. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  138. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  139. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  140. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  141. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  142. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/device_info.py +0 -0
  143. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/dialog_control.py +0 -0
  144. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/duration.py +0 -0
  145. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/embed_json_encoder.py +0 -0
  146. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/events.py +0 -0
  147. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/exceptions.py +0 -0
  148. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/geometry.py +0 -0
  149. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/gradients.py +0 -0
  150. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/icon_data.py +0 -0
  151. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/id_counter.py +0 -0
  152. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/keys.py +0 -0
  153. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/layout_control.py +0 -0
  154. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/margin.py +0 -0
  155. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/__init__.py +0 -0
  156. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/alert_dialog.py +0 -0
  157. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/app_bar.py +0 -0
  158. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/auto_complete.py +0 -0
  159. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/badge.py +0 -0
  160. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/banner.py +0 -0
  161. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/bottom_app_bar.py +0 -0
  162. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/bottom_sheet.py +0 -0
  163. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/button.py +0 -0
  164. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/card.py +0 -0
  165. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/checkbox.py +0 -0
  166. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/chip.py +0 -0
  167. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/circle_avatar.py +0 -0
  168. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/container.py +0 -0
  169. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/context_menu.py +0 -0
  170. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/datatable.py +0 -0
  171. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/date_picker.py +0 -0
  172. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/date_range_picker.py +0 -0
  173. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/divider.py +0 -0
  174. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/dropdown.py +0 -0
  175. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/dropdownm2.py +0 -0
  176. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/elevated_button.py +0 -0
  177. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/expansion_panel.py +0 -0
  178. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/expansion_tile.py +0 -0
  179. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/filled_button.py +0 -0
  180. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/filled_tonal_button.py +0 -0
  181. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/floating_action_button.py +0 -0
  182. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/form_field_control.py +0 -0
  183. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/icon_button.py +0 -0
  184. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.json +0 -0
  185. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.py +0 -0
  186. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.pyi +0 -0
  187. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/list_tile.py +0 -0
  188. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/menu_bar.py +0 -0
  189. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/menu_item_button.py +0 -0
  190. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_bar.py +0 -0
  191. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_drawer.py +0 -0
  192. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_rail.py +0 -0
  193. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/outlined_button.py +0 -0
  194. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/popup_menu_button.py +0 -0
  195. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/progress_bar.py +0 -0
  196. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/progress_ring.py +0 -0
  197. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/radio.py +0 -0
  198. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/radio_group.py +0 -0
  199. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/range_slider.py +0 -0
  200. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/search_bar.py +0 -0
  201. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/segmented_button.py +0 -0
  202. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/selection_area.py +0 -0
  203. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/slider.py +0 -0
  204. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/snack_bar.py +0 -0
  205. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/submenu_button.py +0 -0
  206. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/switch.py +0 -0
  207. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/tabs.py +0 -0
  208. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/text_button.py +0 -0
  209. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/textfield.py +0 -0
  210. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/time_picker.py +0 -0
  211. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/tooltip.py +0 -0
  212. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/material/vertical_divider.py +0 -0
  213. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/multi_view.py +0 -0
  214. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/object_patch.py +0 -0
  215. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/padding.py +0 -0
  216. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/painting.py +0 -0
  217. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/query_string.py +0 -0
  218. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/ref.py +0 -0
  219. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/scrollable_control.py +0 -0
  220. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/__init__.py +0 -0
  221. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/accelerometer.py +0 -0
  222. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/barometer.py +0 -0
  223. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/battery.py +0 -0
  224. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/browser_context_menu.py +0 -0
  225. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/clipboard.py +0 -0
  226. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/connectivity.py +0 -0
  227. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/file_picker.py +0 -0
  228. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/gyroscope.py +0 -0
  229. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/haptic_feedback.py +0 -0
  230. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/magnetometer.py +0 -0
  231. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/screen_brightness.py +0 -0
  232. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/semantics_service.py +0 -0
  233. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/sensor_error_event.py +0 -0
  234. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/service.py +0 -0
  235. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/shake_detector.py +0 -0
  236. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/share.py +0 -0
  237. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/shared_preferences.py +0 -0
  238. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/storage_paths.py +0 -0
  239. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/url_launcher.py +0 -0
  240. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/user_accelerometer.py +0 -0
  241. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/services/wakelock.py +0 -0
  242. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/template_route.py +0 -0
  243. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/text_style.py +0 -0
  244. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/theme.py +0 -0
  245. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/transform.py +0 -0
  246. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/controls/types.py +0 -0
  247. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/fastapi/__init__.py +0 -0
  248. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/connection.py +0 -0
  249. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/flet_socket_server.py +0 -0
  250. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/protocol.py +0 -0
  251. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/pyodide_connection.py +0 -0
  252. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/messaging/session_store.py +0 -0
  253. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/pubsub/__init__.py +0 -0
  254. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/pubsub/pubsub_client.py +0 -0
  255. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/pubsub/pubsub_hub.py +0 -0
  256. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/py.typed +0 -0
  257. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/security/__init__.py +0 -0
  258. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/testing/__init__.py +0 -0
  259. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/testing/finder.py +0 -0
  260. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/testing/flet_test_app.py +0 -0
  261. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/testing/tester.py +0 -0
  262. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/__init__.py +0 -0
  263. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/browser.py +0 -0
  264. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/classproperty.py +0 -0
  265. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/deprecated.py +0 -0
  266. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/deprecated_enum.py +0 -0
  267. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/files.py +0 -0
  268. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/from_dict.py +0 -0
  269. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/hashing.py +0 -0
  270. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/json_utils.py +0 -0
  271. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/locks.py +0 -0
  272. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/network.py +0 -0
  273. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/object_model.py +0 -0
  274. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/once.py +0 -0
  275. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/pip.py +0 -0
  276. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/platform_utils.py +0 -0
  277. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/slugify.py +0 -0
  278. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/strings.py +0 -0
  279. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/typing_utils.py +0 -0
  280. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet/utils/vector.py +0 -0
  281. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/dependency_links.txt +0 -0
  282. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/entry_points.txt +0 -0
  283. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/src/flet.egg-info/top_level.txt +0 -0
  284. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_auth_lazy_imports.py +0 -0
  285. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_base_control.py +0 -0
  286. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_colors.py +0 -0
  287. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_component_effects.py +0 -0
  288. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_component_renderer.py +0 -0
  289. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_dataclasses.py +0 -0
  290. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_datetime.py +0 -0
  291. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_events.py +0 -0
  292. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_from_dict.py +0 -0
  293. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_icons.py +0 -0
  294. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_object_diff_frozen.py +0 -0
  295. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_object_diff_in_place.py +0 -0
  296. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_object_diff_memory_churn.py +0 -0
  297. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_object_diff_performance.py +0 -0
  298. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_observable.py +0 -0
  299. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_patch_dataclass.py +0 -0
  300. {flet-0.82.3.dev7863 → flet-0.82.3.dev7877}/tests/test_session_disconnect_buffering.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.82.3.dev7863
3
+ Version: 0.82.3.dev7877
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
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://docs.flet.dev/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "cli"
13
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "web"
12
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "cli"
13
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "web"
14
14
  Requires-Dist: oauthlib>=3.2.2; platform_system != "Pyodide"
15
15
  Requires-Dist: httpx>=0.28.1; platform_system != "Pyodide"
16
16
  Requires-Dist: repath>=0.9.0
17
17
  Requires-Dist: msgpack>=1.1.0
18
18
  Requires-Dist: typing-extensions; python_version < "3.11"
19
19
  Provides-Extra: all
20
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "all"
21
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "all"
22
- Requires-Dist: flet-desktop==0.82.3.dev7863; extra == "all"
20
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "all"
21
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "all"
22
+ Requires-Dist: flet-desktop==0.82.3.dev7877; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "cli"
24
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.82.3.dev7863; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.82.3.dev7877; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "web"
28
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "web"
29
29
 
30
30
  <p align="center">
31
31
  <a href="https://flet.dev"><img src="https://raw.githubusercontent.com/flet-dev/flet/refs/heads/main/media/logo/flet-logo.svg" height="150" alt="Flet logo"></a>
@@ -1,14 +1,14 @@
1
1
  [project]
2
2
  name = "flet"
3
- version = "0.82.3.dev7863"
3
+ version = "0.82.3.dev7877"
4
4
  description = "Flet for Python - easily build interactive multi-platform apps in Python"
5
5
  authors = [{name = "Appveyor Systems Inc.", email = "hello@flet.dev"}]
6
6
  license = "Apache-2.0"
7
7
  readme = "README.md"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
- "flet-cli==0.82.3.dev7863; extra == 'cli'",
11
- "flet-web==0.82.3.dev7863; extra == 'web'",
10
+ "flet-cli==0.82.3.dev7877; extra == 'cli'",
11
+ "flet-web==0.82.3.dev7877; extra == 'web'",
12
12
  "oauthlib >=3.2.2; platform_system != 'Pyodide'",
13
13
  "httpx >=0.28.1; platform_system != 'Pyodide'",
14
14
  "repath >=0.9.0",
@@ -23,15 +23,15 @@ Documentation = "https://docs.flet.dev/"
23
23
 
24
24
  [project.optional-dependencies]
25
25
  all = [
26
- "flet-cli==0.82.3.dev7863",
27
- "flet-web==0.82.3.dev7863",
28
- "flet-desktop==0.82.3.dev7863",
26
+ "flet-cli==0.82.3.dev7877",
27
+ "flet-web==0.82.3.dev7877",
28
+ "flet-desktop==0.82.3.dev7877",
29
29
  ]
30
- cli = ["flet-cli==0.82.3.dev7863"]
30
+ cli = ["flet-cli==0.82.3.dev7877"]
31
31
  desktop = [
32
- "flet-desktop==0.82.3.dev7863",
32
+ "flet-desktop==0.82.3.dev7877",
33
33
  ]
34
- web = ["flet-web==0.82.3.dev7863"]
34
+ web = ["flet-web==0.82.3.dev7877"]
35
35
 
36
36
  [project.scripts]
37
37
  flet = "flet.cli:main"
@@ -110,6 +110,27 @@ class Context:
110
110
  """
111
111
  return self.__components_mode
112
112
 
113
+ def mark_update_called(self):
114
+ """
115
+ Marks that `.update()` was explicitly called during the current handler.
116
+ """
117
+ _update_behavior_context_var.get()._update_called = True
118
+
119
+ def was_update_called(self) -> bool:
120
+ """
121
+ Returns whether `.update()` was explicitly called during the current handler.
122
+
123
+ Returns:
124
+ `True` if `.update()` was called, `False` otherwise.
125
+ """
126
+ return _update_behavior_context_var.get()._update_called
127
+
128
+ def reset_update_called(self):
129
+ """
130
+ Resets the update-called flag for the current context.
131
+ """
132
+ _update_behavior_context_var.get()._update_called = False
133
+
113
134
  def auto_update_enabled(self) -> bool:
114
135
  """
115
136
  Returns whether auto-update is enabled in the current context.
@@ -143,6 +164,7 @@ class UpdateBehavior:
143
164
  """
144
165
 
145
166
  _auto_update_enabled: bool = True
167
+ _update_called: bool = False
146
168
 
147
169
 
148
170
  _context_page = ContextVar("flet_session_page", default=None)
@@ -14,15 +14,26 @@ from flet.controls.types import MouseCursor, Number
14
14
  @dataclass
15
15
  class OnReorderEvent(Event["ReorderableListView"]):
16
16
  """
17
- Represents an event triggered during the reordering of items in a \
18
- [`ReorderableListView`][flet.].
17
+ Payload for [`ReorderableListView`][flet.] events related to item reordering.
19
18
  """
20
19
 
21
- new_index: Optional[int]
22
- """The new position of the item after reordering."""
20
+ new_index: Optional[int] = None
21
+ """
22
+ The new position of the item after the reordering, if available.
23
+
24
+ Will be non-`None` only for the following events:
25
+ [`ReorderableListView.on_reorder`][flet.],
26
+ [`ReorderableListView.on_reorder_end`][flet.].
27
+ """
23
28
 
24
- old_index: Optional[int]
25
- """The original/previous position of the item before reordering."""
29
+ old_index: Optional[int] = None
30
+ """
31
+ The previous position of the item before the reordering, if available.
32
+
33
+ Will be non-`None` only for the following events:
34
+ [`ReorderableListView.on_reorder`][flet.],
35
+ [`ReorderableListView.on_reorder_start`][flet.].
36
+ """
26
37
 
27
38
 
28
39
  @control("ReorderableListView")
@@ -53,7 +64,13 @@ class ReorderableListView(ListView):
53
64
 
54
65
  controls: list[Control] = field(default_factory=list)
55
66
  """
56
- The controls to be reordered.
67
+ The controls displayed by this [`ReorderableListView`][(c)].
68
+
69
+ Note:
70
+ When an item of this list gets reordered, [`on_reorder`][(c).] event gets
71
+ fired, but it doesn't reorder the `controls` list automatically. So, to keep
72
+ `controls` list in sync with the UI, reorder this list inside your
73
+ [`on_reorder`][(c).] event handler. ([example][(c).on_reorder])
57
74
  """
58
75
 
59
76
  anchor: Number = 0.0
@@ -89,13 +106,12 @@ class ReorderableListView(ListView):
89
106
 
90
107
  The default desktop drag handle is just an `Icons.DRAG_HANDLE`
91
108
  wrapped by a [`ReorderableDragHandle`][flet.]. On mobile platforms, the entire
92
- item is wrapped with a [`ReorderableDelayedDragStartListener`].
109
+ item is wrapped with a [`ReorderableDragHandle`][flet.].
93
110
 
94
111
  To customize the appearance or layout of drag handles, wrap each
95
112
  [`controls`][(c).] item, or a control within each of them, with a
96
- [`ReorderableDragHandle`][flet.], [`ReorderableDelayedDragStartListener`],
97
- or your own subclass of [`ReorderableDragHandle`][flet.]. For full control
98
- over the drag handles, you might want to set `show_default_drag_handles` to `False`.
113
+ [`ReorderableDragHandle`][flet.]. For full control over the drag handles,
114
+ you might want to set `show_default_drag_handles` to `False`.
99
115
 
100
116
  Example:
101
117
  ```python
@@ -122,9 +138,23 @@ class ReorderableListView(ListView):
122
138
 
123
139
  on_reorder: Optional[EventHandler[OnReorderEvent]] = None
124
140
  """
125
- Called when a [`controls`][(c).] item has been dragged to a new location/position \
126
- and the order of the items gets updated.
127
- """
141
+ Called when a [`controls`][(c).] item has been dragged to a new location/position.
142
+
143
+ Note:
144
+ This event does not reorder [`controls`][(c).] automatically. So, to keep
145
+ [`controls`][(c).] list in sync with the UI, reorder it accordingly inside
146
+ your `on_reorder` event handler.
147
+
148
+ /// admonition | Example
149
+ ```python
150
+ def handle_reorder(e: ft.OnReorderEvent):
151
+ rlv = e.control
152
+ moved_item = rlv.controls.pop(e.old_index) # Remove the reordered item from its old position
153
+ rlv.controls.insert(e.new_index, moved_item) # Insert the reordered item into its new position
154
+ rlv.update()
155
+ ```
156
+ ///
157
+ """ # noqa: E501
128
158
 
129
159
  on_reorder_start: Optional[EventHandler[OnReorderEvent]] = None
130
160
  """
@@ -660,6 +660,7 @@ class Page(BasePage):
660
660
  *controls: Specific controls to patch. When omitted, patches the
661
661
  whole page state.
662
662
  """
663
+ context.mark_update_called()
663
664
 
664
665
  if len(controls) == 0:
665
666
  self.__update(self)
@@ -435,8 +435,9 @@ class Session:
435
435
  control: Control that handled the event, or `None`.
436
436
  """
437
437
  # call auto-update
438
- if context.auto_update_enabled():
438
+ if context.auto_update_enabled() and not context.was_update_called():
439
439
  await self.__auto_update(control)
440
+ context.reset_update_called()
440
441
 
441
442
  # unregister unreferenced services
442
443
  self.page._services.unregister_services()
@@ -16,7 +16,7 @@ __all__ = [
16
16
  ]
17
17
 
18
18
  # set by CI
19
- flet_version = "0.82.3.dev7863"
19
+ flet_version = "0.82.3.dev7877"
20
20
  """
21
21
  The Flet version in use.
22
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.82.3.dev7863
3
+ Version: 0.82.3.dev7877
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
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://docs.flet.dev/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "cli"
13
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "web"
12
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "cli"
13
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "web"
14
14
  Requires-Dist: oauthlib>=3.2.2; platform_system != "Pyodide"
15
15
  Requires-Dist: httpx>=0.28.1; platform_system != "Pyodide"
16
16
  Requires-Dist: repath>=0.9.0
17
17
  Requires-Dist: msgpack>=1.1.0
18
18
  Requires-Dist: typing-extensions; python_version < "3.11"
19
19
  Provides-Extra: all
20
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "all"
21
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "all"
22
- Requires-Dist: flet-desktop==0.82.3.dev7863; extra == "all"
20
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "all"
21
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "all"
22
+ Requires-Dist: flet-desktop==0.82.3.dev7877; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.82.3.dev7863; extra == "cli"
24
+ Requires-Dist: flet-cli==0.82.3.dev7877; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.82.3.dev7863; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.82.3.dev7877; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.82.3.dev7863; extra == "web"
28
+ Requires-Dist: flet-web==0.82.3.dev7877; extra == "web"
29
29
 
30
30
  <p align="center">
31
31
  <a href="https://flet.dev"><img src="https://raw.githubusercontent.com/flet-dev/flet/refs/heads/main/media/logo/flet-logo.svg" height="150" alt="Flet logo"></a>
@@ -294,4 +294,5 @@ tests/test_object_diff_memory_churn.py
294
294
  tests/test_object_diff_performance.py
295
295
  tests/test_observable.py
296
296
  tests/test_patch_dataclass.py
297
- tests/test_session_disconnect_buffering.py
297
+ tests/test_session_disconnect_buffering.py
298
+ tests/test_skip_double_update.py
@@ -2,10 +2,10 @@ repath>=0.9.0
2
2
  msgpack>=1.1.0
3
3
 
4
4
  [:extra == "cli"]
5
- flet-cli==0.82.3.dev7863
5
+ flet-cli==0.82.3.dev7877
6
6
 
7
7
  [:extra == "web"]
8
- flet-web==0.82.3.dev7863
8
+ flet-web==0.82.3.dev7877
9
9
 
10
10
  [:platform_system != "Pyodide"]
11
11
  oauthlib>=3.2.2
@@ -15,15 +15,15 @@ httpx>=0.28.1
15
15
  typing-extensions
16
16
 
17
17
  [all]
18
- flet-cli==0.82.3.dev7863
19
- flet-web==0.82.3.dev7863
20
- flet-desktop==0.82.3.dev7863
18
+ flet-cli==0.82.3.dev7877
19
+ flet-web==0.82.3.dev7877
20
+ flet-desktop==0.82.3.dev7877
21
21
 
22
22
  [cli]
23
- flet-cli==0.82.3.dev7863
23
+ flet-cli==0.82.3.dev7877
24
24
 
25
25
  [desktop]
26
- flet-desktop==0.82.3.dev7863
26
+ flet-desktop==0.82.3.dev7877
27
27
 
28
28
  [web]
29
- flet-web==0.82.3.dev7863
29
+ flet-web==0.82.3.dev7877
@@ -0,0 +1,137 @@
1
+ """Tests for skipping auto-update when .update() was already called."""
2
+
3
+ from unittest.mock import AsyncMock, patch
4
+
5
+ import pytest
6
+
7
+ from flet.controls.context import UpdateBehavior, _update_behavior_context_var, context
8
+ from flet.messaging.connection import Connection
9
+ from flet.messaging.session import Session
10
+ from flet.pubsub.pubsub_hub import PubSubHub
11
+
12
+
13
+ @pytest.fixture(autouse=True)
14
+ def _fresh_update_behavior():
15
+ """Ensure each test starts with a clean UpdateBehavior."""
16
+ token = _update_behavior_context_var.set(UpdateBehavior())
17
+ yield
18
+ _update_behavior_context_var.reset(token)
19
+
20
+
21
+ def _make_session():
22
+ conn = Connection()
23
+ conn.pubsubhub = PubSubHub()
24
+ return Session(conn)
25
+
26
+
27
+ # --- Context flag unit tests ---
28
+
29
+
30
+ def test_update_called_flag_defaults_to_false():
31
+ assert context.was_update_called() is False
32
+
33
+
34
+ def test_mark_update_called_sets_flag():
35
+ context.mark_update_called()
36
+ assert context.was_update_called() is True
37
+
38
+
39
+ def test_reset_update_called_clears_flag():
40
+ context.mark_update_called()
41
+ context.reset_update_called()
42
+ assert context.was_update_called() is False
43
+
44
+
45
+ def test_reset_auto_update_starts_with_clean_flag():
46
+ context.mark_update_called()
47
+ context.reset_auto_update()
48
+ assert context.was_update_called() is False
49
+
50
+
51
+ # --- after_event integration tests ---
52
+
53
+
54
+ @pytest.mark.asyncio
55
+ async def test_after_event_skips_auto_update_when_update_was_called():
56
+ session = _make_session()
57
+ context.mark_update_called()
58
+
59
+ with patch.object(
60
+ session, "_Session__auto_update", new_callable=AsyncMock
61
+ ) as mock_auto:
62
+ await session.after_event(session.page)
63
+ mock_auto.assert_not_called()
64
+
65
+
66
+ @pytest.mark.asyncio
67
+ async def test_after_event_runs_auto_update_when_update_was_not_called():
68
+ session = _make_session()
69
+
70
+ with patch.object(
71
+ session, "_Session__auto_update", new_callable=AsyncMock
72
+ ) as mock_auto:
73
+ await session.after_event(session.page)
74
+ mock_auto.assert_called_once_with(session.page)
75
+
76
+
77
+ @pytest.mark.asyncio
78
+ async def test_after_event_resets_flag_after_check():
79
+ session = _make_session()
80
+ context.mark_update_called()
81
+
82
+ with patch.object(session, "_Session__auto_update", new_callable=AsyncMock):
83
+ await session.after_event(session.page)
84
+
85
+ assert context.was_update_called() is False
86
+
87
+
88
+ @pytest.mark.asyncio
89
+ async def test_after_event_resets_flag_even_when_auto_update_disabled():
90
+ session = _make_session()
91
+ context.mark_update_called()
92
+ context.disable_auto_update()
93
+
94
+ with patch.object(session, "_Session__auto_update", new_callable=AsyncMock):
95
+ await session.after_event(session.page)
96
+
97
+ assert context.was_update_called() is False
98
+
99
+
100
+ # --- Generator handler simulation ---
101
+
102
+
103
+ @pytest.mark.asyncio
104
+ async def test_generator_handler_flag_resets_between_yields():
105
+ """Simulate a generator handler where after_event is called after each yield.
106
+
107
+ First yield: .update() was called -> skip auto-update
108
+ Second yield: no .update() called -> auto-update fires
109
+ """
110
+ session = _make_session()
111
+
112
+ with patch.object(
113
+ session, "_Session__auto_update", new_callable=AsyncMock
114
+ ) as mock_auto:
115
+ # First yield segment: user called .update()
116
+ context.mark_update_called()
117
+ await session.after_event(session.page)
118
+ assert mock_auto.call_count == 0
119
+
120
+ # Second yield segment: no .update() called
121
+ await session.after_event(session.page)
122
+ assert mock_auto.call_count == 1
123
+
124
+
125
+ # --- Page.update() marks the flag ---
126
+
127
+
128
+ def test_page_update_marks_flag():
129
+ session = _make_session()
130
+ page = session.page
131
+
132
+ # Page.update() internally calls patch_control which needs a real connection,
133
+ # so we mock __update to isolate the flag-setting behavior.
134
+ with patch.object(page, "_Page__update"):
135
+ page.update()
136
+
137
+ assert context.was_update_called() is True
File without changes
File without changes