BackdropFilter class
A widget that applies a filter to the existing painted content and then paints child.
The filter will be applied to all the area within its parent or ancestor widget's clip. If there's no clip, the filter will be applied to the full screen.
The results of the filter will be blended back into the background using the blendMode parameter. The only value for blendMode that is supported on all platforms is BlendMode.srcOver which works well for most scenes. But that value may produce surprising results when a parent of the BackdropFilter uses a temporary buffer, or save layer, as does an Opacity widget. In that situation, a value of BlendMode.src can produce more pleasing results.
Multiple backdrop filters can be combined into a single rendering operation
by the Flutter engine if these backdrop filters widgets all share a common
BackdropKey. The backdrop key uniquely identifies the input for a backdrop
filter, and when shared, indicates the filtering can be performed once. This
can significantly reduce the overhead of using multiple backdrop filters in
a scene. The key can either be provided manually via the backdropKey
constructor parameter or looked up from a BackdropGroup inherited widget
via the .grouped
constructor.
Backdrop filters that overlap with each other should not use the same backdrop key, otherwise the results may look as if only one filter is applied in the overlapping regions.
The following snippet demonstrates how to use the backdrop key to allow each list item to have an efficient blur. The engine will perform only one backdrop blur but the results will be visually identical to multiple blurs.
Widget build(BuildContext context) {
return BackdropGroup(
child: ListView.builder(
itemCount: 60,
itemBuilder: (BuildContext context, int index) {
return ClipRect(
child: BackdropFilter.grouped(
filter: ui.ImageFilter.blur(
sigmaX: 40,
sigmaY: 40,
),
child: Container(
color: Colors.black.withOpacity(0.2),
height: 200,
child: const Text('Blur item'),
),
),
);
}
),
);
}
Stack(
fit: StackFit.expand,
children: <Widget>[
Text('0' * 10000),
Center(
child: ClipRect( // <-- clips to the 200x200 [Container] below
child: BackdropFilter(
filter: ui.ImageFilter.blur(
sigmaX: 5.0,
sigmaY: 5.0,
),
child: Container(
alignment: Alignment.center,
width: 200.0,
height: 200.0,
child: const Text('Hello World'),
),
),
),
),
],
)
This effect is relatively expensive, especially if the filter is non-local, such as a blur.
If all you want to do is apply an ImageFilter to a single widget (as opposed to applying the filter to everything beneath a widget), use ImageFiltered instead. For that scenario, ImageFiltered is both easier to use and less expensive than BackdropFilter.
The implementation below is unnecessarily expensive.
Widget buildBackdrop() {
return Stack(
children: <Widget>[
Positioned.fill(child: Image.asset('image.png')),
Positioned.fill(
child: BackdropFilter(
filter: ui.ImageFilter.blur(sigmaX: 6, sigmaY: 6),
),
),
],
);
}
Widget buildFilter() {
return ImageFiltered(
imageFilter: ui.ImageFilter.blur(sigmaX: 6, sigmaY: 6),
child: Image.asset('image.png'),
);
}
See also:
- ImageFiltered, which applies an ImageFilter to its child.
- DecoratedBox, which draws a background under (or over) a widget.
- Opacity, which changes the opacity of the widget itself.
- https://flutter.cn/go/ios-platformview-backdrop-filter-blur for details and restrictions when an iOS PlatformView needs to be blurred.
- Inheritance
Constructors
- BackdropFilter({Key? key, required ImageFilter filter, Widget? child, BlendMode blendMode = BlendMode.srcOver, bool enabled = true, BackdropKey? backdropGroupKey})
-
Creates a backdrop filter.
const
- BackdropFilter.grouped({Key? key, required ImageFilter filter, Widget? child, BlendMode blendMode = BlendMode.srcOver, bool enabled = true})
-
Creates a backdrop filter that groups itself with the nearest parent
BackdropGroup.
const
Properties
- backdropGroupKey → BackdropKey?
-
The BackdropKey that identifies the backdrop this filter will apply to.
final
- blendMode → BlendMode
-
The blend mode to use to apply the filtered background content onto the background
surface.
final
- child → Widget?
-
The widget below this widget in the tree.
finalinherited
- enabled → bool
-
Whether or not to apply the backdrop filter operation to the child of this
widget.
final
- filter → ImageFilter
-
The image filter to apply to the existing painted content before painting the child.
final
- hashCode → int
-
The hash code for this object.
no setterinherited
- key → Key?
-
Controls how one widget replaces another widget in the tree.
finalinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
createElement(
) → SingleChildRenderObjectElement -
RenderObjectWidgets always inflate to a RenderObjectElement subclass.
inherited
-
createRenderObject(
BuildContext context) → RenderBackdropFilter -
Creates an instance of the RenderObject class that this
RenderObjectWidget represents, using the configuration described by this
RenderObjectWidget.
override
-
debugDescribeChildren(
) → List< DiagnosticsNode> -
Returns a list of DiagnosticsNode objects describing this node's
children.
inherited
-
debugFillProperties(
DiagnosticPropertiesBuilder properties) → void -
Add additional properties associated with the node.
inherited
-
didUnmountRenderObject(
covariant RenderObject renderObject) → void -
A render object previously associated with this widget has been removed
from the tree. The given RenderObject will be of the same type as
returned by this object's createRenderObject.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toDiagnosticsNode(
{String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode -
Returns a debug representation of the object that is used by debugging
tools and by DiagnosticsNode.toStringDeep.
inherited
-
toString(
{DiagnosticLevel minLevel = DiagnosticLevel.info}) → String -
A string representation of this object.
inherited
-
toStringDeep(
{String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) → String -
Returns a string representation of this node and its descendants.
inherited
-
toStringShallow(
{String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String -
Returns a one-line detailed description of the object.
inherited
-
toStringShort(
) → String -
A short, textual description of this widget.
inherited
-
updateRenderObject(
BuildContext context, covariant RenderBackdropFilter renderObject) → void -
Copies the configuration described by this RenderObjectWidget to the
given RenderObject, which will be of the same type as returned by this
object's createRenderObject.
override
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited