How can I add shadow to the widget in flutter?

前端 未结 8 1488
余生分开走
余生分开走 2020-12-04 09:07

How can I add shadow to the widget like in the picture below?

This is my current widget code.

相关标签:
8条回答
  • 2020-12-04 09:20
    class ShadowContainer extends StatelessWidget {
      ShadowContainer({
        Key key,
        this.margin = const EdgeInsets.fromLTRB(0, 10, 0, 8),
        this.padding = const EdgeInsets.symmetric(horizontal: 8),
        this.circular = 4,
        this.shadowColor = const Color.fromARGB(
            128, 158, 158, 158), //Colors.grey.withOpacity(0.5),
        this.backgroundColor = Colors.white,
        this.spreadRadius = 1,
        this.blurRadius = 3,
        this.offset = const Offset(0, 1),
        @required this.child,
      }) : super(key: key);
    
      final Widget child;
      final EdgeInsetsGeometry margin;
      final EdgeInsetsGeometry padding;
      final double circular;
      final Color shadowColor;
      final double spreadRadius;
      final double blurRadius;
      final Offset offset;
      final Color backgroundColor;
    
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: margin,
          padding: padding,
          decoration: BoxDecoration(
            color: backgroundColor,
            borderRadius: BorderRadius.circular(circular),
            boxShadow: [
              BoxShadow(
                color: shadowColor,
                spreadRadius: spreadRadius,
                blurRadius: blurRadius,
                offset: offset,
              ),
            ],
          ),
          child: child,
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-04 09:26

    Screenshot:


    Container(
      decoration: BoxDecoration(
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.8),
            spreadRadius: 10,
            blurRadius: 5,
            offset: Offset(0, 7), // changes position of shadow
          ),
        ],
      ),
      child: Image.asset(chocolateImage),
    )
    
    0 讨论(0)
  • 2020-12-04 09:29

    Use BoxDecoration with BoxShadow.

    Here is a visual demo manipulating the following options:

    • opacity
    • x offset
    • y offset
    • blur radius
    • spread radius

    The animated gif doesn't do so well with colors. You can try it yourself on a device.

    Here is the full code for that demo:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: ShadowDemo(),
          ),
        );
      }
    }
    
    class ShadowDemo extends StatefulWidget {
      @override
      _ShadowDemoState createState() => _ShadowDemoState();
    }
    
    class _ShadowDemoState extends State<ShadowDemo> {
      var _image = NetworkImage('https://placebear.com/300/300');
    
      var _opacity = 1.0;
      var _xOffset = 0.0;
      var _yOffset = 0.0;
      var _blurRadius = 0.0;
      var _spreadRadius = 0.0;
    
      @override
      Widget build(BuildContext context) {
        return Stack(
          children: <Widget>[
            Center(
              child:
              Container(
                decoration: BoxDecoration(
                  color: Color(0xFF0099EE),
                  boxShadow: [
                    BoxShadow(
                      color: Color.fromRGBO(0, 0, 0, _opacity),
                      offset: Offset(_xOffset, _yOffset),
                      blurRadius: _blurRadius,
                      spreadRadius: _spreadRadius,
                    )
                  ],
                ),
                child: Image(image:_image, width: 100, height: 100,),
              ),
            ),
            Align(
              alignment: Alignment.bottomCenter,
              child: Padding(
                padding: const EdgeInsets.only(bottom: 80.0),
                child: Column(
                  children: <Widget>[
                    Spacer(),
                    Slider(
                      value: _opacity,
                      min: 0.0,
                      max: 1.0,
                      onChanged: (newValue) =>
                      {
                        setState(() => _opacity = newValue)
                      },
                    ),
                    Slider(
                      value: _xOffset,
                      min: -100,
                      max: 100,
                      onChanged: (newValue) =>
                      {
                        setState(() => _xOffset = newValue)
                      },
                    ),
                    Slider(
                      value: _yOffset,
                      min: -100,
                      max: 100,
                      onChanged: (newValue) =>
                      {
                        setState(() => _yOffset = newValue)
                      },
                    ),
                    Slider(
                      value: _blurRadius,
                      min: 0,
                      max: 100,
                      onChanged: (newValue) =>
                      {
                        setState(() => _blurRadius = newValue)
                      },
                    ),
                    Slider(
                      value: _spreadRadius,
                      min: 0,
                      max: 100,
                      onChanged: (newValue) =>
                      {
                        setState(() => _spreadRadius = newValue)
                      },
                    ),
                  ],
                ),
              ),
            )
          ],
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-04 09:32

    The given answers do the trick for outer shadow i.e. around the widget. I wanted a shadow on the widget which is inside the boundaries and according to the github issue there is no inset attribute in ShadowBox yet. My workaround was to add a layer of widget with a gradient using the stack widget so that it looks like the widget itself has the shadows. You must use the mediaQuery for dimensions otherwise the layout will be messed up on different devices. Here's a sample of code for better understanding:

    Stack(
                children: <Widget>[
                  Container(
                    decoration: BoxDecoration(
                      image: DecorationImage(
                        fit: BoxFit.cover,
                        image: AssetImage("assets/sampleFaces/makeup.jpeg"),
                        // fit: BoxFit.cover,
                      ),
                    ),
                    height: 350.0,
                  ),
                  Container(
                    decoration: BoxDecoration(
                      gradient: LinearGradient(
                        begin: FractionalOffset.topCenter,
                        end: FractionalOffset.bottomCenter,
                        colors: [
                          Colors.black.withOpacity(0.0),
                          Colors.black54,
                        ],
                        stops: [0.95, 5.0],
                      ),
                    ),
                  )
                ],
              ),
    
    0 讨论(0)
  • 2020-12-04 09:33

    Check out BoxShadow and BoxDecoration

    A Container can take a BoxDecoration (going off of the code you had originally posted) which takes a boxShadow

    return Container(
      margin: EdgeInsets.only(left: 30, top: 100, right: 30, bottom: 50),
      height: double.infinity,
      width: double.infinity,
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(10),
            topRight: Radius.circular(10),
            bottomLeft: Radius.circular(10),
            bottomRight: Radius.circular(10)
        ),
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.5),
            spreadRadius: 5,
            blurRadius: 7,
            offset: Offset(0, 3), // changes position of shadow
          ),
        ],
      ),
    )
    

    Screenshot

    0 讨论(0)
  • 2020-12-04 09:34

    this is how I did it

        Container(
      decoration: new BoxDecoration(
        boxShadow: [
          BoxShadow(
            color: Colors.grey[200],
            blurRadius: 2.0, // has the effect of softening the shadow
            spreadRadius: 2.0, // has the effect of extending the shadow
            offset: Offset(
              5.0, // horizontal, move right 10
              5.0, // vertical, move down 10
            ),
          )
        ],
      ),
      child: Container( 
           color: Colors.white, //in your example it's blue, pink etc..
           child: //your content
      )
    
    0 讨论(0)
提交回复
热议问题