Skip to content

Commit 4f975cb

Browse files
[framework] inline casts on Element.widget getter to improve web performance (#97822)
1 parent d2b5f34 commit 4f975cb

21 files changed

+124
-175
lines changed

packages/flutter/lib/src/cupertino/dialog.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -916,9 +916,6 @@ class _CupertinoDialogRenderElement extends RenderObjectElement {
916916
Element? _contentElement;
917917
Element? _actionsElement;
918918

919-
@override
920-
_CupertinoDialogRenderWidget get widget => super.widget as _CupertinoDialogRenderWidget;
921-
922919
@override
923920
_RenderCupertinoDialog get renderObject => super.renderObject as _RenderCupertinoDialog;
924921

@@ -935,8 +932,9 @@ class _CupertinoDialogRenderElement extends RenderObjectElement {
935932
@override
936933
void mount(Element? parent, Object? newSlot) {
937934
super.mount(parent, newSlot);
938-
_contentElement = updateChild(_contentElement, widget.contentSection, _AlertDialogSections.contentSection);
939-
_actionsElement = updateChild(_actionsElement, widget.actionsSection, _AlertDialogSections.actionsSection);
935+
final _CupertinoDialogRenderWidget dialogRenderWidget = widget as _CupertinoDialogRenderWidget;
936+
_contentElement = updateChild(_contentElement, dialogRenderWidget.contentSection, _AlertDialogSections.contentSection);
937+
_actionsElement = updateChild(_actionsElement, dialogRenderWidget.actionsSection, _AlertDialogSections.actionsSection);
940938
}
941939

942940
@override
@@ -957,8 +955,9 @@ class _CupertinoDialogRenderElement extends RenderObjectElement {
957955
@override
958956
void update(RenderObjectWidget newWidget) {
959957
super.update(newWidget);
960-
_contentElement = updateChild(_contentElement, widget.contentSection, _AlertDialogSections.contentSection);
961-
_actionsElement = updateChild(_actionsElement, widget.actionsSection, _AlertDialogSections.actionsSection);
958+
final _CupertinoDialogRenderWidget dialogRenderWidget = widget as _CupertinoDialogRenderWidget;
959+
_contentElement = updateChild(_contentElement, dialogRenderWidget.contentSection, _AlertDialogSections.contentSection);
960+
_actionsElement = updateChild(_actionsElement, dialogRenderWidget.actionsSection, _AlertDialogSections.actionsSection);
962961
}
963962

964963
@override

packages/flutter/lib/src/cupertino/text_form_field_row.dart

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -274,36 +274,35 @@ class _CupertinoTextFormFieldRowState extends FormFieldState<String> {
274274
TextEditingController? _controller;
275275

276276
TextEditingController? get _effectiveController =>
277-
widget.controller ?? _controller;
277+
_cupertinoTextFormFieldRow.controller ?? _controller;
278278

279-
@override
280-
CupertinoTextFormFieldRow get widget =>
279+
CupertinoTextFormFieldRow get _cupertinoTextFormFieldRow =>
281280
super.widget as CupertinoTextFormFieldRow;
282281

283282
@override
284283
void initState() {
285284
super.initState();
286-
if (widget.controller == null) {
285+
if (_cupertinoTextFormFieldRow.controller == null) {
287286
_controller = TextEditingController(text: widget.initialValue);
288287
} else {
289-
widget.controller!.addListener(_handleControllerChanged);
288+
_cupertinoTextFormFieldRow.controller!.addListener(_handleControllerChanged);
290289
}
291290
}
292291

293292
@override
294293
void didUpdateWidget(CupertinoTextFormFieldRow oldWidget) {
295294
super.didUpdateWidget(oldWidget);
296-
if (widget.controller != oldWidget.controller) {
295+
if (_cupertinoTextFormFieldRow.controller != oldWidget.controller) {
297296
oldWidget.controller?.removeListener(_handleControllerChanged);
298-
widget.controller?.addListener(_handleControllerChanged);
297+
_cupertinoTextFormFieldRow.controller?.addListener(_handleControllerChanged);
299298

300-
if (oldWidget.controller != null && widget.controller == null) {
299+
if (oldWidget.controller != null && _cupertinoTextFormFieldRow.controller == null) {
301300
_controller =
302301
TextEditingController.fromValue(oldWidget.controller!.value);
303302
}
304303

305-
if (widget.controller != null) {
306-
setValue(widget.controller!.text);
304+
if (_cupertinoTextFormFieldRow.controller != null) {
305+
setValue(_cupertinoTextFormFieldRow.controller!.text);
307306
if (oldWidget.controller == null) {
308307
_controller = null;
309308
}
@@ -313,7 +312,7 @@ class _CupertinoTextFormFieldRowState extends FormFieldState<String> {
313312

314313
@override
315314
void dispose() {
316-
widget.controller?.removeListener(_handleControllerChanged);
315+
_cupertinoTextFormFieldRow.controller?.removeListener(_handleControllerChanged);
317316
super.dispose();
318317
}
319318

packages/flutter/lib/src/cupertino/text_selection_toolbar.dart

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -522,9 +522,6 @@ class _CupertinoTextSelectionToolbarItemsElement extends RenderObjectElement {
522522
// repeatedly to remove children.
523523
final Set<Element> _forgottenChildren = HashSet<Element>();
524524

525-
@override
526-
_CupertinoTextSelectionToolbarItems get widget => super.widget as _CupertinoTextSelectionToolbarItems;
527-
528525
@override
529526
_RenderCupertinoTextSelectionToolbarItems get renderObject => super.renderObject as _RenderCupertinoTextSelectionToolbarItems;
530527

@@ -625,15 +622,16 @@ class _CupertinoTextSelectionToolbarItemsElement extends RenderObjectElement {
625622
void mount(Element? parent, Object? newSlot) {
626623
super.mount(parent, newSlot);
627624
// Mount slotted children.
628-
_mountChild(widget.backButton, _CupertinoTextSelectionToolbarItemsSlot.backButton);
629-
_mountChild(widget.nextButton, _CupertinoTextSelectionToolbarItemsSlot.nextButton);
630-
_mountChild(widget.nextButtonDisabled, _CupertinoTextSelectionToolbarItemsSlot.nextButtonDisabled);
625+
final _CupertinoTextSelectionToolbarItems toolbarItems = widget as _CupertinoTextSelectionToolbarItems;
626+
_mountChild(toolbarItems.backButton, _CupertinoTextSelectionToolbarItemsSlot.backButton);
627+
_mountChild(toolbarItems.nextButton, _CupertinoTextSelectionToolbarItemsSlot.nextButton);
628+
_mountChild(toolbarItems.nextButtonDisabled, _CupertinoTextSelectionToolbarItemsSlot.nextButtonDisabled);
631629

632630
// Mount list children.
633-
_children = List<Element>.filled(widget.children.length, _NullElement.instance);
631+
_children = List<Element>.filled(toolbarItems.children.length, _NullElement.instance);
634632
Element? previousChild;
635633
for (int i = 0; i < _children.length; i += 1) {
636-
final Element newChild = inflateWidget(widget.children[i], IndexedSlot<Element?>(i, previousChild));
634+
final Element newChild = inflateWidget(toolbarItems.children[i], IndexedSlot<Element?>(i, previousChild));
637635
_children[i] = newChild;
638636
previousChild = newChild;
639637
}
@@ -659,12 +657,13 @@ class _CupertinoTextSelectionToolbarItemsElement extends RenderObjectElement {
659657
assert(widget == newWidget);
660658

661659
// Update slotted children.
662-
_mountChild(widget.backButton, _CupertinoTextSelectionToolbarItemsSlot.backButton);
663-
_mountChild(widget.nextButton, _CupertinoTextSelectionToolbarItemsSlot.nextButton);
664-
_mountChild(widget.nextButtonDisabled, _CupertinoTextSelectionToolbarItemsSlot.nextButtonDisabled);
660+
final _CupertinoTextSelectionToolbarItems toolbarItems = widget as _CupertinoTextSelectionToolbarItems;
661+
_mountChild(toolbarItems.backButton, _CupertinoTextSelectionToolbarItemsSlot.backButton);
662+
_mountChild(toolbarItems.nextButton, _CupertinoTextSelectionToolbarItemsSlot.nextButton);
663+
_mountChild(toolbarItems.nextButtonDisabled, _CupertinoTextSelectionToolbarItemsSlot.nextButtonDisabled);
665664

666665
// Update list children.
667-
_children = updateChildren(_children, widget.children, forgottenChildren: _forgottenChildren);
666+
_children = updateChildren(_children, toolbarItems.children, forgottenChildren: _forgottenChildren);
668667
_forgottenChildren.clear();
669668
}
670669
}

packages/flutter/lib/src/material/dropdown.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,14 +1665,13 @@ class DropdownButtonFormField<T> extends FormField<T> {
16651665
}
16661666

16671667
class _DropdownButtonFormFieldState<T> extends FormFieldState<T> {
1668-
@override
1669-
DropdownButtonFormField<T> get widget => super.widget as DropdownButtonFormField<T>;
16701668

16711669
@override
16721670
void didChange(T? value) {
16731671
super.didChange(value);
1674-
assert(widget.onChanged != null);
1675-
widget.onChanged!(value);
1672+
final DropdownButtonFormField<T> dropdownButtonFormField = widget as DropdownButtonFormField<T>;
1673+
assert(dropdownButtonFormField.onChanged != null);
1674+
dropdownButtonFormField.onChanged!(value);
16761675
}
16771676

16781677
@override

packages/flutter/lib/src/material/text_form_field.dart

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,9 @@ class TextFormField extends FormField<String> {
266266
class _TextFormFieldState extends FormFieldState<String> {
267267
RestorableTextEditingController? _controller;
268268

269-
TextEditingController get _effectiveController => widget.controller ?? _controller!.value;
269+
TextEditingController get _effectiveController => _textFormField.controller ?? _controller!.value;
270270

271-
@override
272-
TextFormField get widget => super.widget as TextFormField;
271+
TextFormField get _textFormField => super.widget as TextFormField;
273272

274273
@override
275274
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
@@ -300,26 +299,26 @@ class _TextFormFieldState extends FormFieldState<String> {
300299
@override
301300
void initState() {
302301
super.initState();
303-
if (widget.controller == null) {
302+
if (_textFormField.controller == null) {
304303
_createLocalController(widget.initialValue != null ? TextEditingValue(text: widget.initialValue!) : null);
305304
} else {
306-
widget.controller!.addListener(_handleControllerChanged);
305+
_textFormField.controller!.addListener(_handleControllerChanged);
307306
}
308307
}
309308

310309
@override
311310
void didUpdateWidget(TextFormField oldWidget) {
312311
super.didUpdateWidget(oldWidget);
313-
if (widget.controller != oldWidget.controller) {
312+
if (_textFormField.controller != oldWidget.controller) {
314313
oldWidget.controller?.removeListener(_handleControllerChanged);
315-
widget.controller?.addListener(_handleControllerChanged);
314+
_textFormField.controller?.addListener(_handleControllerChanged);
316315

317-
if (oldWidget.controller != null && widget.controller == null) {
316+
if (oldWidget.controller != null && _textFormField.controller == null) {
318317
_createLocalController(oldWidget.controller!.value);
319318
}
320319

321-
if (widget.controller != null) {
322-
setValue(widget.controller!.text);
320+
if (_textFormField.controller != null) {
321+
setValue(_textFormField.controller!.text);
323322
if (oldWidget.controller == null) {
324323
unregisterFromRestoration(_controller!);
325324
_controller!.dispose();
@@ -331,7 +330,7 @@ class _TextFormFieldState extends FormFieldState<String> {
331330

332331
@override
333332
void dispose() {
334-
widget.controller?.removeListener(_handleControllerChanged);
333+
_textFormField.controller?.removeListener(_handleControllerChanged);
335334
_controller?.dispose();
336335
super.dispose();
337336
}

packages/flutter/lib/src/widgets/basic.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3131,12 +3131,9 @@ class Offstage extends SingleChildRenderObjectWidget {
31313131
class _OffstageElement extends SingleChildRenderObjectElement {
31323132
_OffstageElement(Offstage widget) : super(widget);
31333133

3134-
@override
3135-
Offstage get widget => super.widget as Offstage;
3136-
31373134
@override
31383135
void debugVisitOnstageChildren(ElementVisitor visitor) {
3139-
if (!widget.offstage)
3136+
if (!(widget as Offstage).offstage)
31403137
super.debugVisitOnstageChildren(visitor);
31413138
}
31423139
}

packages/flutter/lib/src/widgets/binding.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,9 +1138,6 @@ class RenderObjectToWidgetElement<T extends RenderObject> extends RootRenderObje
11381138
/// the render tree, call [RenderObjectToWidgetAdapter.attachToRenderTree].
11391139
RenderObjectToWidgetElement(RenderObjectToWidgetAdapter<T> widget) : super(widget);
11401140

1141-
@override
1142-
RenderObjectToWidgetAdapter<T> get widget => super.widget as RenderObjectToWidgetAdapter<T>;
1143-
11441141
Element? _child;
11451142

11461143
static const Object _rootChildSlot = Object();
@@ -1193,7 +1190,7 @@ class RenderObjectToWidgetElement<T extends RenderObject> extends RootRenderObje
11931190
@pragma('vm:notify-debugger-on-exception')
11941191
void _rebuild() {
11951192
try {
1196-
_child = updateChild(_child, widget.child, _rootChildSlot);
1193+
_child = updateChild(_child, (widget as RenderObjectToWidgetAdapter<T>).child, _rootChildSlot);
11971194
} catch (exception, stack) {
11981195
final FlutterErrorDetails details = FlutterErrorDetails(
11991196
exception: exception,

0 commit comments

Comments
 (0)