| // 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/rendering.dart'; |
| |
| import 'basic.dart'; |
| import 'framework.dart'; |
| import 'image.dart'; |
| |
| /// A sliver widget that paints a [Decoration] either before or after its child |
| /// paints. |
| /// |
| /// Unlike [DecoratedBox], this widget expects its child to be a sliver, and |
| /// must be placed in a widget that expects a sliver. |
| /// |
| /// If the child sliver has infinite [SliverGeometry.scrollExtent], then we only |
| /// draw the decoration down to the bottom [SliverGeometry.cacheExtent], and |
| /// it is necessary to ensure that the bottom border does not creep |
| /// above the top of the bottom cache. This can happen if the bottom has a |
| /// border radius larger than the extent of the cache area. |
| /// |
| /// Commonly used with [BoxDecoration]. |
| /// |
| /// The [child] is not clipped. To clip a child to the shape of a particular |
| /// [ShapeDecoration], consider using a [ClipPath] widget. |
| /// |
| /// {@tool dartpad} |
| /// This sample shows a radial gradient that draws a moon on a night sky: |
| /// |
| /// ** See code in examples/api/lib/widgets/sliver/decorated_sliver.0.dart ** |
| /// {@end-tool} |
| /// |
| /// See also: |
| /// |
| /// * [DecoratedBox], the version of this class that works with RenderBox widgets. |
| /// * [Decoration], which you can extend to provide other effects with |
| /// [DecoratedSliver]. |
| /// * [CustomPaint], another way to draw custom effects from the widget layer. |
| class DecoratedSliver extends SingleChildRenderObjectWidget { |
| /// Creates a widget that paints a [Decoration]. |
| /// |
| /// The [decoration] and [position] arguments must not be null. By default the |
| /// decoration paints behind the child. |
| const DecoratedSliver({ |
| super.key, |
| required this.decoration, |
| this.position = DecorationPosition.background, |
| Widget? sliver, |
| }) : super(child: sliver); |
| |
| /// What decoration to paint. |
| /// |
| /// Commonly a [BoxDecoration]. |
| final Decoration decoration; |
| |
| /// Whether to paint the box decoration behind or in front of the child. |
| final DecorationPosition position; |
| |
| @override |
| RenderDecoratedSliver createRenderObject(BuildContext context) { |
| return RenderDecoratedSliver( |
| decoration: decoration, |
| position: position, |
| configuration: createLocalImageConfiguration(context), |
| ); |
| } |
| |
| @override |
| void updateRenderObject(BuildContext context, RenderDecoratedSliver renderObject) { |
| renderObject |
| ..decoration = decoration |
| ..position = position |
| ..configuration = createLocalImageConfiguration(context); |
| } |
| |
| @override |
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { |
| super.debugFillProperties(properties); |
| final String label; |
| switch (position) { |
| case DecorationPosition.background: |
| label = 'bg'; |
| case DecorationPosition.foreground: |
| label = 'fg'; |
| } |
| properties.add(EnumProperty<DecorationPosition>('position', position, level: DiagnosticLevel.hidden)); |
| properties.add(DiagnosticsProperty<Decoration>(label, decoration)); |
| } |
| } |