Skip to content

Commit ed672c5

Browse files
FloatingActionButtonLocation offset (#2411)
* offset type * CustomFloatingActionButtonLocation * Prevent FAB from winking when location changed --------- Co-authored-by: Feodor Fitsner <[email protected]>
1 parent 9f5a2ef commit ed672c5

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

package/lib/src/controls/floating_action_button.dart

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import '../utils/borders.dart';
66
import '../utils/colors.dart';
77
import '../utils/icons.dart';
88
import '../utils/launch_url.dart';
9+
import '../utils/transforms.dart';
910
import 'create_control.dart';
1011
import 'error.dart';
1112

@@ -129,9 +130,44 @@ FloatingActionButtonLocation parseFloatingActionButtonLocation(
129130
FloatingActionButtonLocation.startTop
130131
];
131132

132-
return fabLocations.firstWhere(
133-
(l) =>
134-
l.toString().split('.').last.toLowerCase() ==
135-
control.attrString(propName, "")!.toLowerCase(),
136-
orElse: () => defValue);
133+
try {
134+
OffsetDetails? fabLocationOffsetDetails = parseOffset(control, propName);
135+
if (fabLocationOffsetDetails != null) {
136+
return CustomFloatingActionButtonLocation(
137+
dx: fabLocationOffsetDetails.x, dy: fabLocationOffsetDetails.y);
138+
} else {
139+
return defValue;
140+
}
141+
} catch (e) {
142+
return fabLocations.firstWhere(
143+
(l) =>
144+
l.toString().split('.').last.toLowerCase() ==
145+
control.attrString(propName, "")!.toLowerCase(),
146+
orElse: () => defValue);
147+
}
148+
}
149+
150+
class CustomFloatingActionButtonLocation extends FloatingActionButtonLocation {
151+
final double dx;
152+
final double dy;
153+
154+
CustomFloatingActionButtonLocation({required this.dx, required this.dy});
155+
156+
@override
157+
Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
158+
return Offset(scaffoldGeometry.scaffoldSize.width - dx,
159+
scaffoldGeometry.scaffoldSize.height - dy);
160+
}
161+
162+
@override
163+
bool operator ==(Object other) =>
164+
other is CustomFloatingActionButtonLocation &&
165+
other.dx == dx &&
166+
other.dy == dy;
167+
168+
@override
169+
int get hashCode => dx.hashCode + dy.hashCode;
170+
171+
@override
172+
String toString() => 'CustomFloatingActionButtonLocation';
137173
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
CrossAxisAlignment,
4040
FloatingActionButtonLocation,
4141
MainAxisAlignment,
42+
OffsetValue,
4243
PaddingValue,
4344
PageDesignLanguage,
4445
PageDesignString,
@@ -1343,12 +1344,14 @@ def floating_action_button(self, value: Optional[FloatingActionButton]):
13431344

13441345
# floating_action_button_location
13451346
@property
1346-
def floating_action_button_location(self) -> Optional[FloatingActionButtonLocation]:
1347+
def floating_action_button_location(
1348+
self,
1349+
) -> Union[FloatingActionButtonLocation, OffsetValue]:
13471350
return self.__default_view.floating_action_button_location
13481351

13491352
@floating_action_button_location.setter
13501353
def floating_action_button_location(
1351-
self, value: Optional[FloatingActionButtonLocation]
1354+
self, value: Union[FloatingActionButtonLocation, OffsetValue]
13521355
):
13531356
self.__default_view.floating_action_button_location = value
13541357

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
MainAxisAlignmentString,
1919
PaddingValue,
2020
ScrollMode,
21+
OffsetValue,
2122
)
2223

2324

@@ -39,7 +40,9 @@ def __init__(
3940
appbar: Union[AppBar, CupertinoAppBar, None] = None,
4041
bottom_appbar: Optional[BottomAppBar] = None,
4142
floating_action_button: Optional[FloatingActionButton] = None,
42-
floating_action_button_location: Optional[FloatingActionButtonLocation] = None,
43+
floating_action_button_location: Union[
44+
FloatingActionButtonLocation, OffsetValue
45+
] = None,
4346
navigation_bar: Union[NavigationBar, CupertinoNavigationBar, None] = None,
4447
drawer: Optional[NavigationDrawer] = None,
4548
end_drawer: Optional[NavigationDrawer] = None,
@@ -91,6 +94,10 @@ def _get_control_name(self):
9194
def _before_build_command(self):
9295
super()._before_build_command()
9396
self._set_attr_json("padding", self.__padding)
97+
if not isinstance(self.__floating_action_button_location, (FloatingActionButtonLocation, str)):
98+
self._set_attr_json(
99+
"floatingActionButtonLocation", self.__floating_action_button_location
100+
)
94101

95102
def _get_children(self):
96103
children = []
@@ -158,11 +165,15 @@ def floating_action_button(self, value: Optional[FloatingActionButton]):
158165

159166
# floating_action_button_location
160167
@property
161-
def floating_action_button_location(self) -> FloatingActionButtonLocation:
168+
def floating_action_button_location(
169+
self,
170+
) -> Union[FloatingActionButtonLocation, OffsetValue]:
162171
return self.__floating_action_button_location
163172

164173
@floating_action_button_location.setter
165-
def floating_action_button_location(self, value: FloatingActionButtonLocation):
174+
def floating_action_button_location(
175+
self, value: Union[FloatingActionButtonLocation, OffsetValue]
176+
):
166177
self.__floating_action_button_location = value
167178
self._set_attr(
168179
"floatingActionButtonLocation",

0 commit comments

Comments
 (0)