flet 0.82.3.dev7876__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.dev7876 → flet-0.82.3.dev7877}/PKG-INFO +9 -9
  2. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/pyproject.toml +9 -9
  3. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/context.py +22 -0
  4. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/page.py +1 -0
  5. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/session.py +2 -1
  6. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/version.py +1 -1
  7. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/PKG-INFO +9 -9
  8. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/SOURCES.txt +2 -1
  9. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/requires.txt +8 -8
  10. flet-0.82.3.dev7877/tests/test_skip_double_update.py +137 -0
  11. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/README.md +0 -0
  12. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/setup.cfg +0 -0
  13. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/__init__.py +0 -0
  14. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/app.py +0 -0
  15. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/__init__.py +0 -0
  16. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/authorization.py +0 -0
  17. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/authorization_service.py +0 -0
  18. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/group.py +0 -0
  19. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/oauth_provider.py +0 -0
  20. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/oauth_token.py +0 -0
  21. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/providers/__init__.py +0 -0
  22. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  23. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  24. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  25. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  26. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/auth/user.py +0 -0
  27. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/canvas/__init__.py +0 -0
  28. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/cli.py +0 -0
  29. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/__init__.py +0 -0
  30. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/component.py +0 -0
  31. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/component_decorator.py +0 -0
  32. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/component_owned.py +0 -0
  33. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/__init__.py +0 -0
  34. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/hook.py +0 -0
  35. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_callback.py +0 -0
  36. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_context.py +0 -0
  37. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_effect.py +0 -0
  38. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_memo.py +0 -0
  39. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_ref.py +0 -0
  40. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/hooks/use_state.py +0 -0
  41. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/memo.py +0 -0
  42. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/observable.py +0 -0
  43. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/public_utils.py +0 -0
  44. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/components/utils.py +0 -0
  45. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/__init__.py +0 -0
  46. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/adaptive_control.py +0 -0
  47. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/alignment.py +0 -0
  48. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/animation.py +0 -0
  49. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/base_control.py +0 -0
  50. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/base_page.py +0 -0
  51. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/blur.py +0 -0
  52. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/border.py +0 -0
  53. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/border_radius.py +0 -0
  54. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/box.py +0 -0
  55. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/buttons.py +0 -0
  56. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/colors.py +0 -0
  57. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/control.py +0 -0
  58. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/control_event.py +0 -0
  59. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/control_state.py +0 -0
  60. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/__init__.py +0 -0
  61. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/animated_switcher.py +0 -0
  62. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/autofill_group.py +0 -0
  63. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/__init__.py +0 -0
  64. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/arc.py +0 -0
  65. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/canvas.py +0 -0
  66. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/circle.py +0 -0
  67. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/color.py +0 -0
  68. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/fill.py +0 -0
  69. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/image.py +0 -0
  70. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/line.py +0 -0
  71. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/oval.py +0 -0
  72. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/path.py +0 -0
  73. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/points.py +0 -0
  74. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/rect.py +0 -0
  75. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/shadow.py +0 -0
  76. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/shape.py +0 -0
  77. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/canvas/text.py +0 -0
  78. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/column.py +0 -0
  79. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/dismissible.py +0 -0
  80. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/drag_target.py +0 -0
  81. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/draggable.py +0 -0
  82. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/flet_app.py +0 -0
  83. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/gesture_detector.py +0 -0
  84. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/grid_view.py +0 -0
  85. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/hero.py +0 -0
  86. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/icon.py +0 -0
  87. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/image.py +0 -0
  88. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/interactive_viewer.py +0 -0
  89. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/keyboard_listener.py +0 -0
  90. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/list_view.py +0 -0
  91. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/markdown.py +0 -0
  92. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/merge_semantics.py +0 -0
  93. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/page_view.py +0 -0
  94. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/pagelet.py +0 -0
  95. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/placeholder.py +0 -0
  96. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  97. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/responsive_row.py +0 -0
  98. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/rotated_box.py +0 -0
  99. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/row.py +0 -0
  100. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/safe_area.py +0 -0
  101. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/screenshot.py +0 -0
  102. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/semantics.py +0 -0
  103. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/shader_mask.py +0 -0
  104. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/shimmer.py +0 -0
  105. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/stack.py +0 -0
  106. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/text.py +0 -0
  107. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/text_span.py +0 -0
  108. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/transparent_pointer.py +0 -0
  109. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/view.py +0 -0
  110. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/window.py +0 -0
  111. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/core/window_drag_area.py +0 -0
  112. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/__init__.py +0 -0
  113. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  114. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  115. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  116. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  117. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  118. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  119. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  120. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  121. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  122. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  123. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  124. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  125. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  126. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  127. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  128. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  129. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  130. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  131. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  132. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  133. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  134. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  135. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  136. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  137. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  138. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  139. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  140. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  141. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/device_info.py +0 -0
  142. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/dialog_control.py +0 -0
  143. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/duration.py +0 -0
  144. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/embed_json_encoder.py +0 -0
  145. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/events.py +0 -0
  146. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/exceptions.py +0 -0
  147. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/geometry.py +0 -0
  148. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/gradients.py +0 -0
  149. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/icon_data.py +0 -0
  150. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/id_counter.py +0 -0
  151. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/keys.py +0 -0
  152. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/layout_control.py +0 -0
  153. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/margin.py +0 -0
  154. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/__init__.py +0 -0
  155. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/alert_dialog.py +0 -0
  156. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/app_bar.py +0 -0
  157. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/auto_complete.py +0 -0
  158. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/badge.py +0 -0
  159. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/banner.py +0 -0
  160. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/bottom_app_bar.py +0 -0
  161. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/bottom_sheet.py +0 -0
  162. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/button.py +0 -0
  163. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/card.py +0 -0
  164. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/checkbox.py +0 -0
  165. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/chip.py +0 -0
  166. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/circle_avatar.py +0 -0
  167. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/container.py +0 -0
  168. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/context_menu.py +0 -0
  169. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/datatable.py +0 -0
  170. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/date_picker.py +0 -0
  171. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/date_range_picker.py +0 -0
  172. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/divider.py +0 -0
  173. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/dropdown.py +0 -0
  174. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/dropdownm2.py +0 -0
  175. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/elevated_button.py +0 -0
  176. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/expansion_panel.py +0 -0
  177. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/expansion_tile.py +0 -0
  178. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/filled_button.py +0 -0
  179. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/filled_tonal_button.py +0 -0
  180. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/floating_action_button.py +0 -0
  181. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/form_field_control.py +0 -0
  182. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/icon_button.py +0 -0
  183. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.json +0 -0
  184. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.py +0 -0
  185. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/icons.pyi +0 -0
  186. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/list_tile.py +0 -0
  187. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/menu_bar.py +0 -0
  188. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/menu_item_button.py +0 -0
  189. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_bar.py +0 -0
  190. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_drawer.py +0 -0
  191. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/navigation_rail.py +0 -0
  192. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/outlined_button.py +0 -0
  193. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/popup_menu_button.py +0 -0
  194. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/progress_bar.py +0 -0
  195. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/progress_ring.py +0 -0
  196. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/radio.py +0 -0
  197. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/radio_group.py +0 -0
  198. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/range_slider.py +0 -0
  199. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/reorderable_list_view.py +0 -0
  200. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/search_bar.py +0 -0
  201. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/segmented_button.py +0 -0
  202. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/selection_area.py +0 -0
  203. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/slider.py +0 -0
  204. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/snack_bar.py +0 -0
  205. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/submenu_button.py +0 -0
  206. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/switch.py +0 -0
  207. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/tabs.py +0 -0
  208. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/text_button.py +0 -0
  209. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/textfield.py +0 -0
  210. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/time_picker.py +0 -0
  211. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/tooltip.py +0 -0
  212. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/material/vertical_divider.py +0 -0
  213. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/multi_view.py +0 -0
  214. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/object_patch.py +0 -0
  215. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/padding.py +0 -0
  216. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/painting.py +0 -0
  217. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/query_string.py +0 -0
  218. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/ref.py +0 -0
  219. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/scrollable_control.py +0 -0
  220. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/__init__.py +0 -0
  221. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/accelerometer.py +0 -0
  222. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/barometer.py +0 -0
  223. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/battery.py +0 -0
  224. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/browser_context_menu.py +0 -0
  225. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/clipboard.py +0 -0
  226. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/connectivity.py +0 -0
  227. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/file_picker.py +0 -0
  228. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/gyroscope.py +0 -0
  229. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/haptic_feedback.py +0 -0
  230. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/magnetometer.py +0 -0
  231. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/screen_brightness.py +0 -0
  232. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/semantics_service.py +0 -0
  233. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/sensor_error_event.py +0 -0
  234. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/service.py +0 -0
  235. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/shake_detector.py +0 -0
  236. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/share.py +0 -0
  237. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/shared_preferences.py +0 -0
  238. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/storage_paths.py +0 -0
  239. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/url_launcher.py +0 -0
  240. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/user_accelerometer.py +0 -0
  241. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/services/wakelock.py +0 -0
  242. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/template_route.py +0 -0
  243. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/text_style.py +0 -0
  244. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/theme.py +0 -0
  245. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/transform.py +0 -0
  246. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/controls/types.py +0 -0
  247. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/fastapi/__init__.py +0 -0
  248. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/connection.py +0 -0
  249. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/flet_socket_server.py +0 -0
  250. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/protocol.py +0 -0
  251. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/pyodide_connection.py +0 -0
  252. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/messaging/session_store.py +0 -0
  253. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/pubsub/__init__.py +0 -0
  254. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/pubsub/pubsub_client.py +0 -0
  255. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/pubsub/pubsub_hub.py +0 -0
  256. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/py.typed +0 -0
  257. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/security/__init__.py +0 -0
  258. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/testing/__init__.py +0 -0
  259. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/testing/finder.py +0 -0
  260. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/testing/flet_test_app.py +0 -0
  261. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/testing/tester.py +0 -0
  262. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/__init__.py +0 -0
  263. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/browser.py +0 -0
  264. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/classproperty.py +0 -0
  265. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/deprecated.py +0 -0
  266. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/deprecated_enum.py +0 -0
  267. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/files.py +0 -0
  268. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/from_dict.py +0 -0
  269. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/hashing.py +0 -0
  270. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/json_utils.py +0 -0
  271. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/locks.py +0 -0
  272. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/network.py +0 -0
  273. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/object_model.py +0 -0
  274. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/once.py +0 -0
  275. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/pip.py +0 -0
  276. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/platform_utils.py +0 -0
  277. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/slugify.py +0 -0
  278. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/strings.py +0 -0
  279. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/typing_utils.py +0 -0
  280. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet/utils/vector.py +0 -0
  281. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/dependency_links.txt +0 -0
  282. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/entry_points.txt +0 -0
  283. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/src/flet.egg-info/top_level.txt +0 -0
  284. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_auth_lazy_imports.py +0 -0
  285. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_base_control.py +0 -0
  286. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_colors.py +0 -0
  287. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_component_effects.py +0 -0
  288. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_component_renderer.py +0 -0
  289. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_dataclasses.py +0 -0
  290. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_datetime.py +0 -0
  291. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_events.py +0 -0
  292. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_from_dict.py +0 -0
  293. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_icons.py +0 -0
  294. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_object_diff_frozen.py +0 -0
  295. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_object_diff_in_place.py +0 -0
  296. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_object_diff_memory_churn.py +0 -0
  297. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_object_diff_performance.py +0 -0
  298. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_observable.py +0 -0
  299. {flet-0.82.3.dev7876 → flet-0.82.3.dev7877}/tests/test_patch_dataclass.py +0 -0
  300. {flet-0.82.3.dev7876 → 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.dev7876
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.dev7876; extra == "cli"
13
- Requires-Dist: flet-web==0.82.3.dev7876; 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.dev7876; extra == "all"
21
- Requires-Dist: flet-web==0.82.3.dev7876; extra == "all"
22
- Requires-Dist: flet-desktop==0.82.3.dev7876; 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.dev7876; 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.dev7876; 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.dev7876; 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.dev7876"
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.dev7876; extra == 'cli'",
11
- "flet-web==0.82.3.dev7876; 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.dev7876",
27
- "flet-web==0.82.3.dev7876",
28
- "flet-desktop==0.82.3.dev7876",
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.dev7876"]
30
+ cli = ["flet-cli==0.82.3.dev7877"]
31
31
  desktop = [
32
- "flet-desktop==0.82.3.dev7876",
32
+ "flet-desktop==0.82.3.dev7877",
33
33
  ]
34
- web = ["flet-web==0.82.3.dev7876"]
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)
@@ -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.dev7876"
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.dev7876
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.dev7876; extra == "cli"
13
- Requires-Dist: flet-web==0.82.3.dev7876; 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.dev7876; extra == "all"
21
- Requires-Dist: flet-web==0.82.3.dev7876; extra == "all"
22
- Requires-Dist: flet-desktop==0.82.3.dev7876; 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.dev7876; 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.dev7876; 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.dev7876; 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.dev7876
5
+ flet-cli==0.82.3.dev7877
6
6
 
7
7
  [:extra == "web"]
8
- flet-web==0.82.3.dev7876
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.dev7876
19
- flet-web==0.82.3.dev7876
20
- flet-desktop==0.82.3.dev7876
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.dev7876
23
+ flet-cli==0.82.3.dev7877
24
24
 
25
25
  [desktop]
26
- flet-desktop==0.82.3.dev7876
26
+ flet-desktop==0.82.3.dev7877
27
27
 
28
28
  [web]
29
- flet-web==0.82.3.dev7876
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