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