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