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( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(), ); } } /// /// Shape Builder /// abstract class ShapeBuilder { Widget build(Size size, Widget child) { return Container( height: size.height, width: size.width, decoration: BoxDecoration(shape: boxShape, color: shapeColor), child: Center(child: child), ); } BoxShape get boxShape; Color get shapeColor; } class RedSquareBuilder extends ShapeBuilder { @override BoxShape get boxShape => BoxShape.rectangle; @override Color get shapeColor => Colors.red; } class BlueCircleBuilder extends ShapeBuilder { @override BoxShape get boxShape => BoxShape.circle; @override Color get shapeColor => Colors.blue; } /// /// Message Builder (Writer seemed appropriate) /// abstract class MessageWriter { Text write(String text); } class HotMessageWriter extends MessageWriter { @override Text write(String text) => Text(text, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18)); } class ColdMessageWriter extends MessageWriter { @override Text write(String text) => Text(text, style: const TextStyle(color: Colors.white, fontSize: 14)); } final List builders = [ RedSquareBuilder(), BlueCircleBuilder(), RedSquareBuilder(), ]; final List writers = [ ColdMessageWriter(), HotMessageWriter(), HotMessageWriter(), ]; class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: const Text('Builders'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Builders!!'), ...List.generate( 3, (index) => builders[index].build( Size(80.0 * (index + 1), 90.0 * (index + 1)), writers[index].write('build ${index + 1}'), ), ), ], ), ), ); } }