import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData.light(), debugShowCheckedModeBanner: false, home: Scaffold( body: Center( child: TriangleError(), ), ), ); } } class TriangleError extends StatefulWidget { const TriangleError({Key key}) : super(key: key); @override _TriangleErrorState createState() => _TriangleErrorState(); } class _TriangleErrorState extends State with TickerProviderStateMixin { AnimationController rotationController; @override void initState() { rotationController = AnimationController( duration: const Duration(milliseconds: 2000), vsync: this, )..repeat(); super.initState(); } @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(10), child: Center( child: AspectRatio( aspectRatio: 1, child: Stack( children: [ Align( alignment: Alignment.center, child: RotationTransition( turns: Tween(begin: 0.0, end: 1.0).animate(rotationController), child: ClipPath( clipper: TrianglePath(), child: LayoutBuilder( builder: (context, constrains) { return Container( // uncomment and reload view // color: Colors.red, decoration: BoxDecoration( gradient: LinearGradient( colors: [ Theme.of(context).primaryColorLight, Theme.of(context) .primaryColorLight .withAlpha(10) ], begin: Alignment.bottomCenter, end: Alignment.topCenter, ), ), margin: EdgeInsets.all(constrains.maxHeight / 8), ); }, ), ), ), ), ], ), ), ), ); } } class TrianglePath extends CustomClipper { var radius = 10.0; @override Path getClip(Size size) { Path path = Path(); path.lineTo(size.width / 4, 0); path.lineTo(size.width / 2, size.height / 2); path.lineTo(size.width - size.width / 4, 0); path.lineTo(0, 0); return path; } @override bool shouldReclip(CustomClipper oldClipper) => false; }