flet 0.85.0.dev0__tar.gz → 0.85.0.dev2__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 (317) hide show
  1. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/PKG-INFO +9 -9
  2. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/pyproject.toml +9 -9
  3. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/__init__.py +30 -2
  4. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component.py +16 -0
  5. flet-0.85.0.dev2/src/flet/components/hooks/use_dialog.py +136 -0
  6. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/observable.py +0 -1
  7. flet-0.85.0.dev2/src/flet/components/router.py +699 -0
  8. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/base_page.py +48 -4
  9. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/border.py +0 -42
  10. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/border_radius.py +0 -61
  11. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control.py +4 -1
  12. flet-0.85.0.dev2/src/flet/controls/core/drag_target.py +199 -0
  13. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/flet_app.py +32 -2
  14. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/responsive_row.py +21 -2
  15. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/margin.py +1 -34
  16. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/container.py +10 -2
  17. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/datatable.py +6 -0
  18. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/date_picker.py +10 -0
  19. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/date_range_picker.py +10 -0
  20. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/dropdownm2.py +6 -0
  21. flet-0.85.0.dev2/src/flet/controls/material/navigation_drawer.py +167 -0
  22. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/tabs.py +32 -0
  23. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/object_patch.py +44 -3
  24. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/padding.py +0 -36
  25. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/page.py +159 -15
  26. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/scrollable_control.py +3 -2
  27. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/theme.py +14 -4
  28. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/protocol.py +7 -0
  29. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/session.py +88 -3
  30. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/flet_test_app.py +214 -35
  31. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/tester.py +85 -0
  32. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/griffe_deprecations.py +89 -1
  33. flet-0.85.0.dev2/src/flet/utils/linux_deps.py +36 -0
  34. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/version.py +12 -7
  35. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/PKG-INFO +9 -9
  36. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/SOURCES.txt +5 -1
  37. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/requires.txt +8 -8
  38. flet-0.85.0.dev2/tests/test_component_diff.py +141 -0
  39. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_deprecated.py +15 -3
  40. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_griffe_deprecations.py +50 -7
  41. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_skip_double_update.py +48 -1
  42. flet-0.85.0.dev2/tests/test_use_dialog.py +582 -0
  43. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_validation.py +1 -1
  44. flet-0.85.0.dev2/tests/test_version.py +43 -0
  45. flet-0.85.0.dev0/src/flet/components/hooks/use_dialog.py +0 -71
  46. flet-0.85.0.dev0/src/flet/controls/core/drag_target.py +0 -141
  47. flet-0.85.0.dev0/src/flet/controls/material/navigation_drawer.py +0 -152
  48. flet-0.85.0.dev0/tests/test_use_dialog.py +0 -166
  49. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/README.md +0 -0
  50. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/setup.cfg +0 -0
  51. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/app.py +0 -0
  52. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/__init__.py +0 -0
  53. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/authorization.py +0 -0
  54. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/authorization_service.py +0 -0
  55. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/group.py +0 -0
  56. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/oauth_provider.py +0 -0
  57. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/oauth_token.py +0 -0
  58. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/__init__.py +0 -0
  59. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  60. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  61. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  62. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  63. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/user.py +0 -0
  64. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/canvas/__init__.py +0 -0
  65. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/cli.py +0 -0
  66. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/__init__.py +0 -0
  67. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component_decorator.py +0 -0
  68. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component_owned.py +0 -0
  69. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/__init__.py +0 -0
  70. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/hook.py +0 -0
  71. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_callback.py +0 -0
  72. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_context.py +0 -0
  73. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_effect.py +0 -0
  74. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_memo.py +0 -0
  75. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_ref.py +0 -0
  76. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_state.py +0 -0
  77. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/memo.py +0 -0
  78. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/public_utils.py +0 -0
  79. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/utils.py +0 -0
  80. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/__init__.py +0 -0
  81. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/adaptive_control.py +0 -0
  82. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/alignment.py +0 -0
  83. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/animation.py +0 -0
  84. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/base_control.py +0 -0
  85. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/blur.py +0 -0
  86. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/box.py +0 -0
  87. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/buttons.py +0 -0
  88. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/colors.py +0 -0
  89. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/context.py +0 -0
  90. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control_event.py +0 -0
  91. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control_state.py +0 -0
  92. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/__init__.py +0 -0
  93. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/animated_switcher.py +0 -0
  94. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/autofill_group.py +0 -0
  95. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/__init__.py +0 -0
  96. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/arc.py +0 -0
  97. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/canvas.py +0 -0
  98. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/circle.py +0 -0
  99. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/color.py +0 -0
  100. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/fill.py +0 -0
  101. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/image.py +0 -0
  102. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/line.py +0 -0
  103. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/oval.py +0 -0
  104. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/path.py +0 -0
  105. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/points.py +0 -0
  106. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/rect.py +0 -0
  107. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/shadow.py +0 -0
  108. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/shape.py +0 -0
  109. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/text.py +0 -0
  110. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/column.py +0 -0
  111. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/dismissible.py +0 -0
  112. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/draggable.py +0 -0
  113. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/gesture_detector.py +0 -0
  114. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/grid_view.py +0 -0
  115. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/hero.py +0 -0
  116. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/icon.py +0 -0
  117. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/image.py +0 -0
  118. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/interactive_viewer.py +0 -0
  119. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/keyboard_listener.py +0 -0
  120. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/list_view.py +0 -0
  121. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/markdown.py +0 -0
  122. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/merge_semantics.py +0 -0
  123. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/page_view.py +0 -0
  124. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/pagelet.py +0 -0
  125. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/placeholder.py +0 -0
  126. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  127. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/rotated_box.py +0 -0
  128. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/row.py +0 -0
  129. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/safe_area.py +0 -0
  130. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/screenshot.py +0 -0
  131. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/semantics.py +0 -0
  132. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/shader_mask.py +0 -0
  133. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/shimmer.py +0 -0
  134. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/stack.py +0 -0
  135. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/text.py +0 -0
  136. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/text_span.py +0 -0
  137. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/transparent_pointer.py +0 -0
  138. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/view.py +0 -0
  139. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/window.py +0 -0
  140. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/window_drag_area.py +0 -0
  141. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/__init__.py +0 -0
  142. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  143. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  144. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  145. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  146. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  147. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  148. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  149. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  150. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  151. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  152. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  153. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  154. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  155. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  156. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  157. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  158. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  159. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  160. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  161. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  162. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  163. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  164. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  165. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  166. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  167. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  168. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  169. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  170. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/device_info.py +0 -0
  171. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/dialog_control.py +0 -0
  172. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/duration.py +0 -0
  173. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/embed_json_encoder.py +0 -0
  174. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/events.py +0 -0
  175. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/exceptions.py +0 -0
  176. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/geometry.py +0 -0
  177. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/gradients.py +0 -0
  178. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/icon_data.py +0 -0
  179. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/id_counter.py +0 -0
  180. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/keys.py +0 -0
  181. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/layout_control.py +0 -0
  182. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/__init__.py +0 -0
  183. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/alert_dialog.py +0 -0
  184. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/app_bar.py +0 -0
  185. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/auto_complete.py +0 -0
  186. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/badge.py +0 -0
  187. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/banner.py +0 -0
  188. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/bottom_app_bar.py +0 -0
  189. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/bottom_sheet.py +0 -0
  190. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/button.py +0 -0
  191. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/card.py +0 -0
  192. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/checkbox.py +0 -0
  193. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/chip.py +0 -0
  194. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/circle_avatar.py +0 -0
  195. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/context_menu.py +0 -0
  196. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/divider.py +0 -0
  197. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/dropdown.py +0 -0
  198. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/elevated_button.py +0 -0
  199. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/expansion_panel.py +0 -0
  200. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/expansion_tile.py +0 -0
  201. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/filled_button.py +0 -0
  202. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/filled_tonal_button.py +0 -0
  203. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/floating_action_button.py +0 -0
  204. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/form_field_control.py +0 -0
  205. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icon_button.py +0 -0
  206. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.json +0 -0
  207. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.py +0 -0
  208. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.pyi +0 -0
  209. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/list_tile.py +0 -0
  210. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/menu_bar.py +0 -0
  211. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/menu_item_button.py +0 -0
  212. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/navigation_bar.py +0 -0
  213. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/navigation_rail.py +0 -0
  214. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/outlined_button.py +0 -0
  215. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/popup_menu_button.py +0 -0
  216. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/progress_bar.py +0 -0
  217. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/progress_ring.py +0 -0
  218. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/radio.py +0 -0
  219. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/radio_group.py +0 -0
  220. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/range_slider.py +0 -0
  221. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/reorderable_list_view.py +0 -0
  222. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/search_bar.py +0 -0
  223. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/segmented_button.py +0 -0
  224. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/selection_area.py +0 -0
  225. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/slider.py +0 -0
  226. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/snack_bar.py +0 -0
  227. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/submenu_button.py +0 -0
  228. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/switch.py +0 -0
  229. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/text_button.py +0 -0
  230. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/textfield.py +0 -0
  231. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/time_picker.py +0 -0
  232. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/tooltip.py +0 -0
  233. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/vertical_divider.py +0 -0
  234. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/multi_view.py +0 -0
  235. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/painting.py +0 -0
  236. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/query_string.py +0 -0
  237. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/ref.py +0 -0
  238. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/__init__.py +0 -0
  239. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/accelerometer.py +0 -0
  240. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/barometer.py +0 -0
  241. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/battery.py +0 -0
  242. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/browser_context_menu.py +0 -0
  243. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/clipboard.py +0 -0
  244. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/connectivity.py +0 -0
  245. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/file_picker.py +0 -0
  246. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/gyroscope.py +0 -0
  247. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/haptic_feedback.py +0 -0
  248. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/magnetometer.py +0 -0
  249. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/screen_brightness.py +0 -0
  250. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/semantics_service.py +0 -0
  251. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/sensor_error_event.py +0 -0
  252. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/service.py +0 -0
  253. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/shake_detector.py +0 -0
  254. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/share.py +0 -0
  255. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/shared_preferences.py +0 -0
  256. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/storage_paths.py +0 -0
  257. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/url_launcher.py +0 -0
  258. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/user_accelerometer.py +0 -0
  259. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/wakelock.py +0 -0
  260. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/template_route.py +0 -0
  261. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/text_style.py +0 -0
  262. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/transform.py +0 -0
  263. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/types.py +0 -0
  264. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/value_types.py +0 -0
  265. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/fastapi/__init__.py +0 -0
  266. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/connection.py +0 -0
  267. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/flet_socket_server.py +0 -0
  268. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/pyodide_connection.py +0 -0
  269. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/session_store.py +0 -0
  270. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/__init__.py +0 -0
  271. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/pubsub_client.py +0 -0
  272. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/pubsub_hub.py +0 -0
  273. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/py.typed +0 -0
  274. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/security/__init__.py +0 -0
  275. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/__init__.py +0 -0
  276. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/finder.py +0 -0
  277. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/__init__.py +0 -0
  278. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/browser.py +0 -0
  279. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/classproperty.py +0 -0
  280. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/deprecated.py +0 -0
  281. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/deprecated_enum.py +0 -0
  282. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/files.py +0 -0
  283. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/from_dict.py +0 -0
  284. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/hashing.py +0 -0
  285. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/json_utils.py +0 -0
  286. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/locks.py +0 -0
  287. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/network.py +0 -0
  288. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/object_model.py +0 -0
  289. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/once.py +0 -0
  290. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/pip.py +0 -0
  291. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/platform_utils.py +0 -0
  292. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/slugify.py +0 -0
  293. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/strings.py +0 -0
  294. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/typing_utils.py +0 -0
  295. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/validation.py +0 -0
  296. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/vector.py +0 -0
  297. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/dependency_links.txt +0 -0
  298. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/entry_points.txt +0 -0
  299. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/top_level.txt +0 -0
  300. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_auth_lazy_imports.py +0 -0
  301. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_base_control.py +0 -0
  302. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_colors.py +0 -0
  303. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_component_effects.py +0 -0
  304. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_component_renderer.py +0 -0
  305. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_dataclasses.py +0 -0
  306. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_datetime.py +0 -0
  307. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_events.py +0 -0
  308. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_from_dict.py +0 -0
  309. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_icons.py +0 -0
  310. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_frozen.py +0 -0
  311. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_in_place.py +0 -0
  312. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_memory_churn.py +0 -0
  313. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_performance.py +0 -0
  314. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_observable.py +0 -0
  315. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_patch_dataclass.py +0 -0
  316. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_session_disconnect_buffering.py +0 -0
  317. {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_validation_benchmark.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.85.0.dev0
3
+ Version: 0.85.0.dev2
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.85.0.dev0; extra == "cli"
13
- Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
12
+ Requires-Dist: flet-cli==0.85.0.dev2; extra == "cli"
13
+ Requires-Dist: flet-web==0.85.0.dev2; 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.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"
20
+ Requires-Dist: flet-cli==0.85.0.dev2; extra == "all"
21
+ Requires-Dist: flet-web==0.85.0.dev2; extra == "all"
22
+ Requires-Dist: flet-desktop==0.85.0.dev2; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.85.0.dev0; extra == "cli"
24
+ Requires-Dist: flet-cli==0.85.0.dev2; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.85.0.dev0; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.85.0.dev2; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.85.0.dev0; extra == "web"
28
+ Requires-Dist: flet-web==0.85.0.dev2; 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.85.0.dev0"
3
+ version = "0.85.0.dev2"
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.85.0.dev0; extra == 'cli'",
11
- "flet-web==0.85.0.dev0; extra == 'web'",
10
+ "flet-cli==0.85.0.dev2; extra == 'cli'",
11
+ "flet-web==0.85.0.dev2; 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.85.0.dev0",
27
- "flet-web==0.85.0.dev0",
28
- "flet-desktop==0.85.0.dev0",
26
+ "flet-cli==0.85.0.dev2",
27
+ "flet-web==0.85.0.dev2",
28
+ "flet-desktop==0.85.0.dev2",
29
29
  ]
30
- cli = ["flet-cli==0.85.0.dev0"]
30
+ cli = ["flet-cli==0.85.0.dev2"]
31
31
  desktop = [
32
- "flet-desktop==0.85.0.dev0",
32
+ "flet-desktop==0.85.0.dev2",
33
33
  ]
34
- web = ["flet-web==0.85.0.dev0"]
34
+ web = ["flet-web==0.85.0.dev2"]
35
35
 
36
36
  [project.scripts]
37
37
  flet = "flet.cli:main"
@@ -4,7 +4,11 @@ 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
+ )
8
12
  from flet.components.hooks.use_dialog import use_dialog
9
13
  from flet.components.hooks.use_effect import (
10
14
  on_mounted,
@@ -18,6 +22,17 @@ from flet.components.hooks.use_state import use_state
18
22
  from flet.components.memo import memo
19
23
  from flet.components.observable import Observable, observable
20
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
+ )
21
36
  from flet.controls import alignment, border, border_radius, margin, padding
22
37
  from flet.controls.adaptive_control import AdaptiveControl
23
38
  from flet.controls.alignment import Alignment, Axis
@@ -103,7 +118,7 @@ from flet.controls.core.drag_target import (
103
118
  DragWillAcceptEvent,
104
119
  )
105
120
  from flet.controls.core.draggable import Draggable
106
- from flet.controls.core.flet_app import FletApp
121
+ from flet.controls.core.flet_app import FletApp, FletAppOutputEvent
107
122
  from flet.controls.core.gesture_detector import GestureDetector
108
123
  from flet.controls.core.grid_view import GridView
109
124
  from flet.controls.core.hero import Hero
@@ -410,6 +425,7 @@ from flet.controls.page import (
410
425
  PlatformBrightnessChangeEvent,
411
426
  RouteChangeEvent,
412
427
  ViewPopEvent,
428
+ ViewsPopUntilEvent,
413
429
  )
414
430
  from flet.controls.painting import (
415
431
  Paint,
@@ -700,6 +716,7 @@ __all__ = [
700
716
  "ContextMenuDismissEvent",
701
717
  "ContextMenuSelectEvent",
702
718
  "ContextMenuTrigger",
719
+ "ContextProvider",
703
720
  "ContinuousRectangleBorder",
704
721
  "Control",
705
722
  "ControlEvent",
@@ -797,6 +814,7 @@ __all__ = [
797
814
  "FilledTonalIconButton",
798
815
  "FilterQuality",
799
816
  "FletApp",
817
+ "FletAppOutputEvent",
800
818
  "FletException",
801
819
  "FletPageDisconnectedException",
802
820
  "FletUnimplementedPlatformException",
@@ -854,6 +872,7 @@ __all__ = [
854
872
  "Locale",
855
873
  "LocaleChangeEvent",
856
874
  "LocaleConfiguration",
875
+ "LocationInfo",
857
876
  "LoginEvent",
858
877
  "LongPressDownEvent",
859
878
  "LongPressEndEvent",
@@ -951,8 +970,10 @@ __all__ = [
951
970
  "RotateValue",
952
971
  "RotatedBox",
953
972
  "RoundedRectangleBorder",
973
+ "Route",
954
974
  "RouteChangeEvent",
955
975
  "RouteUrlStrategy",
976
+ "Router",
956
977
  "Row",
957
978
  "SafeArea",
958
979
  "Scale",
@@ -1073,6 +1094,7 @@ __all__ = [
1073
1094
  "VerticalDivider",
1074
1095
  "View",
1075
1096
  "ViewPopEvent",
1097
+ "ViewsPopUntilEvent",
1076
1098
  "VisualDensity",
1077
1099
  "Wakelock",
1078
1100
  "WebBrowserName",
@@ -1100,6 +1122,7 @@ __all__ = [
1100
1122
  "dropdown",
1101
1123
  "dropdownm2",
1102
1124
  "icons",
1125
+ "is_route_active",
1103
1126
  "margin",
1104
1127
  "memo",
1105
1128
  "observable",
@@ -1116,7 +1139,12 @@ __all__ = [
1116
1139
  "use_effect",
1117
1140
  "use_memo",
1118
1141
  "use_ref",
1142
+ "use_route_loader_data",
1143
+ "use_route_location",
1144
+ "use_route_outlet",
1145
+ "use_route_params",
1119
1146
  "use_state",
1147
+ "use_view_path",
1120
1148
  "value",
1121
1149
  ]
1122
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