Search code examples
dartflutterflutter-layout

How to create a button with rounded corner, and gradient background?


I have been trying to create a raised button with a rounded corner, and gradient background but to no success. I can only implement one or the other. It's been 2 hours and I haven't found a solution myself, on how I can implement both a rounded corner, and a gradient background together.

Below are my codes of my latest attempt to implement a raised button with rounded corner, and gradient background.

Custom class of GradientButton

class RaisedGradientButton extends StatelessWidget {
  final Widget child;
  final Gradient gradient;
  final double width;
  final double height;
  final Function onPressed;

  const RaisedGradientButton({
    Key key,
    @required this.child,
    this.gradient,
    this.width = double.infinity,
    this.height = 50.0,
    this.onPressed,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: width,
      height: 50.0,
      decoration: BoxDecoration(
        gradient: new LinearGradient(
          colors: [
            Colors.blue,
            Colors.red,
          ],
          begin: FractionalOffset.centerLeft,
          end: FractionalOffset.centerRight,
        ),
      ),
      child: Material(
        shape: new RoundedRectangleBorder(
            borderRadius: new BorderRadius.circular(128.0)),
//        color: Colors.transparent,
        child: InkWell(
            onTap: onPressed,
            child: Center(
              child: child,
            )),
      ),
    );
  }
}

How I use the above code:

RaisedGradientButton(
    onPressed: navigateToNextPage,
        child: Text("Select Community"),
)

How it looks like:

enter image description here

As you can see, the gradient is there, but when I attempt to create a rounded corner, it overlaps, and the gradient is behind.


Solution

  • If anyone ever encounters the same issue. Here is my code on how I got it solved.

    class GradientButton extends StatelessWidget {
      final Widget child;
    
      // final Gradient gradient;
      final double width;
      final double height;
      final bool isEnabled;
      final Function onPressed;
    
      const GradientButton({
        Key key,
        @required this.child,
        // this.gradient,
        this.isEnabled,
        this.width,
        this.height,
        this.onPressed,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        Color _statusColor;
        if (isEnabled != null) {
          // Show gradient color by making material widget transparent
          if (isEnabled == true) {
            _statusColor = Colors.transparent;
          } else {
            // Show grey color if isEnabled is false
            _statusColor = Colors.grey;
          }
        } else {
          // Show grey color if isEnabled is null
          _statusColor = Colors.transparent;
        }
    
        return Container(
          width: width,
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(8),
            gradient: LinearGradient(
              colors: [
                Color(0xFF3186E3),
                Color(0xFF1D36C4),
              ],
              begin: FractionalOffset.centerLeft,
              end: FractionalOffset.centerRight,
            ),
          ),
          child: Material(
              shape: RoundedRectangleBorder(
                  borderRadius: new BorderRadius.circular(4)),
              color: _statusColor,
              child: InkWell(
                  borderRadius: BorderRadius.circular(32),
                  onTap: onPressed,
                  child: Padding(
                    padding: EdgeInsets.fromLTRB(24, 16, 24, 16),
                    child: Center(
                      child: child,
                    ),
                  ))),
        );
      }
    }