Flavor Text

plugin version coverage report pipeline status dependencies

A lightweight and fully customisable text parser for Flutter.

Flavor text is often the last text on a card or on the rear of a toy card or package, and is usually printed in italics or written between quotes to distinguish it from game-affecting text. — Flavor Text - Wikipedia

Writing rich text in Flutter can be a pain:

Text.rich(
  TextSpan(
    text: 'Welcome',
    children: [
      TextSpan(
        text: 'To my amazing',
        children: [
          TextSpan(
            text: 'App!',
            style: TextStyle(fontWeight: FontWeight.bold),
          ),
        ],
        style: TextStyle(color: Color(0xFFFF0000)),
      )
    ],
  ),
),

But writing rich text with Flavor Text is simply:

FlavorText(
  'Welcome <style color="0xFFFF0000">to my amazing <style fontWeight="bold">App!</style></style>',
),

Installation

Add flavor_text as a dependency in your pubspec.yaml file (what?).

Docs & API

See the API Docs for detailed information on how to use Flavor Text.

See the interactive example for of all the things that you can do with Flavor Text: Flavor Text example

Usage

Flavor Text allows you to create custom rich text using strings. You don't have to mess with Text.rich and TextSpan's. Just you, your text and a single widget.

See the Basic Usage section for an introduction or jump directly to the Advanced Usage section.

Basic Usage

Flavor Text uses Tag components to build your custom rich text. These Tag components make the magic possible. Flavor Text comes with a few default Tag components.

You can register custom Tag components, see the Advanced Usage section.

Let's start with defining the rich text you want to use as a string:

final richText = 'Hello <style color="0xFFFF0000">world</style>';

We have now created a string with some custom styling, and we can use that string in our Widget tree like so:

@override
Widget build(BuildContext context) {
  return Column(
    children: [
      ...
      
      FlavorText(richText),
      
      ...
    ],
  );
}

Which will render the text Hello world with the word world in red.

The FlavorText widget also accepts extra arguments for default styling and text alignment:

FlavorText(
  richText,
  style: TextStyle(
    color: Colors.green,
  ),
  textAlign: TextAlign.center,
)

You can also nest multiple tags, example:

final richText = 'Hello <style color="0xFFFF0000">world and <style fontWeight="bold">you</style></style>!';

Advanced Usage

If the default Tag components are not suitable for your needs or you need something specifically tailored to your usecase, you can easily create and register your own tag.

First you need to create your own tag, for this example we will create a tag that adds the Icons.help icon to our text:

class HelpTag extends Tag {
  @override
  InlineSpan build(BuildContext context) {
    return WidgetSpan(child: Icon(Icons.help));
  }
}

You can then register it by calling the FlavorText.registerTag:

void main() {
  ...

  // The first argument is the tag key.
  FlavorText.registerTag('help', () => HelpTag());

  ...
}

Now that our new tag is registered we can use it in our text:

FlavorText('This text will end in an icon <help></help>');

// Or using a self-closing tag.
FlavorText('This text will end in an icon <help/>');

If we want to add some properties to our tag for more fine tuned control, for example we want to be able to change the color:

class HelpTag extends Tag {
  @override
  List<Property> get supportedProperties => [Property('color')];

  @override
  InlineSpan build(BuildContext context) {
    final colorValue = properties['color']?.value;
    var color = Colors.black;
    if (colorValue != null) {
      color = Color(int.parse(colorValue));
    }

    return WidgetSpan(
      child: Icon(
        Icons.help,
        color: color,
      ),
    );
  }
}

The supportedProperties define which properties are allowed on our tag, and we can read the value by accessing the properties field.

Now that we have properties we can use these in our tag:

FlavorText('This text will end in an icon <help color="0xFF00FF00"/>');

Libraries

flavor_text
A lightweight and fully customisable text parser for Flutter.