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.
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/PKG-INFO +9 -9
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/pyproject.toml +9 -9
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/__init__.py +30 -2
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component.py +16 -0
- flet-0.85.0.dev2/src/flet/components/hooks/use_dialog.py +136 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/observable.py +0 -1
- flet-0.85.0.dev2/src/flet/components/router.py +699 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/base_page.py +48 -4
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/border.py +0 -42
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/border_radius.py +0 -61
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control.py +4 -1
- flet-0.85.0.dev2/src/flet/controls/core/drag_target.py +199 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/flet_app.py +32 -2
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/responsive_row.py +21 -2
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/margin.py +1 -34
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/container.py +10 -2
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/datatable.py +6 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/date_picker.py +10 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/date_range_picker.py +10 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/dropdownm2.py +6 -0
- flet-0.85.0.dev2/src/flet/controls/material/navigation_drawer.py +167 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/tabs.py +32 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/object_patch.py +44 -3
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/padding.py +0 -36
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/page.py +159 -15
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/scrollable_control.py +3 -2
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/theme.py +14 -4
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/protocol.py +7 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/session.py +88 -3
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/flet_test_app.py +214 -35
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/tester.py +85 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/griffe_deprecations.py +89 -1
- flet-0.85.0.dev2/src/flet/utils/linux_deps.py +36 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/version.py +12 -7
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/PKG-INFO +9 -9
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/SOURCES.txt +5 -1
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/requires.txt +8 -8
- flet-0.85.0.dev2/tests/test_component_diff.py +141 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_deprecated.py +15 -3
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_griffe_deprecations.py +50 -7
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_skip_double_update.py +48 -1
- flet-0.85.0.dev2/tests/test_use_dialog.py +582 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_validation.py +1 -1
- flet-0.85.0.dev2/tests/test_version.py +43 -0
- flet-0.85.0.dev0/src/flet/components/hooks/use_dialog.py +0 -71
- flet-0.85.0.dev0/src/flet/controls/core/drag_target.py +0 -141
- flet-0.85.0.dev0/src/flet/controls/material/navigation_drawer.py +0 -152
- flet-0.85.0.dev0/tests/test_use_dialog.py +0 -166
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/README.md +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/setup.cfg +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/app.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/authorization.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/authorization_service.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/group.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/oauth_provider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/oauth_token.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/github_oauth_provider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/providers/google_oauth_provider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/auth/user.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/canvas/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/cli.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component_decorator.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/component_owned.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/hook.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_callback.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_context.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_effect.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_memo.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_ref.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/hooks/use_state.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/memo.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/public_utils.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/components/utils.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/adaptive_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/alignment.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/animation.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/base_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/blur.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/box.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/buttons.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/colors.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/context.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control_event.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/control_state.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/animated_switcher.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/autofill_group.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/arc.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/canvas.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/circle.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/color.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/fill.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/image.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/line.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/oval.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/path.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/points.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/rect.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/shadow.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/shape.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/canvas/text.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/column.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/dismissible.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/draggable.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/gesture_detector.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/grid_view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/hero.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/icon.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/image.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/interactive_viewer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/keyboard_listener.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/list_view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/markdown.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/merge_semantics.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/page_view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/pagelet.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/placeholder.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/rotated_box.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/row.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/safe_area.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/screenshot.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/semantics.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/shader_mask.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/shimmer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/stack.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/text.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/text_span.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/transparent_pointer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/window.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/core/window_drag_area.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/device_info.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/dialog_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/duration.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/embed_json_encoder.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/events.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/exceptions.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/geometry.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/gradients.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/icon_data.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/id_counter.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/keys.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/layout_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/alert_dialog.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/app_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/auto_complete.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/badge.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/banner.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/bottom_app_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/bottom_sheet.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/card.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/checkbox.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/chip.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/circle_avatar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/context_menu.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/divider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/dropdown.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/elevated_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/expansion_panel.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/expansion_tile.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/filled_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/filled_tonal_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/floating_action_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/form_field_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icon_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.json +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/icons.pyi +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/list_tile.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/menu_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/menu_item_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/navigation_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/navigation_rail.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/outlined_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/popup_menu_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/progress_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/progress_ring.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/radio.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/radio_group.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/range_slider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/reorderable_list_view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/search_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/segmented_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/selection_area.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/slider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/snack_bar.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/submenu_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/switch.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/text_button.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/textfield.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/time_picker.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/tooltip.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/material/vertical_divider.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/multi_view.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/painting.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/query_string.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/ref.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/accelerometer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/barometer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/battery.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/browser_context_menu.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/clipboard.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/connectivity.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/file_picker.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/gyroscope.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/haptic_feedback.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/magnetometer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/screen_brightness.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/semantics_service.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/sensor_error_event.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/service.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/shake_detector.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/share.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/shared_preferences.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/storage_paths.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/url_launcher.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/user_accelerometer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/services/wakelock.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/template_route.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/text_style.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/transform.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/types.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/controls/value_types.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/fastapi/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/connection.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/flet_socket_server.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/pyodide_connection.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/messaging/session_store.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/pubsub_client.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/pubsub/pubsub_hub.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/py.typed +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/security/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/testing/finder.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/__init__.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/browser.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/classproperty.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/deprecated.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/deprecated_enum.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/files.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/from_dict.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/hashing.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/json_utils.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/locks.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/network.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/object_model.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/once.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/pip.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/platform_utils.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/slugify.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/strings.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/typing_utils.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/validation.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet/utils/vector.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/dependency_links.txt +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/entry_points.txt +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/src/flet.egg-info/top_level.txt +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_auth_lazy_imports.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_base_control.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_colors.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_component_effects.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_component_renderer.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_dataclasses.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_datetime.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_events.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_from_dict.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_icons.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_frozen.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_in_place.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_memory_churn.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_object_diff_performance.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_observable.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_patch_dataclass.py +0 -0
- {flet-0.85.0.dev0 → flet-0.85.0.dev2}/tests/test_session_disconnect_buffering.py +0 -0
- {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.
|
|
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.
|
|
13
|
-
Requires-Dist: flet-web==0.85.0.
|
|
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.
|
|
21
|
-
Requires-Dist: flet-web==0.85.0.
|
|
22
|
-
Requires-Dist: flet-desktop==0.85.0.
|
|
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.
|
|
24
|
+
Requires-Dist: flet-cli==0.85.0.dev2; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==0.85.0.
|
|
26
|
+
Requires-Dist: flet-desktop==0.85.0.dev2; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==0.85.0.
|
|
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.
|
|
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.
|
|
11
|
-
"flet-web==0.85.0.
|
|
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.
|
|
27
|
-
"flet-web==0.85.0.
|
|
28
|
-
"flet-desktop==0.85.0.
|
|
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.
|
|
30
|
+
cli = ["flet-cli==0.85.0.dev2"]
|
|
31
31
|
desktop = [
|
|
32
|
-
"flet-desktop==0.85.0.
|
|
32
|
+
"flet-desktop==0.85.0.dev2",
|
|
33
33
|
]
|
|
34
|
-
web = ["flet-web==0.85.0.
|
|
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
|
|
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)
|