Skip to content

Commit 93ad7c2

Browse files
committed
Refactor code per review feedback and add missing assertions
1 parent 8b26ebc commit 93ad7c2

File tree

2 files changed

+38
-39
lines changed

2 files changed

+38
-39
lines changed

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

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ class StretchOverscrollEffect extends StatefulWidget {
1818
this.overscrollX = 0.0,
1919
this.overscrollY = 0.0,
2020
required this.child,
21-
});
21+
}) : assert(
22+
overscrollX >= -1.0 && overscrollX <= 1.0,
23+
'overscrollX must be between -1.0 and 1.0',
24+
),
25+
assert(
26+
overscrollY >= -1.0 && overscrollY <= 1.0,
27+
'overscrollY must be between -1.0 and 1.0',
28+
);
2229

2330
/// The horizontal overscroll amount applied for stretching effect,
2431
/// and value should be between -1 and 1 inclusive.
@@ -38,12 +45,26 @@ class StretchOverscrollEffect extends StatefulWidget {
3845
class _StretchOverscrollEffectState extends State<StretchOverscrollEffect> {
3946
ui.FragmentShader? _fragmentShader;
4047

48+
/// The maximum scale multiplier applied during a stretch effect.
49+
static const double maxStretchIntensity = 1.0;
50+
51+
/// The strength of the interpolation used for smoothing the effect.
52+
static const double interpolationStrength = 0.7;
53+
4154
@override
4255
void dispose() {
4356
_fragmentShader?.dispose();
4457
super.dispose();
4558
}
4659

60+
@override
61+
void initState() {
62+
super.initState();
63+
if (!_StretchOverscrollEffectShader._initCalled) {
64+
_StretchOverscrollEffectShader.initializeShader();
65+
}
66+
}
67+
4768
@override
4869
Widget build(BuildContext context) {
4970
final bool isShaderNeeded =
@@ -55,26 +76,15 @@ class _StretchOverscrollEffectState extends State<StretchOverscrollEffect> {
5576
if (_StretchOverscrollEffectShader._initialized) {
5677
_fragmentShader?.dispose();
5778
_fragmentShader = _StretchOverscrollEffectShader._program!.fragmentShader();
58-
_fragmentShader!.setFloat(2, 1.0);
79+
_fragmentShader!.setFloat(2, maxStretchIntensity);
5980
_fragmentShader!.setFloat(3, widget.overscrollX);
6081
_fragmentShader!.setFloat(4, widget.overscrollY);
61-
_fragmentShader!.setFloat(5, 0.7);
82+
_fragmentShader!.setFloat(5, interpolationStrength);
6283

6384
imageFilter = ui.ImageFilter.shader(_fragmentShader!);
6485
} else {
65-
if (!_StretchOverscrollEffectShader._initCalled) {
66-
_StretchOverscrollEffectShader.initializeShader();
67-
_StretchOverscrollEffectShader.addListener(() {
68-
if (mounted) {
69-
setState(() {
70-
// Rebuilds the widget once the fragment shader is fully initialized.
71-
});
72-
}
73-
});
74-
} else {
75-
_fragmentShader?.dispose();
76-
_fragmentShader = null;
77-
}
86+
_fragmentShader?.dispose();
87+
_fragmentShader = null;
7888

7989
imageFilter = ui.ImageFilter.matrix(Matrix4.identity().storage);
8090
}
@@ -120,7 +130,6 @@ class _StretchOverscrollEffectShader {
120130
static bool _initCalled = false;
121131
static bool _initialized = false;
122132
static ui.FragmentProgram? _program;
123-
static final List<VoidCallback> _listeners = <VoidCallback>[];
124133

125134
static void initializeShader() {
126135
if (!_initCalled) {
@@ -129,21 +138,8 @@ class _StretchOverscrollEffectShader {
129138
) {
130139
_program = program;
131140
_initialized = true;
132-
_notifyListeners();
133-
_listeners.clear();
134141
});
135142
_initCalled = true;
136143
}
137144
}
138-
139-
static void addListener(VoidCallback listener) {
140-
assert(!_listeners.contains(listener));
141-
_listeners.add(listener);
142-
}
143-
144-
static void _notifyListeners() {
145-
for (final VoidCallback listener in _listeners) {
146-
listener.call();
147-
}
148-
}
149145
}

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -806,16 +806,16 @@ class _StretchingOverscrollIndicatorState extends State<StretchingOverscrollIndi
806806
animation: _stretchController,
807807
builder: (BuildContext context, Widget? child) {
808808
final double stretch = _stretchController.value;
809-
double x = 0.0;
810-
double y = 0.0;
809+
double overscrollX = 0.0;
810+
double overscrollY = 0.0;
811811
final double mainAxisSize;
812812

813813
switch (widget.axis) {
814814
case Axis.horizontal:
815-
x += stretch;
815+
overscrollX += stretch;
816816
mainAxisSize = MediaQuery.widthOf(context);
817817
case Axis.vertical:
818-
y += stretch;
818+
overscrollY += stretch;
819819
mainAxisSize = MediaQuery.heightOf(context);
820820
}
821821

@@ -825,23 +825,26 @@ class _StretchingOverscrollIndicatorState extends State<StretchingOverscrollIndi
825825

826826
if (ui.ImageFilter.isShaderFilterSupported) {
827827
if (_stretchController.stretchDirection == _StretchDirection.trailing) {
828-
x = -x;
829-
y = -y;
828+
overscrollX = -overscrollX;
829+
overscrollY = -overscrollY;
830830
}
831831

832832
transform = StretchOverscrollEffect(
833-
overscrollX: x,
834-
overscrollY: y,
833+
overscrollX: overscrollX,
834+
overscrollY: overscrollY,
835835
child: widget.child!,
836836
);
837837
} else {
838838
final AlignmentGeometry alignment = _getAlignmentForAxisDirection(
839839
_stretchController.stretchDirection,
840840
);
841841

842+
final double x = 1.0 + overscrollX;
843+
final double y = 1.0 + overscrollY;
844+
842845
transform = Transform(
843846
alignment: alignment,
844-
transform: Matrix4.diagonal3Values(1.0 + x, 1.0 + y, 1.0),
847+
transform: Matrix4.diagonal3Values(x, y, 1.0),
845848
filterQuality: stretch == 0 ? null : FilterQuality.medium,
846849
child: widget.child,
847850
);

0 commit comments

Comments
 (0)