flet 0.84.0.dev0__tar.gz → 0.85.0.dev0__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 (309) hide show
  1. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/PKG-INFO +9 -9
  2. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/pyproject.toml +9 -9
  3. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/__init__.py +2 -0
  4. flet-0.85.0.dev0/src/flet/components/hooks/use_dialog.py +71 -0
  5. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/base_page.py +51 -23
  6. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/context.py +6 -0
  7. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_rail.py +29 -3
  8. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/version.py +1 -1
  9. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/PKG-INFO +9 -9
  10. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/SOURCES.txt +2 -0
  11. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/requires.txt +8 -8
  12. flet-0.85.0.dev0/tests/test_use_dialog.py +166 -0
  13. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/README.md +0 -0
  14. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/setup.cfg +0 -0
  15. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/app.py +0 -0
  16. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/__init__.py +0 -0
  17. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/authorization.py +0 -0
  18. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/authorization_service.py +0 -0
  19. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/group.py +0 -0
  20. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/oauth_provider.py +0 -0
  21. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/oauth_token.py +0 -0
  22. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/__init__.py +0 -0
  23. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  24. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  25. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  26. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  27. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/auth/user.py +0 -0
  28. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/canvas/__init__.py +0 -0
  29. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/cli.py +0 -0
  30. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/__init__.py +0 -0
  31. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component.py +0 -0
  32. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component_decorator.py +0 -0
  33. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/component_owned.py +0 -0
  34. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/__init__.py +0 -0
  35. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/hook.py +0 -0
  36. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_callback.py +0 -0
  37. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_context.py +0 -0
  38. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_effect.py +0 -0
  39. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_memo.py +0 -0
  40. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_ref.py +0 -0
  41. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/hooks/use_state.py +0 -0
  42. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/memo.py +0 -0
  43. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/observable.py +0 -0
  44. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/public_utils.py +0 -0
  45. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/components/utils.py +0 -0
  46. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/__init__.py +0 -0
  47. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/adaptive_control.py +0 -0
  48. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/alignment.py +0 -0
  49. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/animation.py +0 -0
  50. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/base_control.py +0 -0
  51. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/blur.py +0 -0
  52. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/border.py +0 -0
  53. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/border_radius.py +0 -0
  54. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/box.py +0 -0
  55. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/buttons.py +0 -0
  56. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/colors.py +0 -0
  57. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control.py +0 -0
  58. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control_event.py +0 -0
  59. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/control_state.py +0 -0
  60. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/__init__.py +0 -0
  61. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/animated_switcher.py +0 -0
  62. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/autofill_group.py +0 -0
  63. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/__init__.py +0 -0
  64. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/arc.py +0 -0
  65. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/canvas.py +0 -0
  66. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/circle.py +0 -0
  67. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/color.py +0 -0
  68. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/fill.py +0 -0
  69. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/image.py +0 -0
  70. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/line.py +0 -0
  71. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/oval.py +0 -0
  72. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/path.py +0 -0
  73. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/points.py +0 -0
  74. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/rect.py +0 -0
  75. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/shadow.py +0 -0
  76. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/shape.py +0 -0
  77. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/canvas/text.py +0 -0
  78. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/column.py +0 -0
  79. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/dismissible.py +0 -0
  80. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/drag_target.py +0 -0
  81. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/draggable.py +0 -0
  82. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/flet_app.py +0 -0
  83. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/gesture_detector.py +0 -0
  84. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/grid_view.py +0 -0
  85. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/hero.py +0 -0
  86. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/icon.py +0 -0
  87. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/image.py +0 -0
  88. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/interactive_viewer.py +0 -0
  89. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/keyboard_listener.py +0 -0
  90. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/list_view.py +0 -0
  91. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/markdown.py +0 -0
  92. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/merge_semantics.py +0 -0
  93. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/page_view.py +0 -0
  94. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/pagelet.py +0 -0
  95. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/placeholder.py +0 -0
  96. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  97. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/responsive_row.py +0 -0
  98. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/rotated_box.py +0 -0
  99. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/row.py +0 -0
  100. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/safe_area.py +0 -0
  101. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/screenshot.py +0 -0
  102. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/semantics.py +0 -0
  103. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/shader_mask.py +0 -0
  104. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/shimmer.py +0 -0
  105. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/stack.py +0 -0
  106. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/text.py +0 -0
  107. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/text_span.py +0 -0
  108. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/transparent_pointer.py +0 -0
  109. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/view.py +0 -0
  110. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/window.py +0 -0
  111. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/core/window_drag_area.py +0 -0
  112. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/__init__.py +0 -0
  113. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  114. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  115. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  116. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  117. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  118. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  119. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  120. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  121. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  122. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  123. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  124. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  125. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  126. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  127. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  128. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  129. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  130. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  131. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  132. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  133. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  134. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  135. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  136. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  137. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  138. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  139. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  140. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  141. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/device_info.py +0 -0
  142. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/dialog_control.py +0 -0
  143. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/duration.py +0 -0
  144. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/embed_json_encoder.py +0 -0
  145. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/events.py +0 -0
  146. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/exceptions.py +0 -0
  147. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/geometry.py +0 -0
  148. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/gradients.py +0 -0
  149. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/icon_data.py +0 -0
  150. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/id_counter.py +0 -0
  151. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/keys.py +0 -0
  152. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/layout_control.py +0 -0
  153. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/margin.py +0 -0
  154. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/__init__.py +0 -0
  155. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/alert_dialog.py +0 -0
  156. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/app_bar.py +0 -0
  157. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/auto_complete.py +0 -0
  158. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/badge.py +0 -0
  159. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/banner.py +0 -0
  160. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/bottom_app_bar.py +0 -0
  161. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/bottom_sheet.py +0 -0
  162. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/button.py +0 -0
  163. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/card.py +0 -0
  164. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/checkbox.py +0 -0
  165. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/chip.py +0 -0
  166. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/circle_avatar.py +0 -0
  167. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/container.py +0 -0
  168. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/context_menu.py +0 -0
  169. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/datatable.py +0 -0
  170. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/date_picker.py +0 -0
  171. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/date_range_picker.py +0 -0
  172. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/divider.py +0 -0
  173. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/dropdown.py +0 -0
  174. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/dropdownm2.py +0 -0
  175. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/elevated_button.py +0 -0
  176. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/expansion_panel.py +0 -0
  177. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/expansion_tile.py +0 -0
  178. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/filled_button.py +0 -0
  179. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/filled_tonal_button.py +0 -0
  180. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/floating_action_button.py +0 -0
  181. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/form_field_control.py +0 -0
  182. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icon_button.py +0 -0
  183. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.json +0 -0
  184. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.py +0 -0
  185. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/icons.pyi +0 -0
  186. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/list_tile.py +0 -0
  187. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/menu_bar.py +0 -0
  188. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/menu_item_button.py +0 -0
  189. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_bar.py +0 -0
  190. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/navigation_drawer.py +0 -0
  191. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/outlined_button.py +0 -0
  192. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/popup_menu_button.py +0 -0
  193. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/progress_bar.py +0 -0
  194. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/progress_ring.py +0 -0
  195. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/radio.py +0 -0
  196. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/radio_group.py +0 -0
  197. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/range_slider.py +0 -0
  198. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/reorderable_list_view.py +0 -0
  199. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/search_bar.py +0 -0
  200. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/segmented_button.py +0 -0
  201. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/selection_area.py +0 -0
  202. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/slider.py +0 -0
  203. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/snack_bar.py +0 -0
  204. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/submenu_button.py +0 -0
  205. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/switch.py +0 -0
  206. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/tabs.py +0 -0
  207. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/text_button.py +0 -0
  208. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/textfield.py +0 -0
  209. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/time_picker.py +0 -0
  210. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/tooltip.py +0 -0
  211. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/material/vertical_divider.py +0 -0
  212. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/multi_view.py +0 -0
  213. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/object_patch.py +0 -0
  214. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/padding.py +0 -0
  215. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/page.py +0 -0
  216. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/painting.py +0 -0
  217. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/query_string.py +0 -0
  218. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/ref.py +0 -0
  219. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/scrollable_control.py +0 -0
  220. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/__init__.py +0 -0
  221. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/accelerometer.py +0 -0
  222. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/barometer.py +0 -0
  223. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/battery.py +0 -0
  224. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/browser_context_menu.py +0 -0
  225. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/clipboard.py +0 -0
  226. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/connectivity.py +0 -0
  227. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/file_picker.py +0 -0
  228. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/gyroscope.py +0 -0
  229. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/haptic_feedback.py +0 -0
  230. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/magnetometer.py +0 -0
  231. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/screen_brightness.py +0 -0
  232. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/semantics_service.py +0 -0
  233. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/sensor_error_event.py +0 -0
  234. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/service.py +0 -0
  235. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/shake_detector.py +0 -0
  236. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/share.py +0 -0
  237. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/shared_preferences.py +0 -0
  238. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/storage_paths.py +0 -0
  239. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/url_launcher.py +0 -0
  240. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/user_accelerometer.py +0 -0
  241. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/services/wakelock.py +0 -0
  242. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/template_route.py +0 -0
  243. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/text_style.py +0 -0
  244. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/theme.py +0 -0
  245. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/transform.py +0 -0
  246. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/types.py +0 -0
  247. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/controls/value_types.py +0 -0
  248. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/fastapi/__init__.py +0 -0
  249. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/connection.py +0 -0
  250. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/flet_socket_server.py +0 -0
  251. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/protocol.py +0 -0
  252. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/pyodide_connection.py +0 -0
  253. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/session.py +0 -0
  254. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/messaging/session_store.py +0 -0
  255. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/__init__.py +0 -0
  256. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/pubsub_client.py +0 -0
  257. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/pubsub/pubsub_hub.py +0 -0
  258. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/py.typed +0 -0
  259. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/security/__init__.py +0 -0
  260. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/__init__.py +0 -0
  261. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/finder.py +0 -0
  262. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/flet_test_app.py +0 -0
  263. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/testing/tester.py +0 -0
  264. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/__init__.py +0 -0
  265. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/browser.py +0 -0
  266. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/classproperty.py +0 -0
  267. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/deprecated.py +0 -0
  268. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/deprecated_enum.py +0 -0
  269. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/files.py +0 -0
  270. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/from_dict.py +0 -0
  271. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/griffe_deprecations.py +0 -0
  272. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/hashing.py +0 -0
  273. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/json_utils.py +0 -0
  274. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/locks.py +0 -0
  275. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/network.py +0 -0
  276. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/object_model.py +0 -0
  277. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/once.py +0 -0
  278. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/pip.py +0 -0
  279. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/platform_utils.py +0 -0
  280. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/slugify.py +0 -0
  281. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/strings.py +0 -0
  282. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/typing_utils.py +0 -0
  283. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/validation.py +0 -0
  284. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet/utils/vector.py +0 -0
  285. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/dependency_links.txt +0 -0
  286. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/entry_points.txt +0 -0
  287. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/src/flet.egg-info/top_level.txt +0 -0
  288. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_auth_lazy_imports.py +0 -0
  289. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_base_control.py +0 -0
  290. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_colors.py +0 -0
  291. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_component_effects.py +0 -0
  292. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_component_renderer.py +0 -0
  293. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_dataclasses.py +0 -0
  294. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_datetime.py +0 -0
  295. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_deprecated.py +0 -0
  296. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_events.py +0 -0
  297. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_from_dict.py +0 -0
  298. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_griffe_deprecations.py +0 -0
  299. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_icons.py +0 -0
  300. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_frozen.py +0 -0
  301. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_in_place.py +0 -0
  302. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_memory_churn.py +0 -0
  303. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_object_diff_performance.py +0 -0
  304. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_observable.py +0 -0
  305. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_patch_dataclass.py +0 -0
  306. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_session_disconnect_buffering.py +0 -0
  307. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_skip_double_update.py +0 -0
  308. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_validation.py +0 -0
  309. {flet-0.84.0.dev0 → flet-0.85.0.dev0}/tests/test_validation_benchmark.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.84.0.dev0
3
+ Version: 0.85.0.dev0
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://flet.dev/docs/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.84.0.dev0; extra == "cli"
13
- Requires-Dist: flet-web==0.84.0.dev0; extra == "web"
12
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
13
+ Requires-Dist: flet-web==0.85.0.dev0; 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.84.0.dev0; extra == "all"
21
- Requires-Dist: flet-web==0.84.0.dev0; extra == "all"
22
- Requires-Dist: flet-desktop==0.84.0.dev0; extra == "all"
20
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "all"
21
+ Requires-Dist: flet-web==0.85.0.dev0; extra == "all"
22
+ Requires-Dist: flet-desktop==0.85.0.dev0; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.84.0.dev0; extra == "cli"
24
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.84.0.dev0; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.85.0.dev0; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.84.0.dev0; extra == "web"
28
+ Requires-Dist: flet-web==0.85.0.dev0; 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.84.0.dev0"
3
+ version = "0.85.0.dev0"
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.84.0.dev0; extra == 'cli'",
11
- "flet-web==0.84.0.dev0; extra == 'web'",
10
+ "flet-cli==0.85.0.dev0; extra == 'cli'",
11
+ "flet-web==0.85.0.dev0; 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://flet.dev/docs/"
23
23
 
24
24
  [project.optional-dependencies]
25
25
  all = [
26
- "flet-cli==0.84.0.dev0",
27
- "flet-web==0.84.0.dev0",
28
- "flet-desktop==0.84.0.dev0",
26
+ "flet-cli==0.85.0.dev0",
27
+ "flet-web==0.85.0.dev0",
28
+ "flet-desktop==0.85.0.dev0",
29
29
  ]
30
- cli = ["flet-cli==0.84.0.dev0"]
30
+ cli = ["flet-cli==0.85.0.dev0"]
31
31
  desktop = [
32
- "flet-desktop==0.84.0.dev0",
32
+ "flet-desktop==0.85.0.dev0",
33
33
  ]
34
- web = ["flet-web==0.84.0.dev0"]
34
+ web = ["flet-web==0.85.0.dev0"]
35
35
 
36
36
  [project.scripts]
37
37
  flet = "flet.cli:main"
@@ -5,6 +5,7 @@ from flet.components.component import Component
5
5
  from flet.components.component_decorator import component
6
6
  from flet.components.hooks.use_callback import use_callback
7
7
  from flet.components.hooks.use_context import create_context, use_context
8
+ from flet.components.hooks.use_dialog import use_dialog
8
9
  from flet.components.hooks.use_effect import (
9
10
  on_mounted,
10
11
  on_unmounted,
@@ -1111,6 +1112,7 @@ __all__ = [
1111
1112
  "unwrap_component",
1112
1113
  "use_callback",
1113
1114
  "use_context",
1115
+ "use_dialog",
1114
1116
  "use_effect",
1115
1117
  "use_memo",
1116
1118
  "use_ref",
@@ -0,0 +1,71 @@
1
+ from __future__ import annotations
2
+
3
+ from flet.components.hooks.use_effect import use_effect
4
+ from flet.components.hooks.use_ref import use_ref
5
+ from flet.controls.context import context
6
+ from flet.controls.dialog_control import DialogControl
7
+
8
+
9
+ def use_dialog(dialog: DialogControl | None = None):
10
+ """
11
+ Portal a :class:`~flet.DialogControl` to the page's dialog overlay.
12
+
13
+ Call this hook inside a :func:`~flet.component` function on every render.
14
+ Pass a :class:`~flet.DialogControl` instance to show the dialog,
15
+ or `None` to hide/remove it. The dialog content is updated
16
+ reactively on each re-render.
17
+
18
+ The hook automatically sets `open=True` on the dialog when it is
19
+ added to the overlay and removes it when `None` is passed or the
20
+ component unmounts.
21
+
22
+ Args:
23
+ dialog: A :class:`~flet.DialogControl` to display, or `None`
24
+ to hide it.
25
+ """
26
+ ref = use_ref(None)
27
+ page = context.page
28
+
29
+ prev = ref.current
30
+
31
+ if prev is not None and prev not in page._dialogs.controls:
32
+ ref.current = None
33
+ prev = None
34
+
35
+ if dialog is not None:
36
+ dialog.open = True
37
+ page._prepare_dialog(dialog)
38
+ if prev is not None and prev in page._dialogs.controls:
39
+ # Frozen diff: compares prev and dialog field-by-field,
40
+ # sends only actual deltas, and transfers _i via _migrate_state
41
+ # so Flutter preserves widget identity (e.g. TextField cursor).
42
+ page.session.patch_control(control=dialog, prev_control=prev, frozen=True)
43
+ # Strip _frozen set by _dataclass_added during frozen diff
44
+ # so we can later set open=False for dismissal.
45
+ if hasattr(dialog, "_frozen"):
46
+ del dialog._frozen
47
+ idx = page._dialogs.controls.index(prev)
48
+ page._dialogs.controls[idx] = dialog
49
+ ref.current = dialog
50
+ else:
51
+ page._dialogs.controls.append(dialog)
52
+ ref.current = dialog
53
+ page.session.schedule_update(page._dialogs)
54
+ elif prev is not None and prev.open:
55
+ # Dismiss: patch open=False so Flutter pops the dialog route.
56
+ # Keep prev in _dialogs.controls and ref.current so the dialog
57
+ # stays alive in session.__index (WeakValueDictionary) — Flutter
58
+ # needs the control present to dispatch the dismiss event. The
59
+ # wrapped dismiss handler removes it after Flutter signals close.
60
+ prev.open = False
61
+ page.session.patch_control(prev)
62
+
63
+ def _cleanup():
64
+ d = ref.current
65
+ if d is not None:
66
+ ref.current = None
67
+ if d.open:
68
+ d.open = False
69
+ page.session.patch_control(d)
70
+
71
+ use_effect(lambda: None, dependencies=[], cleanup=_cleanup)
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import weakref
2
3
  from dataclasses import dataclass, field
3
4
  from typing import (
4
5
  TYPE_CHECKING,
@@ -44,6 +45,9 @@ from flet.controls.types import (
44
45
 
45
46
  logger = logging.getLogger("flet")
46
47
 
48
+ _MANAGED_DIALOG_DISMISS_ORIGINAL = "_managed_dialog_dismiss_original"
49
+ _MANAGED_DIALOG_DISMISS_WRAPPER = "_managed_dialog_dismiss_wrapper"
50
+
47
51
  if TYPE_CHECKING:
48
52
  from flet.controls.theme import Theme
49
53
 
@@ -390,30 +394,8 @@ class BasePage(AdaptiveControl):
390
394
  if dialog in self._dialogs.controls:
391
395
  raise RuntimeError("Dialog is already opened")
392
396
 
393
- original_on_dismiss = dialog.on_dismiss
394
-
395
- async def wrapped_on_dismiss(*args):
396
- """
397
- Remove dialog from stack and forward dismiss event to original handler.
398
-
399
- Args:
400
- *args: Dismiss event arguments passed by the framework.
401
- """
402
-
403
- if dialog in self._dialogs.controls:
404
- self._dialogs.controls.remove(dialog)
405
- self._dialogs.update()
406
- dialog.on_dismiss = original_on_dismiss
407
- e = args[0]
408
- if (
409
- original_on_dismiss and (e.data is None or e.data) # e.data == True for
410
- # TimePicker and DatePicker if they were dismissed without
411
- # changing the value
412
- ):
413
- await dialog._trigger_event("dismiss", e)
414
-
415
397
  dialog.open = True
416
- dialog.on_dismiss = wrapped_on_dismiss
398
+ self._prepare_dialog(dialog)
417
399
 
418
400
  self._dialogs.controls.append(dialog)
419
401
  self._dialogs.update()
@@ -438,6 +420,52 @@ class BasePage(AdaptiveControl):
438
420
  dialog.update()
439
421
  return dialog
440
422
 
423
+ def _prepare_dialog(self, dialog: DialogControl) -> None:
424
+ self._set_dialog_parent(dialog)
425
+ self._wrap_dialog_on_dismiss(dialog)
426
+
427
+ def _set_dialog_parent(self, dialog: DialogControl) -> None:
428
+ dialog._parent = weakref.ref(self._dialogs)
429
+
430
+ def _get_original_dialog_on_dismiss(self, dialog: DialogControl):
431
+ wrapper = getattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER, None)
432
+ if wrapper is not None and dialog.on_dismiss is wrapper:
433
+ return getattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, None)
434
+ return dialog.on_dismiss
435
+
436
+ def _wrap_dialog_on_dismiss(self, dialog: DialogControl) -> None:
437
+ original_on_dismiss = self._get_original_dialog_on_dismiss(dialog)
438
+
439
+ async def wrapped_on_dismiss(*args):
440
+ # Keep the dialog mounted until Flutter reports dismiss. Removing it
441
+ # earlier can drop the post-animation dismiss callback entirely.
442
+ self._restore_dialog_on_dismiss(dialog)
443
+ self._remove_dialog(dialog)
444
+ e = args[0]
445
+ if (
446
+ original_on_dismiss and (e.data is None or e.data)
447
+ # e.data == True for TimePicker and DatePicker if they were
448
+ # dismissed without changing the value
449
+ ):
450
+ await dialog._trigger_event("dismiss", e)
451
+
452
+ setattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, original_on_dismiss)
453
+ setattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER, wrapped_on_dismiss)
454
+ dialog.on_dismiss = wrapped_on_dismiss
455
+
456
+ def _restore_dialog_on_dismiss(self, dialog: DialogControl) -> None:
457
+ original_on_dismiss = getattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL, None)
458
+ if hasattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL):
459
+ delattr(dialog, _MANAGED_DIALOG_DISMISS_ORIGINAL)
460
+ if hasattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER):
461
+ delattr(dialog, _MANAGED_DIALOG_DISMISS_WRAPPER)
462
+ dialog.on_dismiss = original_on_dismiss
463
+
464
+ def _remove_dialog(self, dialog: DialogControl) -> None:
465
+ if dialog in self._dialogs.controls:
466
+ self._dialogs.controls.remove(dialog)
467
+ self._dialogs.update()
468
+
441
469
  async def show_drawer(self):
442
470
  """
443
471
  Show the drawer.
@@ -101,6 +101,12 @@ class Context:
101
101
  """
102
102
  self.__components_mode = True
103
103
 
104
+ def disable_components_mode(self):
105
+ """
106
+ Disables components mode in the current context.
107
+ """
108
+ self.__components_mode = False
109
+
104
110
  def is_components_mode(self) -> bool:
105
111
  """
106
112
  Returns whether the current context is in components mode.
@@ -56,13 +56,13 @@ class NavigationRailDestination(Control):
56
56
  Represents a destination in a `NavigationRail`.
57
57
  """
58
58
 
59
- icon: Optional[IconDataOrControl] = None
59
+ icon: IconDataOrControl
60
60
  """
61
61
  The [name of the icon](https://flet.dev/docs/types/icons) or `Control` of the \
62
62
  destination.
63
63
 
64
- If `selected_icon` is provided, this will only be displayed when the destination is
65
- not selected.
64
+ If :attr:`selected_icon` is provided, this will only be displayed when the
65
+ destination is not selected.
66
66
 
67
67
  To make the NavigationRail more accessible, consider choosing an icon with a stroked
68
68
  and filled version, such as `Icons.CLOUD` and `Icons.CLOUD_QUEUE`. The icon
@@ -105,6 +105,7 @@ class NavigationRail(LayoutControl):
105
105
  A material widget that is meant to be displayed at the left or right of an app to \
106
106
  navigate between a small number of views, typically between three and five.
107
107
 
108
+ Example:
108
109
  ```python
109
110
  ft.NavigationRail(
110
111
  selected_index=0,
@@ -208,6 +209,31 @@ class NavigationRail(LayoutControl):
208
209
  rendered when `extended=True`.
209
210
  """
210
211
 
212
+ pin_leading_to_top: bool = True
213
+ """
214
+ Whether to pin the :attr:`leading` control to the top of the rail.
215
+
216
+ If `False`, the leading control becomes part of the main group together with the
217
+ destinations and participates in scrolling/alignment.
218
+ """
219
+
220
+ pin_trailing_to_bottom: bool = False
221
+ """
222
+ Whether to pin the :attr:`trailing` control to the bottom of the rail.
223
+
224
+ If `False`, the trailing control becomes part of the main group together with the
225
+ destinations and participates in scrolling/alignment.
226
+ """
227
+
228
+ scrollable: bool = False
229
+ """
230
+ Whether the main group of :attr:`destinations` should become scrollable when \
231
+ vertical space is insufficient.
232
+
233
+ When :attr:`pin_leading_to_top` or :attr:`pin_trailing_to_bottom` are
234
+ `False`, the respective controls also become part of the scrollable group.
235
+ """
236
+
211
237
  min_width: Annotated[
212
238
  Optional[Number],
213
239
  V.ge(0),
@@ -16,7 +16,7 @@ __all__ = [
16
16
  ]
17
17
 
18
18
  # set by CI
19
- flet_version = "0.84.0.dev0"
19
+ flet_version = "0.85.0.dev0"
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.84.0.dev0
3
+ Version: 0.85.0.dev0
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://flet.dev/docs/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.84.0.dev0; extra == "cli"
13
- Requires-Dist: flet-web==0.84.0.dev0; extra == "web"
12
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
13
+ Requires-Dist: flet-web==0.85.0.dev0; 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.84.0.dev0; extra == "all"
21
- Requires-Dist: flet-web==0.84.0.dev0; extra == "all"
22
- Requires-Dist: flet-desktop==0.84.0.dev0; extra == "all"
20
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "all"
21
+ Requires-Dist: flet-web==0.85.0.dev0; extra == "all"
22
+ Requires-Dist: flet-desktop==0.85.0.dev0; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.84.0.dev0; extra == "cli"
24
+ Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.84.0.dev0; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.85.0.dev0; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.84.0.dev0; extra == "web"
28
+ Requires-Dist: flet-web==0.85.0.dev0; 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>
@@ -36,6 +36,7 @@ src/flet/components/hooks/__init__.py
36
36
  src/flet/components/hooks/hook.py
37
37
  src/flet/components/hooks/use_callback.py
38
38
  src/flet/components/hooks/use_context.py
39
+ src/flet/components/hooks/use_dialog.py
39
40
  src/flet/components/hooks/use_effect.py
40
41
  src/flet/components/hooks/use_memo.py
41
42
  src/flet/components/hooks/use_ref.py
@@ -301,5 +302,6 @@ tests/test_observable.py
301
302
  tests/test_patch_dataclass.py
302
303
  tests/test_session_disconnect_buffering.py
303
304
  tests/test_skip_double_update.py
305
+ tests/test_use_dialog.py
304
306
  tests/test_validation.py
305
307
  tests/test_validation_benchmark.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.84.0.dev0
5
+ flet-cli==0.85.0.dev0
6
6
 
7
7
  [:extra == "web"]
8
- flet-web==0.84.0.dev0
8
+ flet-web==0.85.0.dev0
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.84.0.dev0
19
- flet-web==0.84.0.dev0
20
- flet-desktop==0.84.0.dev0
18
+ flet-cli==0.85.0.dev0
19
+ flet-web==0.85.0.dev0
20
+ flet-desktop==0.85.0.dev0
21
21
 
22
22
  [cli]
23
- flet-cli==0.84.0.dev0
23
+ flet-cli==0.85.0.dev0
24
24
 
25
25
  [desktop]
26
- flet-desktop==0.84.0.dev0
26
+ flet-desktop==0.85.0.dev0
27
27
 
28
28
  [web]
29
- flet-web==0.84.0.dev0
29
+ flet-web==0.85.0.dev0
@@ -0,0 +1,166 @@
1
+ import weakref
2
+
3
+ import pytest
4
+
5
+ import flet as ft
6
+ from flet.components.component import Component, Renderer
7
+ from flet.controls.base_control import BaseControl
8
+ from flet.controls.context import _context_page
9
+ from flet.controls.control_event import ControlEvent
10
+ from flet.messaging.protocol import configure_encode_object_for_msgpack
11
+
12
+
13
+ class FakeSession:
14
+ def __init__(self):
15
+ self.patch_calls: list[tuple[object, dict]] = []
16
+ self.scheduled_updates: list[object] = []
17
+ self.index: dict[int, object] = {}
18
+
19
+ def patch_control(self, control, **kwargs):
20
+ self.patch_calls.append((control, kwargs))
21
+ control_id = getattr(control, "_i", None)
22
+ if control_id is not None:
23
+ self.index[control_id] = control
24
+
25
+ def schedule_update(self, control):
26
+ self.scheduled_updates.append(control)
27
+
28
+ def schedule_effect(self, hook, is_cleanup):
29
+ pass
30
+
31
+ async def after_event(self, control):
32
+ pass
33
+
34
+
35
+ def render_component(component: Component, page: ft.Page) -> None:
36
+ component._state.hook_cursor = 0
37
+ token = _context_page.set(page)
38
+ try:
39
+ renderer = Renderer(component)
40
+ with renderer.with_context(), renderer._Frame(renderer, component):
41
+ component.fn(*component.args, **component.kwargs)
42
+ finally:
43
+ _context_page.reset(token)
44
+
45
+
46
+ def create_page() -> tuple[ft.Page, FakeSession]:
47
+ session = FakeSession()
48
+ page = ft.Page(sess=session)
49
+ page._dialogs._parent = weakref.ref(page)
50
+ return page, session
51
+
52
+
53
+ @pytest.mark.asyncio
54
+ async def test_use_dialog_waits_for_dismiss_before_removing_dialog():
55
+ page, session = create_page()
56
+ show = True
57
+ dismiss_calls: list[str] = []
58
+
59
+ def body():
60
+ ft.use_dialog(
61
+ ft.AlertDialog(
62
+ title=ft.Text("Hello"),
63
+ on_dismiss=lambda e: dismiss_calls.append(e.name),
64
+ )
65
+ if show
66
+ else None
67
+ )
68
+
69
+ component = Component(fn=body, args=(), kwargs={})
70
+
71
+ render_component(component, page)
72
+
73
+ assert session.scheduled_updates == [page._dialogs]
74
+ assert len(page._dialogs.controls) == 1
75
+
76
+ dialog = page._dialogs.controls[0]
77
+ session.patch_calls.clear()
78
+ session.scheduled_updates.clear()
79
+
80
+ show = False
81
+ render_component(component, page)
82
+
83
+ assert page._dialogs.controls == [dialog]
84
+ assert dialog.open is False
85
+ assert session.patch_calls == [(dialog, {})]
86
+ assert session.scheduled_updates == []
87
+
88
+ await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
89
+
90
+ assert page._dialogs.controls == []
91
+ assert dismiss_calls == ["dismiss"]
92
+ assert session.patch_calls[-1] == (page._dialogs, {})
93
+
94
+
95
+ @pytest.mark.asyncio
96
+ async def test_use_dialog_unmount_keeps_dialog_until_dismiss_event():
97
+ page, session = create_page()
98
+ dismiss_calls: list[str] = []
99
+
100
+ def body():
101
+ ft.use_dialog(
102
+ ft.AlertDialog(
103
+ title=ft.Text("Hello"),
104
+ on_dismiss=lambda e: dismiss_calls.append(e.name),
105
+ )
106
+ )
107
+
108
+ component = Component(fn=body, args=(), kwargs={})
109
+ render_component(component, page)
110
+
111
+ dialog = page._dialogs.controls[0]
112
+ session.patch_calls.clear()
113
+ session.scheduled_updates.clear()
114
+ component._schedule_effect = lambda hook, is_cleanup=False: (
115
+ hook.cleanup() if is_cleanup and hook.cleanup else None
116
+ )
117
+
118
+ component.will_unmount()
119
+
120
+ assert page._dialogs.controls == [dialog]
121
+ assert dialog.open is False
122
+ assert session.patch_calls == [(dialog, {})]
123
+ assert session.scheduled_updates == []
124
+
125
+ await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
126
+
127
+ assert page._dialogs.controls == []
128
+ assert dismiss_calls == ["dismiss"]
129
+ assert session.patch_calls[-1] == (page._dialogs, {})
130
+
131
+
132
+ @pytest.mark.asyncio
133
+ async def test_show_dialog_still_removes_dialog_on_dismiss():
134
+ page, session = create_page()
135
+ dismiss_calls: list[str] = []
136
+ dialog = ft.AlertDialog(
137
+ title=ft.Text("Hello"),
138
+ on_dismiss=lambda e: dismiss_calls.append(e.name),
139
+ )
140
+
141
+ page.show_dialog(dialog)
142
+
143
+ assert page._dialogs.controls == [dialog]
144
+ assert dialog.open is True
145
+ assert session.patch_calls == [(page._dialogs, {})]
146
+
147
+ await dialog.on_dismiss(ControlEvent(control=dialog, name="dismiss", data=None))
148
+
149
+ assert page._dialogs.controls == []
150
+ assert dismiss_calls == ["dismiss"]
151
+ assert session.patch_calls[-1] == (page._dialogs, {})
152
+
153
+
154
+ def test_prepare_dialog_does_not_store_callbacks_in_serialized_fields():
155
+ page, _ = create_page()
156
+ dialog = ft.AlertDialog(
157
+ title=ft.Text("Hello"),
158
+ on_dismiss=lambda e: None,
159
+ )
160
+
161
+ page._prepare_dialog(dialog)
162
+
163
+ encoded = configure_encode_object_for_msgpack(BaseControl)(dialog)
164
+
165
+ assert encoded["on_dismiss"] is True
166
+ assert "_internals" not in encoded
File without changes
File without changes
File without changes
File without changes