import 'package:flutter/material.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'base_step_delegate.dart'; typedef OnStepReached = void Function(int index); enum StepShape { circle, rRectangle } enum BorderType { normal, dotted } class BaseStep extends StatelessWidget { const BaseStep({ Key key, @required this.step, @required this.isActive, @required this.isFinished, @required this.isAlreadyReached, @required this.radius, @required this.isUnreached, @required this.activeStepBackgroundColor, @required this.unreachedBackgroundColor, @required this.activeStepBorderColor, @required this.unreachedBorderColor, @required this.activeTextColor, @required this.activeIconColor, @required this.unreachedTextColor, @required this.unreachedIconColor, @required this.padding, @required this.stepRadius, @required this.showStepBorder, @required this.lineLength, @required this.enabled, }) : super(key: key); final StepModel step; final bool isActive; final bool isUnreached; final bool isFinished; final bool isAlreadyReached ; final double radius; final Color activeStepBackgroundColor; final Color unreachedBackgroundColor; final Color activeStepBorderColor; final Color unreachedBorderColor; final Color activeTextColor; final Color activeIconColor; final Color unreachedTextColor; final Color unreachedIconColor; final double padding; final double stepRadius; final bool showStepBorder; final double lineLength; final bool enabled; @override Widget build(BuildContext context) { return SizedBox( width: (radius * 2) + (padding ?? 0), height: radius * 2.5 + 25, child: CustomMultiChildLayout( delegate: BaseStepDelegate( stepRadius: radius, topTitle: step.topTitle, direction: Axis.horizontal), children: [ LayoutId( id: BaseStepElem.step, child: Material( color: Colors.transparent, clipBehavior: Clip.antiAlias, borderRadius: BorderRadius.circular(stepRadius ?? 0), child: Container( width: radius * 2, height: radius * 2, decoration: BoxDecoration( shape: BoxShape.circle, color: _handleColor(context, isFinished, isActive, isAlreadyReached)), alignment: Alignment.center, child: _buildIcon(context), ), )), LayoutId( id: BaseStepElem.title, child: _buildStepTitle(context)) ], ), ); } Color _handleColor(BuildContext context, bool isFinished, bool isActive, bool isAlreadyReached) { if (isActive) { return activeStepBackgroundColor ?? Colors.transparent; } else { if (isFinished) { return AppColor.primary10; } else if (isAlreadyReached) { return AppColor.primary10; } else { return unreachedBackgroundColor ?? Colors.transparent; } } } Color _handleTitleColor(BuildContext context, bool isFinished, bool isActive, bool isAlreadyReached) { if (isActive) { return activeTextColor ?? Theme.of(context).colorScheme.primary; } else { if (isFinished) { return Colors.transparent; } else if (isAlreadyReached) { return Colors.transparent; } else { return unreachedTextColor ?? Colors.grey.shade400; } } } Widget _buildStepTitle(BuildContext context) { return SizedBox( width: (radius * 4.5) + (padding ?? 0), child: step.customTitle ?? Text( step.title ?? '', maxLines: 3, textAlign: TextAlign.center, softWrap: false, overflow: TextOverflow.visible, style: Theme.of(context).textTheme.bodyMedium.copyWith( color: _handleTitleColor( context, isFinished, isActive, isAlreadyReached), height: 1, // fontSize: radius * 0.45, ), ), ); } SizedBox _buildIcon(BuildContext context) { return SizedBox( width: radius * 2, height: radius * 2, child: Center( child: step.customStep ?? Icon( isActive && step.activeIcon != null ? step.activeIcon.icon : isFinished && step.finishIcon != null ? step.finishIcon.icon : step.icon.icon, size: radius * 0.9, color: Colors.white, ), ), ); } } class StepModel { final Icon icon; final Icon finishIcon; final Icon activeIcon; final Widget customStep; final String title; final Widget customTitle; final String lineText; final Widget customLineWidget; final bool topTitle; final bool enabled; const StepModel({ this.icon, this.finishIcon, this.activeIcon, this.title, this.lineText, this.customStep, this.customTitle, this.customLineWidget, this.topTitle = false, this.enabled = true, }) : assert(icon != null || customStep != null); }