Skip to content
Draft
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions client/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,7 @@ void main([List<String>? args]) async {
assetsDir = args[2];
debugPrint("Args contain a path assets directory: $assetsDir}");
}
} else if (!kDebugMode &&
(Platform.isWindows || Platform.isMacOS || Platform.isLinux)) {
} else if (!kDebugMode && isDesktopPlatform()) {
throw Exception(
'In desktop mode Flet app URL must be provided as a first argument.');
}
Expand Down
18 changes: 18 additions & 0 deletions packages/flet/lib/src/controls/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import '../utils/session_store_web.dart'
import '../utils/theme.dart';
import '../utils/time.dart';
import '../utils/user_fonts.dart';
import '../utils/web_interface.dart'
if (dart.library.io) "../utils/io_interface.dart";
import '../widgets/animated_transition_page.dart';
import '../widgets/loading_page.dart';
import '../widgets/page_context.dart';
Expand Down Expand Up @@ -197,6 +199,22 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
await SystemChrome.setPreferredOrientations(orientations);
}
break;
case "set_fullscreen":
final value = parseBool(args["value"]);
if (value != null) {
if (isDesktopPlatform() || isWebPlatform()) {
await setWindowFullScreen(value);
} else if (isMobilePlatform()) {
if (value) {
await SystemChrome.setEnabledSystemUIMode(
SystemUiMode.immersiveSticky);
} else {
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
overlays: SystemUiOverlay.values);
}
}
}
break;

default:
throw Exception("Unknown Page method: $name");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import 'dart:typed_data';
import 'dart:io';
import 'dart:typed_data';

import 'desktop.dart' as desktop show setWindowFullScreen;

Future<ByteData> fetchFontFromFile(String path) async {
File file = File(path);
Uint8List bytes = await file.readAsBytes();
return ByteData.view(bytes.buffer);
}

Future setWindowFullScreen(bool fullScreen) async {
await desktop.setWindowFullScreen(fullScreen);
}
2 changes: 1 addition & 1 deletion packages/flet/lib/src/utils/user_fonts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;

import '../models/control.dart';
import 'user_fonts_web.dart' if (dart.library.io) "user_fonts_io.dart";
import 'web_interface.dart' if (dart.library.io) "io_interface.dart";

class UserFonts {
static Map<String, FontLoader> fontLoaders = {};
Expand Down
5 changes: 0 additions & 5 deletions packages/flet/lib/src/utils/user_fonts_web.dart

This file was deleted.

15 changes: 15 additions & 0 deletions packages/flet/lib/src/utils/web_interface.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'dart:typed_data';

import 'package:web/web.dart' as web show window;

Future<ByteData> fetchFontFromFile(String path) async {
throw UnimplementedError();
}

Future setWindowFullScreen(bool fullScreen) async {
if (fullScreen) {
web.window.document.documentElement?.requestFullscreen();
} else {
web.window.document.exitFullscreen();
}
}
22 changes: 22 additions & 0 deletions sdk/python/examples/controls/page/fullscreen.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import flet as ft


def main(page: ft.Page) -> None:
page.vertical_alignment = ft.MainAxisAlignment.CENTER
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

def handle_fullscreen_change(e: ft.Event[ft.Switch]):
page.full_screen = e.control.value

page.add(
ft.SafeArea(
ft.Switch(
value=page.full_screen,
label="Toggle Fullscreen",
on_change=handle_fullscreen_change,
),
)
)


ft.run(main)
15 changes: 15 additions & 0 deletions sdk/python/packages/flet/docs/controls/page.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,21 @@ Shows how to lock your app to specific device orientations
--8<-- "{{ examples }}/app_exit_confirm_dialog.py"
```

### Toggle Fullscreen

This example demonstrates how to toggle fullscreen mode in a Flet application.

/// admonition
type: note
[`Page.full_screen`][flet.] is cross-platform (mobile, desktop and web), whereas
[`Page.window.full_screen`][flet.Window.full_screen] is desktop only.
///


```python
--8<-- "{{ examples }}/fullscreen.py"
```

### Hidden app window on startup

```python
Expand Down
22 changes: 22 additions & 0 deletions sdk/python/packages/flet/src/flet/controls/page.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,28 @@ class Page(BasePage):
Usage example [here](https://flet.dev/docs/cookbook/fonts#importing-fonts).
"""

@property
def full_screen(self) -> bool:
"""
Requests fullscreen mode for the host window or browser.

Set to `True` to hide the host system chrome; set to `False` to restore it.
"""
return getattr(
self,
"__full_screen",
self.page.window.full_screen if self.page.platform.is_desktop() else False,
)

@full_screen.setter
def full_screen(self, value: bool) -> None:
self.__full_screen = value
if self.page.platform.is_desktop() and not self.page.web:
self.page.window.full_screen = value
asyncio.create_task(
self._invoke_method("set_fullscreen", arguments={"value": value})
)

on_platform_brightness_change: Optional[
EventHandler[PlatformBrightnessChangeEvent]
] = None
Expand Down
Loading