import 'package:flutter/material.dart'; typedef OutlinedWidgetBuilder = Widget Function(BuildContext context, bool isShadow); class OutlinedText extends StatelessWidget { final OutlinedWidgetBuilder leadingBuilder, trailingBuilder; final String text; final TextStyle style; final double outlineWidth; final Color outlineColor; static const widgetSpanAlignment = PlaceholderAlignment.middle; const OutlinedText({ Key key, this.leadingBuilder, @required this.text, this.trailingBuilder, @required this.style, double outlineWidth, Color outlineColor, }) : outlineWidth = outlineWidth ?? 1, outlineColor = outlineColor ?? Colors.black, super(key: key); @override Widget build(BuildContext context) { return Stack( children: [ Text.rich( TextSpan( children: [ if (leadingBuilder != null) WidgetSpan( alignment: widgetSpanAlignment, child: leadingBuilder(context, true), ), TextSpan( text: text, style: style.copyWith( foreground: Paint() ..style = PaintingStyle.stroke ..strokeWidth = outlineWidth ..color = outlineColor, ), ), if (trailingBuilder != null) WidgetSpan( alignment: widgetSpanAlignment, child: trailingBuilder(context, true), ), ], ), ), Text.rich( TextSpan( children: [ if (leadingBuilder != null) WidgetSpan( alignment: widgetSpanAlignment, child: leadingBuilder(context, false), ), TextSpan( text: text, style: style, ), if (trailingBuilder != null) WidgetSpan( alignment: widgetSpanAlignment, child: trailingBuilder(context, false), ), ], ), ), ], ); } }