styled_text 5.1.0 copy "styled_text: ^5.1.0" to clipboard
styled_text: ^5.1.0 copied to clipboard

outdated

Text widget with formatted text using tags. Makes it easier to use formatted text in multilingual applications.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:styled_text/styled_text.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'StyledText Demo',
      theme: ThemeData(
        primarySwatch: Colors.teal,
      ),
      home: DemoPage(),
    );
  }
}

class DemoPage extends StatelessWidget {
  void _alert(BuildContext context, {String text = 'Tapped'}) {
    showDialog<void>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: Text(text),
          actions: <Widget>[
            TextButton(
              child: Text('OK'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  void _openLink(BuildContext context, Map<String?, String?> attrs) {
    final String? link = attrs['href'];

    showDialog<void>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Open Link'),
          content: Text(link ?? 'Unknown link'),
          actions: <Widget>[
            TextButton(
              child: Text('Ok'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StyledText Demo'),
      ),
      body: Center(
        child: SingleChildScrollView(
          padding: const EdgeInsets.symmetric(vertical: 32),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // Simple formatted text
              StyledText(
                text: 'Test: <b>bold</b> text.',
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                },
              ),

              // Nested multiple styles
              StyledText(
                text: 'Test: <b>bold <i>italic</i> bold</b> text.',
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                  'i': StyledTextTag(
                      style: TextStyle(fontStyle: FontStyle.italic)),
                },
              ),

              // Text with quotes
              StyledText(
                text: 'Quote test: <b>&quot;bold&quot;</b> text.',
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                },
              ),

              // Multiline text without breaks
              const SizedBox(height: 20),
              StyledText(
                newLineAsBreaks: false,
                text: """Multiline text 
(wo breaks)""",
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                },
              ),

              // Multiline text with breaks
              const SizedBox(height: 20),
              StyledText(
                text: """Multiline text
(with breaks)""",
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                },
              ),

              // Text with icon
              const SizedBox(height: 20),
              StyledText(
                text: 'Text with alarm <alarm/> icon.',
                tags: {
                  'alarm': StyledTextIconTag(
                    Icons.alarm,
                    color: Colors.teal,
                    size: 18,
                    onTap: (text, attributes) =>
                        _alert(context, text: 'Alarm Tapped'),
                  ),
                },
              ),

              // Text with icon inside styled text
              const SizedBox(height: 20),
              StyledText(
                text: 'Text with <red>alarm <alarm/> icon</red>.',
                tags: {
                  'red': StyledTextTag(style: TextStyle(color: Colors.red)),
                  'alarm': StyledTextIconTag(
                    Icons.alarm,
                    color: Colors.teal,
                    size: 18,
                    onTap: (text, attributes) =>
                        _alert(context, text: 'Alarm Tapped'),
                  ),
                },
              ),

              // Text with link
              const SizedBox(height: 20),
              StyledText(
                text:
                    'Text with <link href="https://flutter.dev">link</link> inside.',
                tags: {
                  'link': StyledTextActionTag(
                    (_, attrs) => _openLink(context, attrs),
                    style: TextStyle(decoration: TextDecoration.underline),
                  ),
                },
              ),

              // Text with action
              const SizedBox(height: 20),
              StyledText(
                text:
                    'Text with <action><red>red</red> action</action> inside.',
                tags: {
                  'red': StyledTextTag(style: TextStyle(color: Colors.red)),
                  'action': StyledTextActionTag(
                    (text, attributes) => _alert(context),
                    style: TextStyle(decoration: TextDecoration.underline),
                  ),
                },
              ),

              // Text with widget
              const SizedBox(height: 20),
              StyledText(
                text: 'Text with <input/> inside.',
                tags: {
                  'input': StyledTextWidgetTag(
                    TextField(
                      decoration: InputDecoration(
                        hintText: 'Input',
                      ),
                    ),
                    size: Size.fromWidth(200),
                    constraints: BoxConstraints.tight(Size(100, 50)),
                  ),
                },
              ),

              const Divider(height: 40),

              // Selectable text
              StyledText.selectable(
                text: 'Test: selectable <b>bold</b> text.',
                tags: {
                  'b': StyledTextTag(
                      style: TextStyle(fontWeight: FontWeight.bold)),
                },
              ),

              const Divider(height: 40),

              // Text with custom color tag
              StyledText(
                text:
                    'Text with custom <color text="#ff5500">color</color> text.',
                tags: {
                  'color': StyledTextCustomTag(
                      baseStyle: TextStyle(fontStyle: FontStyle.italic),
                      parse: (baseStyle, attributes) {
                        if (attributes.containsKey('text') &&
                            (attributes['text']!.substring(0, 1) == '#') &&
                            attributes['text']!.length >= 6) {
                          final String hexColor =
                              attributes['text']!.substring(1);
                          final String alphaChannel = (hexColor.length == 8)
                              ? hexColor.substring(6, 8)
                              : 'FF';
                          final Color color = Color(int.parse(
                              '0x$alphaChannel' + hexColor.substring(0, 6)));
                          return baseStyle?.copyWith(color: color);
                        } else {
                          return baseStyle;
                        }
                      }),
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}
469
likes
90
points
115k
downloads

Publisher

verified publisheramazingsoftworks.com

Weekly Downloads

Text widget with formatted text using tags. Makes it easier to use formatted text in multilingual applications.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, xmlstream

More

Packages that depend on styled_text