Skip to content

Commit 8aa0f1b

Browse files
Move system_overlay_style from AppBar to Theme (#2667)
* move systemOverlayStyle to Theme * Introduced SystemUiOverlayStyleTheme * Using `AnnotatedRegion` to apply system overlay style * Cleanup --------- Co-authored-by: Feodor Fitsner <[email protected]>
1 parent 2ee9e60 commit 8aa0f1b

File tree

7 files changed

+105
-75
lines changed

7 files changed

+105
-75
lines changed

packages/flet/lib/src/controls/app_bar.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22

33
import '../models/control.dart';
44
import '../utils/colors.dart';
5-
import '../utils/overlay_style.dart';
5+
import '../utils/theme.dart';
66
import 'create_control.dart';
77
import 'cupertino_app_bar.dart';
88
import 'flet_store_mixin.dart';
@@ -57,8 +57,6 @@ class AppBarControl extends StatelessWidget
5757
Theme.of(context), control.attrString("color", "")!);
5858
var bgcolor = HexColor.fromString(
5959
Theme.of(context), control.attrString("bgcolor", "")!);
60-
var systemOverlayStyle = parseSystemOverlayStyle(
61-
Theme.of(context), control, "systemOverlayStyle");
6260

6361
return AppBar(
6462
leading: leadingCtrls.isNotEmpty
@@ -80,7 +78,9 @@ class AppBarControl extends StatelessWidget
8078
.map((c) => createControl(control, c.id, control.isDisabled,
8179
parentAdaptive: adaptive))
8280
.toList(),
83-
systemOverlayStyle: systemOverlayStyle,
81+
systemOverlayStyle: Theme.of(context)
82+
.extension<SystemUiOverlayStyleTheme>()
83+
?.systemUiOverlayStyle,
8484
);
8585
});
8686
}

packages/flet/lib/src/controls/page.dart

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,15 @@ class _ViewControlState extends State<ViewControl> with FletStoreMixin {
937937
...widget.overlayWidgets
938938
]);
939939

940+
var materialTheme = widget.themeMode == ThemeMode.light ||
941+
((widget.themeMode == null ||
942+
widget.themeMode == ThemeMode.system) &&
943+
widget.brightness == Brightness.light)
944+
? parseTheme(widget.parent, "theme", Brightness.light)
945+
: widget.parent.attrString("darkTheme") != null
946+
? parseTheme(widget.parent, "darkTheme", Brightness.dark)
947+
: parseTheme(widget.parent, "theme", Brightness.dark);
948+
940949
Widget scaffold = Scaffold(
941950
key: bar == null || bar is AppBarControl ? scaffoldKey : null,
942951
backgroundColor: HexColor.fromString(
@@ -983,6 +992,18 @@ class _ViewControlState extends State<ViewControl> with FletStoreMixin {
983992
floatingActionButtonLocation: fabLocation,
984993
);
985994

995+
var systemOverlayStyle =
996+
materialTheme.extension<SystemUiOverlayStyleTheme>();
997+
998+
if (systemOverlayStyle != null &&
999+
systemOverlayStyle.systemUiOverlayStyle != null &&
1000+
bar == null) {
1001+
scaffold = AnnotatedRegion<SystemUiOverlayStyle>(
1002+
value: systemOverlayStyle.systemUiOverlayStyle!,
1003+
child: scaffold,
1004+
);
1005+
}
1006+
9861007
if (bar is CupertinoAppBarControl) {
9871008
scaffold = CupertinoPageScaffold(
9881009
key: scaffoldKey,
@@ -1009,15 +1030,7 @@ class _ViewControlState extends State<ViewControl> with FletStoreMixin {
10091030
);
10101031
} else if (widget.widgetsDesign == PageDesign.cupertino) {
10111032
scaffold = Theme(
1012-
data: widget.themeMode == ThemeMode.light ||
1013-
((widget.themeMode == null ||
1014-
widget.themeMode == ThemeMode.system) &&
1015-
widget.brightness == Brightness.light)
1016-
? parseTheme(widget.parent, "theme", Brightness.light)
1017-
: widget.parent.attrString("darkTheme") != null
1018-
? parseTheme(
1019-
widget.parent, "darkTheme", Brightness.dark)
1020-
: parseTheme(widget.parent, "theme", Brightness.dark),
1033+
data: materialTheme,
10211034
child: scaffold,
10221035
);
10231036
}
Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,49 @@
1-
import 'dart:convert';
2-
31
import 'package:flutter/material.dart';
42
import 'package:flutter/services.dart';
53

6-
import '../models/control.dart';
74
import '../utils/numbers.dart';
85
import 'colors.dart';
96

10-
SystemUiOverlayStyle? parseSystemOverlayStyle(
11-
ThemeData theme, Control control, String propName) {
12-
dynamic j;
13-
var v = control.attrString(propName, null);
14-
if (v == null) {
15-
return null;
16-
}
17-
j = json.decode(v);
18-
return overlayStyleFromJson(theme, j);
19-
}
20-
217
SystemUiOverlayStyle overlayStyleFromJson(
22-
ThemeData theme, Map<String, dynamic> json) {
8+
ThemeData? theme, Map<String, dynamic> json, Brightness? brightness) {
239
return SystemUiOverlayStyle(
24-
statusBarColor: json["status_bar_color"] != null
25-
? HexColor.fromString(theme, json["status_bar_color"] ?? "")
26-
: null,
27-
systemNavigationBarColor: json["system_navigation_bar_color"] != null
28-
? HexColor.fromString(theme, json["system_navigation_bar_color"] ?? "")
29-
: null,
30-
systemNavigationBarDividerColor:
31-
json["system_navigation_bar_divider_color"] != null
32-
? HexColor.fromString(theme, json["system_navigation_bar_divider_color"] ?? "")
33-
: null,
34-
systemStatusBarContrastEnforced:
35-
json["enforce_system_status_bar_contrast"] != null
36-
? parseBool(json["enforce_system_status_bar_contrast"])
37-
: null,
38-
systemNavigationBarContrastEnforced:
39-
json["enforce_system_navigation_bar_contrast"] != null
40-
? parseBool(json["enforce_system_navigation_bar_contrast"])
41-
: null,
42-
);
10+
statusBarColor: json["status_bar_color"] != null
11+
? HexColor.fromString(theme, json["status_bar_color"] ?? "")
12+
: null,
13+
systemNavigationBarColor: json["system_navigation_bar_color"] != null
14+
? HexColor.fromString(
15+
theme, json["system_navigation_bar_color"] ?? "")
16+
: null,
17+
systemNavigationBarDividerColor:
18+
json["system_navigation_bar_divider_color"] != null
19+
? HexColor.fromString(
20+
theme, json["system_navigation_bar_divider_color"] ?? "")
21+
: null,
22+
systemStatusBarContrastEnforced:
23+
json["enforce_system_status_bar_contrast"] != null
24+
? parseBool(json["enforce_system_status_bar_contrast"])
25+
: null,
26+
systemNavigationBarContrastEnforced:
27+
json["enforce_system_navigation_bar_contrast"] != null
28+
? parseBool(json["enforce_system_navigation_bar_contrast"])
29+
: null,
30+
systemNavigationBarIconBrightness: parseBrightness(
31+
json["system_navigation_bar_icon_brightness"], brightness),
32+
statusBarBrightness:
33+
parseBrightness(json["status_bar_brightness"], brightness),
34+
statusBarIconBrightness:
35+
parseBrightness(json["status_bar_icon_brightness"], brightness));
36+
}
37+
38+
Brightness? parseBrightness(dynamic value, Brightness? brightness) {
39+
if (value == null) {
40+
return null;
41+
}
42+
var b = parseBool(value);
43+
Brightness? invertedBrightness = brightness != null
44+
? brightness == Brightness.light
45+
? Brightness.dark
46+
: Brightness.light
47+
: null;
48+
return b ? brightness : invertedBrightness;
4349
}

packages/flet/lib/src/utils/theme.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,34 @@ import 'dart:convert';
22

33
import 'package:flutter/cupertino.dart';
44
import 'package:flutter/material.dart';
5+
import 'package:flutter/services.dart';
56

67
import '../models/control.dart';
78
import 'borders.dart';
89
import 'colors.dart';
910
import 'edge_insets.dart';
1011
import 'material_state.dart';
1112
import 'numbers.dart';
13+
import 'overlay_style.dart';
1214
import 'text.dart';
1315

16+
class SystemUiOverlayStyleTheme
17+
extends ThemeExtension<SystemUiOverlayStyleTheme> {
18+
final SystemUiOverlayStyle? systemUiOverlayStyle;
19+
SystemUiOverlayStyleTheme(this.systemUiOverlayStyle);
20+
21+
@override
22+
ThemeExtension<SystemUiOverlayStyleTheme> copyWith() {
23+
return SystemUiOverlayStyleTheme(systemUiOverlayStyle);
24+
}
25+
26+
@override
27+
ThemeExtension<SystemUiOverlayStyleTheme> lerp(
28+
covariant ThemeExtension<SystemUiOverlayStyleTheme>? other, double t) {
29+
return this;
30+
}
31+
}
32+
1433
CupertinoThemeData parseCupertinoTheme(
1534
Control control, String propName, Brightness? brightness,
1635
{ThemeData? parentTheme}) {
@@ -79,7 +98,12 @@ ThemeData themeFromJson(Map<String, dynamic>? json, Brightness? brightness,
7998
scrollbarTheme: parseScrollBarTheme(theme, json?["scrollbar_theme"]),
8099
tabBarTheme: parseTabBarTheme(theme, json?["tabs_theme"]));
81100

101+
var systemOverlayStyle = json?["system_overlay_style"] != null
102+
? overlayStyleFromJson(theme, json?["system_overlay_style"], brightness)
103+
: null;
104+
82105
return theme.copyWith(
106+
extensions: {SystemUiOverlayStyleTheme(systemOverlayStyle)},
83107
cupertinoOverrideTheme: fixCupertinoTheme(
84108
MaterialBasedCupertinoThemeData(materialTheme: theme), theme));
85109
}

sdk/python/packages/flet-core/src/flet_core/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from flet_core.alignment import Alignment
2121
from flet_core.animated_switcher import AnimatedSwitcher, AnimatedSwitcherTransition
2222
from flet_core.animation import Animation, AnimationCurve
23-
from flet_core.app_bar import AppBar, SystemOverlayStyle
23+
from flet_core.app_bar import AppBar
2424
from flet_core.audio import Audio
2525
from flet_core.audio_recorder import AudioEncoder, AudioRecorder
2626
from flet_core.badge import Badge
@@ -216,6 +216,7 @@
216216
PageTransitionsTheme,
217217
PageTransitionTheme,
218218
ScrollbarTheme,
219+
SystemOverlayStyle,
219220
TabsTheme,
220221
TextTheme,
221222
Theme,

sdk/python/packages/flet-core/src/flet_core/app_bar.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
1-
import dataclasses
2-
from dataclasses import field
31
from typing import List, Optional
42

53
from flet_core.adaptive_control import AdaptiveControl
64
from flet_core.control import Control, OptionalNumber
75
from flet_core.ref import Ref
86

97

10-
@dataclasses.dataclass
11-
class SystemOverlayStyle:
12-
status_bar_color: Optional[str] = field(default=None)
13-
system_navigation_bar_color: Optional[str] = field(default=None)
14-
system_navigation_bar_divider_color: Optional[str] = field(default=None)
15-
enforce_system_navigation_bar_contrast: Optional[bool] = field(default=None)
16-
enforce_system_status_bar_contrast: Optional[bool] = field(default=None)
17-
18-
198
class AppBar(AdaptiveControl):
209
"""
2110
A material design app bar.
@@ -71,7 +60,6 @@ def __init__(
7160
toolbar_height: OptionalNumber = None,
7261
color: Optional[str] = None,
7362
bgcolor: Optional[str] = None,
74-
system_overlay_style: Optional[SystemOverlayStyle] = None,
7563
elevation: OptionalNumber = None,
7664
actions: Optional[List[Control]] = None,
7765
adaptive: Optional[bool] = None,
@@ -94,16 +82,10 @@ def __init__(
9482
self.bgcolor = bgcolor
9583
self.elevation = elevation
9684
self.actions = actions
97-
self.system_overlay_style = system_overlay_style
9885

9986
def _get_control_name(self):
10087
return "appbar"
10188

102-
def _before_build_command(self):
103-
super()._before_build_command()
104-
if dataclasses.is_dataclass(self.__system_overlay_style):
105-
self._set_attr_json("systemOverlayStyle", self.__system_overlay_style)
106-
10789
def _get_children(self):
10890
children = []
10991
if self.__leading:
@@ -160,15 +142,6 @@ def title(self) -> Optional[Control]:
160142
def title(self, value: Optional[Control]):
161143
self.__title = value
162144

163-
# system_overlay_style
164-
@property
165-
def system_overlay_style(self) -> Optional[SystemOverlayStyle]:
166-
return self.__system_overlay_style
167-
168-
@system_overlay_style.setter
169-
def system_overlay_style(self, value: Optional[SystemOverlayStyle]):
170-
self.__system_overlay_style = value
171-
172145
# center_title
173146
@property
174147
def center_title(self) -> Optional[bool]:

sdk/python/packages/flet-core/src/flet_core/theme.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,18 @@ class TabsTheme:
140140
overlay_color: Union[None, str, Dict[MaterialState, str]] = field(default=None)
141141

142142

143+
@dataclasses.dataclass
144+
class SystemOverlayStyle:
145+
status_bar_color: Optional[str] = field(default=None)
146+
system_navigation_bar_color: Optional[str] = field(default=None)
147+
system_navigation_bar_divider_color: Optional[str] = field(default=None)
148+
enforce_system_navigation_bar_contrast: Optional[bool] = field(default=None)
149+
enforce_system_status_bar_contrast: Optional[bool] = field(default=None)
150+
system_navigation_bar_icon_brightness: Optional[bool] = field(default=None)
151+
status_bar_brightness: Optional[bool] = field(default=None)
152+
status_bar_icon_brightness: Optional[bool] = field(default=None)
153+
154+
143155
@dataclasses.dataclass
144156
class Theme:
145157
color_scheme_seed: Optional[str] = field(default=None)
@@ -153,3 +165,4 @@ class Theme:
153165
use_material3: Optional[bool] = field(default=None)
154166
visual_density: ThemeVisualDensity = field(default=ThemeVisualDensity.STANDARD)
155167
page_transitions: PageTransitionsTheme = field(default_factory=PageTransitionsTheme)
168+
system_overlay_style: SystemOverlayStyle = field(default_factory=SystemOverlayStyle)

0 commit comments

Comments
 (0)