flutter_easy_seo 1.2.1 copy "flutter_easy_seo: ^1.2.1" to clipboard
flutter_easy_seo: ^1.2.1 copied to clipboard

Generate real SEO HTML, JSON-LD, sitemaps & llms.txt for search engine & AI bots: Automated via headless WidgetTester, interactive mode, async data & dynamic routes support.

1.2.1 #

New Wrappers/Extensions #

  • New easySeoSpan (SEOTextType.span) on the Widget, Text and String extensions — emits <span>text</span>, with the text auto-extracted from the wrapped Text/RichText child or set explicitly via text:.
  • New SEOAddress model, EasySEOAddressWrapper / easySeoAddress — semantic <address> element with a fixed organization JSON-LD structure (@type: ProfessionalService, @id: https://lxr.at/#organization). The single parameters (name, founder, streetAddress, addressLocality, postalCode, addressRegion, addressCountry, email, telephone, sameAs) are the source of truth for both the JSON-LD script and the derived microdata (e.g. a nested PostalAddress).

1.2.0 #

Persistent Hidden Widgets #

  • Persistent hidden content: unmounted wrapper subtrees (e.g. hidden TabBarView/PageView tabs) are now frozen per page and re-injected into their wrapping section on every generation, so hidden tabs keep contributing headings, text, links and structured data to the SEO output.
  • New EasySEOBaseWrapper.id — stable identity for re-mount matching (a Key works too); without it, wrappers are matched by tree position and content hash.
  • New EasySEOBaseWrapper.persistHidden and EasySEOScope widget — control whether a wrapper's subtree persists after unmounting (wrapper → nearest scope → default true).

Lists and JSON-LD #

  • Structured data quality: JSON-LD list items (ListItem) and lists (ItemList) now carry meaningful name values — the list item's text and the surrounding heading of the list, respectively. Heading names are resolved regardless of nesting depth (through intermediary wrappers such as <div>/<section>), and a user-authored name always wins.
  • New generateJsonLd option on EasySEOListWrapper/easySeoList (default false): lists render plain <ul>/<li> HTML without ItemList/ListItem JSON-LD unless enabled. Only affects that list — <nav> breadcrumbs and navigation still emit JSON-LD.
  • Structural wrapper lists (lists whose only content is nested lists) are suppressed from JSON-LD output, so only content-bearing lists are emitted.
  • itemListElement, image and additionalProperty are always emitted as arrays, even for single-item lists.

<head> tags #

  • New EasySEOPage.headTagsBuilder callback for building page-level head tags. It is invoked at HTML generation time (not widget-tree build), so it can resolve translated texts (e.g. from a locale provider) without triggering a rebuild of the whole widget tree — useful when the static title/description params don't fit translated content.

Bug Fixes #

  • position and other list metadata are emitted in JSON-LD only — no longer leaked into the visible HTML (no <span class="position">/microdata).
  • URL output fixes: fragment (#) and query strings (?, &, =) are no longer percent-encoded in canonical/alternate URLs, resolved relative links and JSON-LD URLs.
  • Heading order preserved by default: the automatic h1–h6 reordering is now disabled (EasySEOPage.sortHeadingsByPriority, default false). Sibling wrappers keep the order they are declared in, so interleaved structures like h4, p, h4, p are no longer regrouped. Footers still sort last. Set sortHeadingsByPriority: true to restore the old behavior.
  • Additional children declared on a wrapper (e.g. easySeoHtml(children: ...)) are now emitted before the content produced by nested wrappers, in declaration order. Previously headings were hoisted first and non-heading children were emitted after the nested content.

1.1.0 #

  • License: Relicensed to Apache 2.0.
  • Infrastructure: Paid turnkey server stacks are now decoupled from the package and managed via Polar.
  • Updated Readme.md.

1.0.8 #

  • Automatic llms.txt/llms-full.txt generation for AI crawlers and LLM clients (index + full page Markdown dumps, same route set as the sitemap).
  • New siteName/siteDescription configuration options for the llms.txt header (with automatic root-page fallback).
  • Interactive Mode: new "Generate LLMs" button and llms.txt / llms-full.txt download support.
  • Changes to example project: Generate llms.txt/llms-full.txt in seo_generation_test.dart, Link to project, fix breadcrumb bug.
  • Updated Readme.md.

1.0.7 #

  • Update pub.dev package topics and README metadata

1.0.6 #

  • Moved convenience test mocks and utils and sync client to dedicated package flutter_easy_seo_sync.
  • Code cleanup.

1.0.5 #

  • Moved convenience test mocks and utils to example project. This is a temporary solution to convince pub.dev that this package is suitable for web.
  • Removed unused imports and packages.

1.0.4 #

  • revert last change

1.0.3 #

  • moved test utils to sub package

1.0.2 #

  • specify platforms
  • fix some warnings

1.0.1 #

  • refactor to make some public elements private
  • code doc comments

1.0.0 #

  • Complete SEO-friendly HTML documents from the live widget tree
  • Automatic sitemap.xml generation
  • SEO-relevant <head> tags and metadata (Twitter, Open Graph, custom meta tags)
  • Interactive Mode with UI overlay for debugging and manual generation
  • Automated Mode via Flutter Widget Tester for CI and scheduled generation
  • JSON-LD structured data and Microdata support
2
likes
160
points
539
downloads
screenshot

Documentation

API reference

Publisher

verified publisherlxandr.at

Weekly Downloads

Generate real SEO HTML, JSON-LD, sitemaps & llms.txt for search engine & AI bots: Automated via headless WidgetTester, interactive mode, async data & dynamic routes support.

Homepage
Repository (GitHub)
View/report issues

Topics

#seo #web #html #metadata #automation

License

Apache-2.0 (license)

Dependencies

flutter, web

More

Packages that depend on flutter_easy_seo