ClipRRect and ClipPath help you cut or shape parts of your app's pictures or widgets. This makes your app look neat and stylish.
ClipRRect and ClipPath in Flutter
ClipRRect(
borderRadius: BorderRadius.circular(10),
child: WidgetToClip(),
)
ClipPath(
clipper: CustomClipper<Path>(),
child: WidgetToClip(),
)ClipRRect clips a widget with rounded rectangle corners.
ClipPath clips a widget using any shape you define with a CustomClipper.
ClipRRect( borderRadius: BorderRadius.circular(20), child: Image.network('https://example.com/photo.jpg'), )
ClipPath( clipper: TriangleClipper(), child: Container(color: Colors.blue, width: 100, height: 100), ) class TriangleClipper extends CustomClipper<Path> { @override Path getClip(Size size) { Path path = Path(); path.moveTo(size.width / 2, 0); path.lineTo(0, size.height); path.lineTo(size.width, size.height); path.close(); return path; } @override bool shouldReclip(CustomClipper<Path> oldClipper) => false; }
This app shows two clipped widgets stacked vertically. The first is an image with rounded corners using ClipRRect. The second is an orange box clipped into a star shape using ClipPath and a custom clipper.
import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('ClipRRect and ClipPath Example')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ClipRRect( borderRadius: BorderRadius.circular(30), child: Image.network( 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg', width: 150, height: 150, fit: BoxFit.cover, ), ), const SizedBox(height: 40), ClipPath( clipper: StarClipper(), child: Container( color: Colors.orange, width: 150, height: 150, alignment: Alignment.center, child: const Text('Star Shape', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), ), ), ], ), ), ), ); } } class StarClipper extends CustomClipper<Path> { @override Path getClip(Size size) { double w = size.width; double h = size.height; Path path = Path(); path.moveTo(w * 0.5, 0); path.lineTo(w * 0.617, h * 0.35); path.lineTo(w, h * 0.38); path.lineTo(w * 0.69, h * 0.62); path.lineTo(w * 0.81, h); path.lineTo(w * 0.5, h * 0.77); path.lineTo(w * 0.19, h); path.lineTo(w * 0.31, h * 0.62); path.lineTo(0, h * 0.38); path.lineTo(w * 0.38, h * 0.35); path.close(); return path; } @override bool shouldReclip(CustomClipper<Path> oldClipper) => false; }
ClipRRect is simpler and good for rounded corners.
ClipPath is powerful for any custom shape but needs you to define the shape path.
Clipping can affect performance if overused or on large widgets.
ClipRRect clips widgets with rounded rectangles.
ClipPath clips widgets with any shape you create.
Use clipping to make your app look polished and creative.
Practice
ClipRRect widget in Flutter?Solution
Step 1: Understand ClipRRect usage
TheClipRRectwidget clips its child using a rounded rectangle shape.Step 2: Compare with other options
ClipPathclips with custom shapes, padding adds space, animation changes size.Final Answer:
To clip a widget with rounded rectangle corners -> Option DQuick Check:
ClipRRect = Rounded rectangle clip [OK]
- Confusing ClipRRect with ClipPath
- Thinking ClipRRect adds padding
- Assuming ClipRRect animates widgets
ClipRRect?Solution
Step 1: Recall ClipRRect property names
The correct property for rounded corners isborderRadiuswith aBorderRadius.circular()value.Step 2: Check syntax correctness
ClipRRect(borderRadius: BorderRadius.circular(10), child: Text('Hello')) uses correct property and value type; others use wrong property names or types.Final Answer:
ClipRRect(borderRadius: BorderRadius.circular(10), child: Text('Hello')) -> Option AQuick Check:
borderRadius with BorderRadius.circular() is correct [OK]
- Using radius or cornerRadius instead of borderRadius
- Passing integer directly instead of BorderRadius.circular()
- Omitting the child widget
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Container(
width: 100,
height: 100,
color: Colors.blue,
),
)Solution
Step 1: Analyze ClipRRect effect
TheClipRRectclips the child container with rounded corners of radius 20.Step 2: Understand container shape
The container is a 100x100 square colored blue, so clipping rounds its corners.Final Answer:
A blue square with rounded corners of radius 20 -> Option AQuick Check:
ClipRRect rounds corners = blue square with rounded corners [OK]
- Thinking ClipRRect creates circles
- Ignoring borderRadius effect
- Assuming no clipping happens
ClipPath:
ClipPath( clipper: CustomClipper(), child: Container(color: Colors.red, width: 100, height: 100), )
Solution
Step 1: Understand CustomClipper usage
CustomClipperis an abstract class; you must create a subclass implementing its methods.Step 2: Check clipper property type
Theclipperproperty requires an instance of a subclass ofCustomClipper, not the abstract class itself.Final Answer:
CustomClipper is an abstract class and cannot be used directly -> Option CQuick Check:
CustomClipper must be subclassed before use [OK]
- Using CustomClipper directly without subclassing
- Confusing clipper property type
- Thinking Container can't be child
ClipPath to achieve this?Solution
Step 1: Understand ClipPath flexibility
ClipPathallows clipping with any shape by defining a custom path in a subclass ofCustomClipper.Step 2: Identify correct method for triangle shape
To clip a triangle, you must create aCustomClipperthat draws a triangle path and pass it toClipPath.Step 3: Eliminate incorrect options
ClipRRectonly clips rounded rectangles,ClipOvalclips ovals/circles, andContainerdoes not clip shapes.Final Answer:
Use ClipPath with a CustomClipper that defines a triangle path -> Option BQuick Check:
ClipPath + CustomClipper = any shape clip [OK]
- Trying to clip triangle with ClipRRect
- Using ClipOval for non-oval shapes
- Confusing padding with clipping
Ready to prove it?
Pass the test and this pattern moves unknown
