Search packages, repositories and app categories

pretty_diff_text cover
Package detailsv2.1.0

pretty_diff_text

PrettyDiffText is wrapper of RichText which shows differences between two texts visually. It uses Google's diff-match-patch library by default.

AndroidiOSWebmacOSWindowsLinux
30-day downloads
16.5K
Likes
66
Pub points
160

Install package

flutter pub add pretty_diff_text

Package Overview

Package selection guidance compiled from public package information, community data, and project usage.

PrettyDiffText is a Flutter package that wraps RichText to visually highlight differences between two text strings. It leverages Google's diff-match-patch library for accurate and efficient text comparison, making it ideal for showing edits, changes, or revisions in a readable format. The package supports multiple platforms and integrates seamlessly into apps needing real-time or historical text comparison. It enhances user experience by clearly marking additions, deletions, and modifications with color and formatting.

Use cases

  • Showing text revisions in collaborative apps
  • Visualizing code or document changes
  • Displaying edit history in note-taking apps
  • Highlighting differences in versioned content
  • Real-time text comparison in chat or messaging
  • Tracking updates in configuration or settings

Key features

  • Uses diff-match-patch for precise comparisons
  • Supports rich text formatting
  • Color-coded additions and deletions
  • Cross-platform compatibility
  • Easy integration with existing RichText widgets
  • Customizable styling options

Suitable for

  • Developers building editing or collaboration tools
  • Apps requiring change tracking
  • Educational or documentation platforms
  • Version control interfaces
  • UIs displaying dynamic text updates

Considerations

  • May increase widget complexity for simple cases
  • Performance impact with very long texts
  • Requires careful handling of nested rich text
  • Limited customization beyond basic styling
  • Depends on external diff-match-patch library
  • Not optimized for high-frequency updates

Original README

Original README snapshot from the linked source repository. Visit the repository for the latest content.

PrettyDiffText

Snapshot

PrettyDiffText is wrapper of RichText which demonstrates differences between two texts visually.

By default, it uses Google's diff-match-patch library which implements Myer's diff algorithm. It is generally considered to be the best general-purpose diff.

  • :fire: Pure Dart: It is written purely in Dart.
  • :star: Cross-Platform: Works on Android, iOS, macOS, Windows, Linux and the web.
  • :boom: Highly Customizable: Almost everything can be customized:
    • Text style of AddedText, DeletedText, EqualText.
    • Diff cleanup types: SEMANTIC, EFFICIENCY, NONE.
    • Diff algorithm tuning: DiffTimeout, EditCost.
    • Bring your own diffs: calculate the diffs using your own algorithm.
    • All customization which Flutter's RichText has.

Installing:

Add this to your package's pubspec.yaml file:

dependencies:
  pretty_diff_text: ^2.1.0

Import

import 'package:pretty_diff_text/pretty_diff_text.dart';

How to use

It is easy as using Text widget!

PrettyDiffText(
  oldText: "Your old text",
  newText: "Your new text",
  )

Snapshot

Customization

Those properties are available for customization:

/// The [oldText] is the original text to compare against.
/// The [newText] is the modified text to compare with.
///
/// The [diffCleanupType] determines how the diff results are cleaned up:
/// - [DiffCleanupType.SEMANTIC]: Reduces the number of edits by eliminating semantically trivial equalities (default)
/// - [DiffCleanupType.EFFICIENCY]: Reduces the number of edits by eliminating operationally trivial equalities
/// - [DiffCleanupType.NONE]: No cleanup, raw diff output
///
/// The [defaultTextStyle] is applied to unchanged text.
/// The [addedTextStyle] is applied to text that was added (present in [newText] but not in [oldText]).
/// The [deletedTextStyle] is applied to text that was deleted (present in [oldText] but not in [newText]).
///
/// The [diffTimeout] limits computation time in seconds. If the mapping phase takes longer than this,
/// computation is truncated and returns the best solution found. A value of 0 allows unlimited computation.
///
/// The [diffEditCost] affects cleanup when using [DiffCleanupType.EFFICIENCY]. Higher values result in
/// more aggressive cleanup.
///
/// The following properties are passed directly to the underlying [RichText] widget:
/// - [textAlign]: How the text should be aligned horizontally.
/// - [textDirection]: The directionality of the text.
/// - [softWrap]: Whether the text should break at soft line breaks.
/// - [overflow]: How visual overflow should be handled.
/// - [textScaleFactor]: The number of font pixels for each logical pixel.
/// - [maxLines]: An optional maximum number of lines for the text to span.
/// - [locale]: Used to select region-specific glyphs and formatting.
/// - [strutStyle]: Defines the strut, which sets minimum vertical layout metrics.
/// - [textWidthBasis]: Defines how to measure the width of the rendered text.
/// - [textHeightBehavior]: Defines how the paragraph will apply TextStyle.height to the ascent of the first line and descent of the last line.

Bring Your Own Diffs

If you'd like to calculate your own diffs, you can do so and pass them via the withDiffs contructor:

PrettyDiffText.withDiffs(
  diffs: _getDiffs(
    oldText: _oldTextEditingController.text,
    newText: _newTextEditingController.text,
    diffCleanupType: _diffCleanupType,
    diffTimeout: _diffTimeout,
    diffEditCost: _diffEditCost,
  ),
)

Demo Apps

Clone the demo app to play around: DEMO

Changelog

CHANGELOG

License

MIT License

References:

Categories

Dependencies

Dependency list 1 items

Source repository

Projects using this package