flet 0.84.0.dev0__tar.gz → 0.85.0.dev1__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 (315) hide show
  1. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/PKG-INFO +9 -9
  2. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/pyproject.toml +9 -9
  3. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/__init__.py +32 -2
  4. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/component.py +16 -0
  5. flet-0.85.0.dev1/src/flet/components/hooks/use_dialog.py +136 -0
  6. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/observable.py +0 -1
  7. flet-0.85.0.dev1/src/flet/components/router.py +699 -0
  8. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/base_page.py +99 -27
  9. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/border.py +0 -42
  10. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/border_radius.py +0 -61
  11. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/context.py +6 -0
  12. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/control.py +4 -1
  13. flet-0.85.0.dev1/src/flet/controls/core/drag_target.py +199 -0
  14. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/flet_app.py +32 -2
  15. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/responsive_row.py +21 -2
  16. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/margin.py +1 -34
  17. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/container.py +10 -2
  18. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/datatable.py +6 -0
  19. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/date_picker.py +10 -0
  20. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/date_range_picker.py +10 -0
  21. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/dropdownm2.py +6 -0
  22. flet-0.85.0.dev1/src/flet/controls/material/navigation_drawer.py +167 -0
  23. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/navigation_rail.py +29 -3
  24. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/tabs.py +32 -0
  25. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/object_patch.py +44 -3
  26. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/padding.py +0 -36
  27. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/page.py +159 -15
  28. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/scrollable_control.py +3 -2
  29. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/theme.py +14 -4
  30. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/protocol.py +7 -0
  31. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/session.py +88 -3
  32. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/testing/flet_test_app.py +214 -35
  33. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/testing/tester.py +85 -0
  34. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/griffe_deprecations.py +89 -1
  35. flet-0.85.0.dev1/src/flet/utils/linux_deps.py +36 -0
  36. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/version.py +12 -7
  37. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/PKG-INFO +9 -9
  38. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/SOURCES.txt +7 -1
  39. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/requires.txt +8 -8
  40. flet-0.85.0.dev1/tests/test_component_diff.py +141 -0
  41. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_deprecated.py +15 -3
  42. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_griffe_deprecations.py +50 -7
  43. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_skip_double_update.py +48 -1
  44. flet-0.85.0.dev1/tests/test_use_dialog.py +582 -0
  45. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_validation.py +1 -1
  46. flet-0.85.0.dev1/tests/test_version.py +43 -0
  47. flet-0.84.0.dev0/src/flet/controls/core/drag_target.py +0 -141
  48. flet-0.84.0.dev0/src/flet/controls/material/navigation_drawer.py +0 -152
  49. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/README.md +0 -0
  50. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/setup.cfg +0 -0
  51. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/app.py +0 -0
  52. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/__init__.py +0 -0
  53. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/authorization.py +0 -0
  54. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/authorization_service.py +0 -0
  55. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/group.py +0 -0
  56. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/oauth_provider.py +0 -0
  57. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/oauth_token.py +0 -0
  58. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/providers/__init__.py +0 -0
  59. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  60. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  61. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  62. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  63. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/auth/user.py +0 -0
  64. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/canvas/__init__.py +0 -0
  65. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/cli.py +0 -0
  66. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/__init__.py +0 -0
  67. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/component_decorator.py +0 -0
  68. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/component_owned.py +0 -0
  69. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/__init__.py +0 -0
  70. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/hook.py +0 -0
  71. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_callback.py +0 -0
  72. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_context.py +0 -0
  73. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_effect.py +0 -0
  74. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_memo.py +0 -0
  75. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_ref.py +0 -0
  76. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/hooks/use_state.py +0 -0
  77. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/memo.py +0 -0
  78. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/public_utils.py +0 -0
  79. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/components/utils.py +0 -0
  80. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/__init__.py +0 -0
  81. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/adaptive_control.py +0 -0
  82. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/alignment.py +0 -0
  83. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/animation.py +0 -0
  84. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/base_control.py +0 -0
  85. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/blur.py +0 -0
  86. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/box.py +0 -0
  87. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/buttons.py +0 -0
  88. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/colors.py +0 -0
  89. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/control_event.py +0 -0
  90. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/control_state.py +0 -0
  91. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/__init__.py +0 -0
  92. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/animated_switcher.py +0 -0
  93. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/autofill_group.py +0 -0
  94. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/__init__.py +0 -0
  95. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/arc.py +0 -0
  96. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/canvas.py +0 -0
  97. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/circle.py +0 -0
  98. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/color.py +0 -0
  99. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/fill.py +0 -0
  100. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/image.py +0 -0
  101. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/line.py +0 -0
  102. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/oval.py +0 -0
  103. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/path.py +0 -0
  104. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/points.py +0 -0
  105. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/rect.py +0 -0
  106. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/shadow.py +0 -0
  107. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/shape.py +0 -0
  108. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/canvas/text.py +0 -0
  109. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/column.py +0 -0
  110. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/dismissible.py +0 -0
  111. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/draggable.py +0 -0
  112. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/gesture_detector.py +0 -0
  113. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/grid_view.py +0 -0
  114. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/hero.py +0 -0
  115. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/icon.py +0 -0
  116. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/image.py +0 -0
  117. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/interactive_viewer.py +0 -0
  118. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/keyboard_listener.py +0 -0
  119. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/list_view.py +0 -0
  120. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/markdown.py +0 -0
  121. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/merge_semantics.py +0 -0
  122. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/page_view.py +0 -0
  123. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/pagelet.py +0 -0
  124. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/placeholder.py +0 -0
  125. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  126. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/rotated_box.py +0 -0
  127. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/row.py +0 -0
  128. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/safe_area.py +0 -0
  129. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/screenshot.py +0 -0
  130. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/semantics.py +0 -0
  131. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/shader_mask.py +0 -0
  132. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/shimmer.py +0 -0
  133. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/stack.py +0 -0
  134. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/text.py +0 -0
  135. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/text_span.py +0 -0
  136. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/transparent_pointer.py +0 -0
  137. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/view.py +0 -0
  138. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/window.py +0 -0
  139. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/core/window_drag_area.py +0 -0
  140. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/__init__.py +0 -0
  141. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  142. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  143. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  144. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  145. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  146. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  147. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  148. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  149. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  150. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  151. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  152. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  153. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  154. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  155. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  156. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  157. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  158. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  159. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  160. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  161. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  162. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  163. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  164. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  165. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  166. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  167. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  168. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  169. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/device_info.py +0 -0
  170. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/dialog_control.py +0 -0
  171. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/duration.py +0 -0
  172. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/embed_json_encoder.py +0 -0
  173. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/events.py +0 -0
  174. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/exceptions.py +0 -0
  175. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/geometry.py +0 -0
  176. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/gradients.py +0 -0
  177. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/icon_data.py +0 -0
  178. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/id_counter.py +0 -0
  179. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/keys.py +0 -0
  180. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/layout_control.py +0 -0
  181. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/__init__.py +0 -0
  182. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/alert_dialog.py +0 -0
  183. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/app_bar.py +0 -0
  184. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/auto_complete.py +0 -0
  185. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/badge.py +0 -0
  186. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/banner.py +0 -0
  187. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/bottom_app_bar.py +0 -0
  188. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/bottom_sheet.py +0 -0
  189. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/button.py +0 -0
  190. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/card.py +0 -0
  191. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/checkbox.py +0 -0
  192. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/chip.py +0 -0
  193. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/circle_avatar.py +0 -0
  194. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/context_menu.py +0 -0
  195. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/divider.py +0 -0
  196. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/dropdown.py +0 -0
  197. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/elevated_button.py +0 -0
  198. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/expansion_panel.py +0 -0
  199. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/expansion_tile.py +0 -0
  200. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/filled_button.py +0 -0
  201. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/filled_tonal_button.py +0 -0
  202. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/floating_action_button.py +0 -0
  203. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/form_field_control.py +0 -0
  204. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/icon_button.py +0 -0
  205. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/icons.json +0 -0
  206. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/icons.py +0 -0
  207. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/icons.pyi +0 -0
  208. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/list_tile.py +0 -0
  209. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/menu_bar.py +0 -0
  210. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/menu_item_button.py +0 -0
  211. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/navigation_bar.py +0 -0
  212. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/outlined_button.py +0 -0
  213. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/popup_menu_button.py +0 -0
  214. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/progress_bar.py +0 -0
  215. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/progress_ring.py +0 -0
  216. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/radio.py +0 -0
  217. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/radio_group.py +0 -0
  218. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/range_slider.py +0 -0
  219. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/reorderable_list_view.py +0 -0
  220. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/search_bar.py +0 -0
  221. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/segmented_button.py +0 -0
  222. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/selection_area.py +0 -0
  223. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/slider.py +0 -0
  224. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/snack_bar.py +0 -0
  225. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/submenu_button.py +0 -0
  226. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/switch.py +0 -0
  227. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/text_button.py +0 -0
  228. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/textfield.py +0 -0
  229. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/time_picker.py +0 -0
  230. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/tooltip.py +0 -0
  231. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/material/vertical_divider.py +0 -0
  232. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/multi_view.py +0 -0
  233. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/painting.py +0 -0
  234. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/query_string.py +0 -0
  235. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/ref.py +0 -0
  236. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/__init__.py +0 -0
  237. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/accelerometer.py +0 -0
  238. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/barometer.py +0 -0
  239. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/battery.py +0 -0
  240. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/browser_context_menu.py +0 -0
  241. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/clipboard.py +0 -0
  242. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/connectivity.py +0 -0
  243. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/file_picker.py +0 -0
  244. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/gyroscope.py +0 -0
  245. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/haptic_feedback.py +0 -0
  246. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/magnetometer.py +0 -0
  247. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/screen_brightness.py +0 -0
  248. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/semantics_service.py +0 -0
  249. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/sensor_error_event.py +0 -0
  250. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/service.py +0 -0
  251. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/shake_detector.py +0 -0
  252. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/share.py +0 -0
  253. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/shared_preferences.py +0 -0
  254. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/storage_paths.py +0 -0
  255. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/url_launcher.py +0 -0
  256. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/user_accelerometer.py +0 -0
  257. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/services/wakelock.py +0 -0
  258. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/template_route.py +0 -0
  259. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/text_style.py +0 -0
  260. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/transform.py +0 -0
  261. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/types.py +0 -0
  262. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/controls/value_types.py +0 -0
  263. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/fastapi/__init__.py +0 -0
  264. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/connection.py +0 -0
  265. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/flet_socket_server.py +0 -0
  266. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/pyodide_connection.py +0 -0
  267. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/messaging/session_store.py +0 -0
  268. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/pubsub/__init__.py +0 -0
  269. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/pubsub/pubsub_client.py +0 -0
  270. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/pubsub/pubsub_hub.py +0 -0
  271. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/py.typed +0 -0
  272. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/security/__init__.py +0 -0
  273. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/testing/__init__.py +0 -0
  274. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/testing/finder.py +0 -0
  275. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/__init__.py +0 -0
  276. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/browser.py +0 -0
  277. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/classproperty.py +0 -0
  278. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/deprecated.py +0 -0
  279. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/deprecated_enum.py +0 -0
  280. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/files.py +0 -0
  281. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/from_dict.py +0 -0
  282. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/hashing.py +0 -0
  283. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/json_utils.py +0 -0
  284. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/locks.py +0 -0
  285. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/network.py +0 -0
  286. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/object_model.py +0 -0
  287. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/once.py +0 -0
  288. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/pip.py +0 -0
  289. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/platform_utils.py +0 -0
  290. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/slugify.py +0 -0
  291. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/strings.py +0 -0
  292. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/typing_utils.py +0 -0
  293. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/validation.py +0 -0
  294. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet/utils/vector.py +0 -0
  295. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/dependency_links.txt +0 -0
  296. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/entry_points.txt +0 -0
  297. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/src/flet.egg-info/top_level.txt +0 -0
  298. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_auth_lazy_imports.py +0 -0
  299. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_base_control.py +0 -0
  300. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_colors.py +0 -0
  301. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_component_effects.py +0 -0
  302. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_component_renderer.py +0 -0
  303. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_dataclasses.py +0 -0
  304. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_datetime.py +0 -0
  305. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_events.py +0 -0
  306. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_from_dict.py +0 -0
  307. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_icons.py +0 -0
  308. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_object_diff_frozen.py +0 -0
  309. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_object_diff_in_place.py +0 -0
  310. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_object_diff_memory_churn.py +0 -0
  311. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_object_diff_performance.py +0 -0
  312. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_observable.py +0 -0
  313. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_patch_dataclass.py +0 -0
  314. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/tests/test_session_disconnect_buffering.py +0 -0
  315. {flet-0.84.0.dev0 → flet-0.85.0.dev1}/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.dev1
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.dev1; extra == "cli"
13
+ Requires-Dist: flet-web==0.85.0.dev1; 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.dev1; extra == "all"
21
+ Requires-Dist: flet-web==0.85.0.dev1; extra == "all"
22
+ Requires-Dist: flet-desktop==0.85.0.dev1; 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.dev1; 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.dev1; 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.dev1; 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.dev1"
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.dev1; extra == 'cli'",
11
+ "flet-web==0.85.0.dev1; 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.dev1",
27
+ "flet-web==0.85.0.dev1",
28
+ "flet-desktop==0.85.0.dev1",
29
29
  ]
30
- cli = ["flet-cli==0.84.0.dev0"]
30
+ cli = ["flet-cli==0.85.0.dev1"]
31
31
  desktop = [
32
- "flet-desktop==0.84.0.dev0",
32
+ "flet-desktop==0.85.0.dev1",
33
33
  ]
34
- web = ["flet-web==0.84.0.dev0"]
34
+ web = ["flet-web==0.85.0.dev1"]
35
35
 
36
36
  [project.scripts]
37
37
  flet = "flet.cli:main"
@@ -4,7 +4,12 @@ from flet.app import AppCallable, app, app_async, run, run_async
4
4
  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
- from flet.components.hooks.use_context import create_context, use_context
7
+ from flet.components.hooks.use_context import (
8
+ ContextProvider,
9
+ create_context,
10
+ use_context,
11
+ )
12
+ from flet.components.hooks.use_dialog import use_dialog
8
13
  from flet.components.hooks.use_effect import (
9
14
  on_mounted,
10
15
  on_unmounted,
@@ -17,6 +22,17 @@ from flet.components.hooks.use_state import use_state
17
22
  from flet.components.memo import memo
18
23
  from flet.components.observable import Observable, observable
19
24
  from flet.components.public_utils import unwrap_component
25
+ from flet.components.router import (
26
+ LocationInfo,
27
+ Route,
28
+ Router,
29
+ is_route_active,
30
+ use_route_loader_data,
31
+ use_route_location,
32
+ use_route_outlet,
33
+ use_route_params,
34
+ use_view_path,
35
+ )
20
36
  from flet.controls import alignment, border, border_radius, margin, padding
21
37
  from flet.controls.adaptive_control import AdaptiveControl
22
38
  from flet.controls.alignment import Alignment, Axis
@@ -102,7 +118,7 @@ from flet.controls.core.drag_target import (
102
118
  DragWillAcceptEvent,
103
119
  )
104
120
  from flet.controls.core.draggable import Draggable
105
- from flet.controls.core.flet_app import FletApp
121
+ from flet.controls.core.flet_app import FletApp, FletAppOutputEvent
106
122
  from flet.controls.core.gesture_detector import GestureDetector
107
123
  from flet.controls.core.grid_view import GridView
108
124
  from flet.controls.core.hero import Hero
@@ -409,6 +425,7 @@ from flet.controls.page import (
409
425
  PlatformBrightnessChangeEvent,
410
426
  RouteChangeEvent,
411
427
  ViewPopEvent,
428
+ ViewsPopUntilEvent,
412
429
  )
413
430
  from flet.controls.painting import (
414
431
  Paint,
@@ -699,6 +716,7 @@ __all__ = [
699
716
  "ContextMenuDismissEvent",
700
717
  "ContextMenuSelectEvent",
701
718
  "ContextMenuTrigger",
719
+ "ContextProvider",
702
720
  "ContinuousRectangleBorder",
703
721
  "Control",
704
722
  "ControlEvent",
@@ -796,6 +814,7 @@ __all__ = [
796
814
  "FilledTonalIconButton",
797
815
  "FilterQuality",
798
816
  "FletApp",
817
+ "FletAppOutputEvent",
799
818
  "FletException",
800
819
  "FletPageDisconnectedException",
801
820
  "FletUnimplementedPlatformException",
@@ -853,6 +872,7 @@ __all__ = [
853
872
  "Locale",
854
873
  "LocaleChangeEvent",
855
874
  "LocaleConfiguration",
875
+ "LocationInfo",
856
876
  "LoginEvent",
857
877
  "LongPressDownEvent",
858
878
  "LongPressEndEvent",
@@ -950,8 +970,10 @@ __all__ = [
950
970
  "RotateValue",
951
971
  "RotatedBox",
952
972
  "RoundedRectangleBorder",
973
+ "Route",
953
974
  "RouteChangeEvent",
954
975
  "RouteUrlStrategy",
976
+ "Router",
955
977
  "Row",
956
978
  "SafeArea",
957
979
  "Scale",
@@ -1072,6 +1094,7 @@ __all__ = [
1072
1094
  "VerticalDivider",
1073
1095
  "View",
1074
1096
  "ViewPopEvent",
1097
+ "ViewsPopUntilEvent",
1075
1098
  "VisualDensity",
1076
1099
  "Wakelock",
1077
1100
  "WebBrowserName",
@@ -1099,6 +1122,7 @@ __all__ = [
1099
1122
  "dropdown",
1100
1123
  "dropdownm2",
1101
1124
  "icons",
1125
+ "is_route_active",
1102
1126
  "margin",
1103
1127
  "memo",
1104
1128
  "observable",
@@ -1111,10 +1135,16 @@ __all__ = [
1111
1135
  "unwrap_component",
1112
1136
  "use_callback",
1113
1137
  "use_context",
1138
+ "use_dialog",
1114
1139
  "use_effect",
1115
1140
  "use_memo",
1116
1141
  "use_ref",
1142
+ "use_route_loader_data",
1143
+ "use_route_location",
1144
+ "use_route_outlet",
1145
+ "use_route_params",
1117
1146
  "use_state",
1147
+ "use_view_path",
1118
1148
  "value",
1119
1149
  ]
1120
1150
 
@@ -80,6 +80,8 @@ class Component(BaseControl):
80
80
  memoized: bool = field(default=False, metadata={"skip": True})
81
81
  _stale: bool = field(default=False, metadata={"skip": True})
82
82
 
83
+ visible: bool = True
84
+
83
85
  _b: Any = None # body
84
86
 
85
87
  def _migrate_state(self, other: BaseControl):
@@ -104,6 +106,14 @@ class Component(BaseControl):
104
106
  logger.debug("%s.update(): skipping (stale)", self)
105
107
  return
106
108
 
109
+ # Don't re-render unmounted components. A stale observable listener
110
+ # (or queued pending update) can fire after `will_unmount` — running
111
+ # the component body here would create a new render tree that is
112
+ # never attached, leaking fresh subscriptions and zombie children.
113
+ if not self._state.mounted:
114
+ logger.debug("%s.update(): skipping (unmounted)", self)
115
+ return
116
+
107
117
  logger.debug(
108
118
  "%s.update(), memoized: %s",
109
119
  self,
@@ -183,6 +193,12 @@ class Component(BaseControl):
183
193
  Mark component dirty and enqueue a session update.
184
194
  """
185
195
 
196
+ # Skip updates for unmounted components. Stale observable listeners
197
+ # that fire after will_unmount must not resurrect a zombie control.
198
+ if not self._state.mounted:
199
+ logger.debug("%s.schedule_update(): skipping (unmounted)", self)
200
+ return
201
+
186
202
  logger.debug("%s.schedule_update()", self)
187
203
  self._state.is_dirty = True
188
204
  context.page.session.schedule_update(self)
@@ -0,0 +1,136 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import weakref
5
+
6
+ from flet.components.hooks.use_effect import use_effect
7
+ from flet.components.hooks.use_ref import use_ref
8
+ from flet.controls.context import context
9
+ from flet.controls.dialog_control import DialogControl
10
+
11
+
12
+ def _find_dialog_index(dialogs, target):
13
+ # Identity (`is`) comparison — dialog controls are dataclasses and two
14
+ # dialogs built from the same field values compare equal with `==`,
15
+ # so `in` / `.index()` would match the wrong entry when two sibling
16
+ # hosts each manage a similarly-shaped dialog.
17
+ for i, c in enumerate(dialogs.controls):
18
+ if c is target:
19
+ return i
20
+ return -1
21
+
22
+
23
+ def _bind_dialog_subtree(value, parent):
24
+ if dataclasses.is_dataclass(value):
25
+ if parent is not None and parent is not value:
26
+ value._parent = weakref.ref(parent)
27
+ for field in dataclasses.fields(value):
28
+ if not field.metadata.get("skip", False):
29
+ _bind_dialog_subtree(getattr(value, field.name), value)
30
+ elif isinstance(value, list):
31
+ for item in value:
32
+ _bind_dialog_subtree(item, parent)
33
+ elif isinstance(value, dict):
34
+ for item in value.values():
35
+ _bind_dialog_subtree(item, parent)
36
+
37
+
38
+ def use_dialog(dialog: DialogControl | None = None):
39
+ """
40
+ Portal a :class:`~flet.DialogControl` to the page's dialog overlay.
41
+
42
+ Call this hook inside a :func:`~flet.component` function on every render.
43
+ Pass a :class:`~flet.DialogControl` instance to show the dialog,
44
+ or `None` to hide/remove it.
45
+
46
+ The hook automatically sets `open=True` on the dialog when it is
47
+ added to the overlay and removes it when `None` is passed or the
48
+ component unmounts.
49
+
50
+ Args:
51
+ dialog: A :class:`~flet.DialogControl` to display, or `None`
52
+ to hide it.
53
+ """
54
+ ref = use_ref(None)
55
+ page = context.page
56
+
57
+ prev = ref.current
58
+
59
+ if prev is not None and _find_dialog_index(page._dialogs, prev) < 0:
60
+ ref.current = None
61
+ prev = None
62
+
63
+ if dialog is not None:
64
+ prev_idx = _find_dialog_index(page._dialogs, prev) if prev is not None else -1
65
+ if (
66
+ prev is not None
67
+ and prev_idx >= 0
68
+ and prev.open
69
+ and type(prev) is type(dialog)
70
+ ):
71
+ # Frozen diff: compares prev and dialog field-by-field, migrates
72
+ # `_i` onto the new instance via `_migrate_state`, and emits only
73
+ # actual field deltas. This is what preserves Flutter widget
74
+ # identity for nested controls — notably the TextField inside an
75
+ # AlertDialog keeps its cursor/focus across re-renders.
76
+ dialog.open = True
77
+ page._prepare_dialog(dialog)
78
+ page.session.patch_control(control=dialog, prev_control=prev, frozen=True)
79
+ # Strip the `_frozen` marker set by _dataclass_added during the
80
+ # frozen diff so we can later set open=False for dismissal.
81
+ if hasattr(dialog, "_frozen"):
82
+ del dialog._frozen
83
+ # Replace the old instance with the new one in the overlay list
84
+ # — at the SAME index, so sibling hosts' entries aren't disturbed.
85
+ _bind_dialog_subtree(dialog, page._dialogs)
86
+ page._dialogs.controls[prev_idx] = dialog
87
+ # Keep `_dialogs.__prev_lists['controls']` aligned with the new
88
+ # instance. Without this, a later `_dialogs.update()` triggered
89
+ # by an unrelated operation (e.g. `page.show_dialog(SnackBar)`)
90
+ # would diff the fresh `controls` list against a snapshot
91
+ # pointing at the old Python object — different `id()`, so the
92
+ # diff emits a full REPLACE of the dialog. On Dart, REPLACE
93
+ # creates a new Control with `_open` unset, and the next build
94
+ # re-enters the show branch and pushes a second DialogRoute on
95
+ # top of the existing one. The dialog then refuses to close.
96
+ prev_lists = getattr(page._dialogs, "__prev_lists", None)
97
+ if prev_lists is not None and "controls" in prev_lists:
98
+ prev_lists["controls"][prev_idx] = dialog
99
+ ref.current = dialog
100
+ else:
101
+ dialog.open = True
102
+ page._prepare_dialog(dialog)
103
+ _bind_dialog_subtree(dialog, page._dialogs)
104
+ # Either `prev` is gone (already dismissed on the client) or
105
+ # is still in the list with `open=False` (mid-dismiss,
106
+ # awaiting the client's on_dismiss round-trip). In the
107
+ # latter case we must NOT reuse `prev`'s `_i` — Flutter's
108
+ # `AlertDialogControl` still carries `_open=True` locally
109
+ # from when the previous dialog was shown, so reusing `_i`
110
+ # means the new `open=True` patch hits `open == lastOpen`
111
+ # and the new dialog never calls `showDialog`. Append a
112
+ # fresh entry (new `_i`) and let the dismissing one finish
113
+ # on its own.
114
+ page._dialogs.controls.append(dialog)
115
+ ref.current = dialog
116
+ page.session.schedule_update(page._dialogs)
117
+ elif prev is not None and prev.open:
118
+ # Dismiss: flip open=False and patch the dialog directly. The
119
+ # frozen-patch path above swaps the dialog instance in
120
+ # `_dialogs.controls`, which desyncs `_dialogs.__prev_lists`
121
+ # — so a `schedule_update(_dialogs)` here would miss the
122
+ # `open=False` delta entirely. Patching `prev` directly is both
123
+ # cheaper (one op vs a full list diff) and unaffected by the
124
+ # list-snapshot state.
125
+ prev.open = False
126
+ page.session.patch_control(prev)
127
+
128
+ def _cleanup():
129
+ d = ref.current
130
+ if d is not None:
131
+ ref.current = None
132
+ if d.open:
133
+ d.open = False
134
+ page.session.patch_control(d)
135
+
136
+ use_effect(lambda: None, dependencies=[], cleanup=_cleanup)
@@ -151,7 +151,6 @@ class Observable:
151
151
  """
152
152
  Remove the subscribed listener from this observable.
153
153
  """
154
-
155
154
  with contextlib.suppress(KeyError):
156
155
  self.__listeners.remove(fn)
157
156