Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
d19047d8
Unverified
Commit
d19047d8
authored
Dec 12, 2022
by
Jonah Williams
Committed by
GitHub
Dec 12, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[framework] make opacity widget create a repaint boundary (#116788)
parent
5a229e28
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
109 additions
and
14 deletions
+109
-14
proxy_box.dart
packages/flutter/lib/src/rendering/proxy_box.dart
+13
-14
opacity_repaint_test.dart
packages/flutter/test/widgets/opacity_repaint_test.dart
+96
-0
No files found.
packages/flutter/lib/src/rendering/proxy_box.dart
View file @
d19047d8
...
...
@@ -890,6 +890,9 @@ class RenderOpacity extends RenderProxyBox {
@override
bool
get
alwaysNeedsCompositing
=>
child
!=
null
&&
_alpha
>
0
;
@override
bool
get
isRepaintBoundary
=>
alwaysNeedsCompositing
;
int
_alpha
;
/// The fraction to scale the child's alpha value.
...
...
@@ -917,7 +920,7 @@ class RenderOpacity extends RenderProxyBox {
if
(
didNeedCompositing
!=
alwaysNeedsCompositing
)
{
markNeedsCompositingBitsUpdate
();
}
markNeeds
Paint
();
markNeeds
CompositedLayerUpdate
();
if
(
wasVisible
!=
(
_alpha
!=
0
)
&&
!
alwaysIncludeSemantics
)
{
markNeedsSemanticsUpdate
();
}
...
...
@@ -944,23 +947,19 @@ class RenderOpacity extends RenderProxyBox {
return
_alpha
>
0
;
}
@override
OffsetLayer
updateCompositedLayer
({
required
covariant
OpacityLayer
?
oldLayer
})
{
final
OpacityLayer
layer
=
oldLayer
??
OpacityLayer
();
layer
.
alpha
=
_alpha
;
return
layer
;
}
@override
void
paint
(
PaintingContext
context
,
Offset
offset
)
{
if
(
child
==
null
)
{
return
;
}
if
(
_alpha
==
0
)
{
// No need to keep the layer. We'll create a new one if necessary.
layer
=
null
;
if
(
child
==
null
||
_alpha
==
0
)
{
return
;
}
assert
(
needsCompositing
);
layer
=
context
.
pushOpacity
(
offset
,
_alpha
,
super
.
paint
,
oldLayer:
layer
as
OpacityLayer
?);
assert
(()
{
layer
!.
debugCreator
=
debugCreator
;
return
true
;
}());
super
.
paint
(
context
,
offset
);
}
@override
...
...
packages/flutter/test/widgets/opacity_repaint_test.dart
0 → 100644
View file @
d19047d8
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:flutter/material.dart'
;
import
'package:flutter/rendering.dart'
;
import
'package:flutter_test/flutter_test.dart'
;
void
main
(
)
{
testWidgets
(
'RenderOpacity avoids repainting and does not drop layer at fully opaque'
,
(
WidgetTester
tester
)
async
{
RenderTestObject
.
paintCount
=
0
;
await
tester
.
pumpWidget
(
Container
(
color:
Colors
.
red
,
child:
const
Opacity
(
opacity:
0.0
,
child:
TestWidget
(),
),
)
);
expect
(
RenderTestObject
.
paintCount
,
0
);
await
tester
.
pumpWidget
(
Container
(
color:
Colors
.
red
,
child:
const
Opacity
(
opacity:
0.1
,
child:
TestWidget
(),
),
)
);
expect
(
RenderTestObject
.
paintCount
,
1
);
await
tester
.
pumpWidget
(
Container
(
color:
Colors
.
red
,
child:
const
Opacity
(
opacity:
1
,
child:
TestWidget
(),
),
)
);
expect
(
RenderTestObject
.
paintCount
,
1
);
});
testWidgets
(
'RenderOpacity allows opacity layer to be dropped at 0 opacity'
,
(
WidgetTester
tester
)
async
{
RenderTestObject
.
paintCount
=
0
;
await
tester
.
pumpWidget
(
Container
(
color:
Colors
.
red
,
child:
const
Opacity
(
opacity:
0.5
,
child:
TestWidget
(),
),
)
);
expect
(
RenderTestObject
.
paintCount
,
1
);
await
tester
.
pumpWidget
(
Container
(
color:
Colors
.
red
,
child:
const
Opacity
(
opacity:
0.0
,
child:
TestWidget
(),
),
)
);
expect
(
RenderTestObject
.
paintCount
,
1
);
expect
(
tester
.
layers
,
isNot
(
contains
(
isA
<
OpacityLayer
>())));
});
}
class
TestWidget
extends
SingleChildRenderObjectWidget
{
const
TestWidget
({
super
.
key
,
super
.
child
});
@override
RenderObject
createRenderObject
(
BuildContext
context
)
{
return
RenderTestObject
();
}
}
class
RenderTestObject
extends
RenderProxyBox
{
static
int
paintCount
=
0
;
@override
void
paint
(
PaintingContext
context
,
Offset
offset
)
{
paintCount
+=
1
;
super
.
paint
(
context
,
offset
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment