Agent skill

Riverpod Ref Listen Build Only

by divinevideo in divinevideo/divine-mobile

Fix "ref.listen can only be used within the build method of a ConsumerWidget" assertion error in Flutter Riverpod 3.x.

MPL-2.0Auto-check passedMobile

Install Riverpod Ref Listen Build Only

skills CLI
$ npx skills add divinevideo/divine-mobile --skill riverpod-ref-listen-build-only -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install divinevideo/divine-mobile riverpod-ref-listen-build-only --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/riverpod-ref-listen-build-only .claude/skills/riverpod-ref-listen-build-only && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
riverpod-ref-listen-build-only
GitHub stars
266
Token cost
~1.1k tokens
SKILL.md length
277 words
Files
1
Skills in repo
103
Repo updated
First seen
Licence
MPL-2.0

At a glance

Fix "ref.listen can only be used within the build method of a ConsumerWidget" assertion error in Flutter Riverpod 3.x.

  • Works in 5 steps: ref.listen in build() is auto-managed by… → It re-registers each build but Riverpod… → Use a guard flag (_actionAttempted) to… → …
  • ConsumerStatefulWidget crashes with Failed assertion: line 492 pos 7: debugDoingBuild in flutterriverpod consumer.dart
  • SKILL.md covers Problem, Context / Trigger Conditions, Solution and Verification, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Riverpod Ref Listen Build Only is an agent skill from divinevideo/divine-mobile. Fix "ref.listen can only be used within the build method of a ConsumerWidget" assertion error in Flutter Riverpod 3.x. Use when: (1) ConsumerStatefulWidget crashes with "Failed assertion: line 492 pos 7: 'debugDoingBuild'" in flutterriverpod consumer.dart, (2) ref.listen is called inside initState, addPostFrameCallback, or any lifecycle method other than build(), (3) All widget tests fail with this assertion from scheduler callback. Applies to flutterriverpod 3.0+ with ConsumerStatefulWidget.

Its SKILL.md is about 1.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Cross-platform mobile apps. It works with Flutter. The licence is MPL-2.0.

When your agent uses it

  • ConsumerStatefulWidget crashes with Failed assertion: line 492 pos 7: debugDoingBuild in flutterriverpod consumer.dart
  • Ref.listen is called inside initState
  • AddPostFrameCallback
  • Any lifecycle method other than build()

Example prompts

  • “Failed assertion: line 492 pos 7:”
  • “/riverpod-ref-listen-build-only”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. ref.listen in build() is auto-managed by Riverpod (no manual disposal needed)
  2. It re-registers each build but Riverpod handles deduplication
  3. Use a guard flag (_actionAttempted) to prevent side effects from firing multiple times
  4. Keep the immediate check in initState's post-frame callback for when data is already available
  5. ref.read is fine in initState/callbacks; only ref.listen and ref.watch are restricted

What it can do on your machine

Read from SKILL.md and the folder at commit 6487b05. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are dart).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • riverpod.dev
    • pub.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Riverpod Ref Listen Build Only loads about 1.1k tokens when it runs. Until then it costs about 133 tokens; SKILL.md has 277 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~133
When it runs · the whole SKILL.md, loaded when a task matches
~1.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from divinevideo/divine-mobile at commit 6487b05, republished under its MPL-2.0 licence (© divinevideo). 277 words, ~1,110 tokens.

Download SKILL.mdSave it as .claude/skills/riverpod-ref-listen-build-only/SKILL.md (or your agent's skills folder).
name
riverpod-ref-listen-build-only
description
Fix "ref.listen can only be used within the build method of a ConsumerWidget" assertion error in Flutter Riverpod 3.x. Use when: (1) ConsumerStatefulWidget crashes with "Failed assertion: line 492 pos 7: 'debugDoingBuild'" in flutter_riverpod consumer.dart, (2) ref.listen is called inside initState, addPostFrameCallback, or any lifecycle method other than build(), (3) All widget tests fail with this assertion from scheduler callback. Applies to flutter_riverpod 3.0+ with ConsumerStatefulWidget.
author
Claude Code
version
1.0.0
date
2026-02-06

Riverpod ref.listen Must Be in build() for ConsumerStatefulWidget

Problem

In Riverpod 3.x, calling ref.listen inside initState(), addPostFrameCallback, or any method other than build() causes an assertion failure:

ref.listen can only be used within the build method of a ConsumerWidget
'package:flutter_riverpod/src/core/consumer.dart':
Failed assertion: line 492 pos 7: 'debugDoingBuild'

This typically manifests when trying to reactively watch a provider value that may change after the widget is first built (e.g., waiting for an async operation to complete).

Context / Trigger Conditions

  • Using ConsumerStatefulWidget with flutter_riverpod: ^3.0.0
  • Calling ref.listen(provider, callback) inside initState() or a post-frame callback
  • All widget tests fail with the assertion error from ConsumerStatefulElement.listen
  • The error occurs during pumpWidget or pumpAndSettle in tests
  • Stack trace shows SchedulerBinding._invokeFrameCallback -> ConsumerStatefulElement.listen

Solution

Move ref.listen into the build() method. Use a guard flag to ensure side effects only trigger once.

Before (broken):

dart
class _MyScreenState extends ConsumerState<MyScreen> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // THIS WILL CRASH in Riverpod 3.x
      ref.listen(
        myProvider.select((s) => s.someValue),
        (previous, next) {
          if (previous == null && next != null) {
            _doSomething(next);
          }
        },
      );
    });
  }
}

After (fixed):

dart
class _MyScreenState extends ConsumerState<MyScreen> {
  bool _actionAttempted = false;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (!mounted) return;
      // Immediate check for already-available data
      final value = ref.read(myProvider).someValue;
      if (value != null) _tryDoSomething(value);
    });
  }

  void _tryDoSomething(SomeType? value) {
    if (value == null || _actionAttempted) return;
    _actionAttempted = true;
    _doSomething(value);
  }

  @override
  Widget build(BuildContext context) {
    // ref.listen is safe here - Riverpod auto-manages the subscription
    ref.listen(
      myProvider.select((s) => s.someValue),
      (previous, next) {
        if (previous == null && next != null) {
          _tryDoSomething(next);
        }
      },
    );

    return // ... widget tree
  }
}
Key points:
  1. ref.listen in build() is auto-managed by Riverpod (no manual disposal needed)
  2. It re-registers each build but Riverpod handles deduplication
  3. Use a guard flag (_actionAttempted) to prevent side effects from firing multiple times
  4. Keep the immediate check in initState's post-frame callback for when data is already available
  5. ref.read is fine in initState/callbacks; only ref.listen and ref.watch are restricted

Verification

  • All widget tests pass without assertion errors
  • The listener fires correctly when the watched value changes
  • Side effects only trigger once (verify with a counter or log)

Notes

  • ref.watch is also restricted to build() only
  • ref.read can be used anywhere (initState, callbacks, dispose, etc.)
  • In older Riverpod versions (< 3.0), ref.listen was less restricted
  • If you need a listener outside build(), use ref.listenManual() which returns a ProviderSubscription that must be manually disposed in dispose()
  • This constraint exists because Riverpod needs the widget's element context to properly manage subscription lifecycle

References

© divinevideo, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/riverpod-ref-listen-build-only of divinevideo/divine-mobile.

Open the folder on GitHubat commit 6487b05

Compare with similar skills

Riverpod Ref Listen Build Only next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Riverpod Ref Listen Build Only compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Riverpod Ref Listen Build Only this skilldivinevideo/divine-mobile266—~1.1kAutomated safety check: PassMPL-2.0
Add Flutter Docusaurus Localematthiasn/lotti1.2k—~1.2kAutomated safety check: PassGPL-3.0
Tm Launcher DesignFar-Se/tabame372—~3.1kAutomated safety check: PassMIT
Flutter Initbear2u/my-skills933—~2.5kAutomated safety check: PassNone
Mobile App UI Designceorkm/mobile-app-ui-design403—~2kAutomated safety check: PassNone
Marionette Flutter Drive Appleancodepl/marionette_mcp482—~11kAutomated safety check: PassApache-2.0

Similar skills

  • Add, complete, or audit a locale across a Flutter application's ARB catalogs and a localized Docusaurus manual, including generated localization code, locale selectors, native platform declarations…

    1.2k GitHub stars~1.2k tokensUpdated today
    MobileAuto-check passed
  • Tm Launcher Design

    Far-Se/tabame

    Create or revise Tabame's Flutter launcher designs: frames, search bars, result rows, palettes, typography, and action dialogs.

    372 GitHub stars~3.1k tokensUpdated 2 days ago
    MobileAuto-check passed
  • Flutter Init

    bear2u/my-skills

    A skill your agent uses when user wants to create a new Flutter project (Todo/Habit/Note/Expense/Custom domain) with Clean Architecture, Riverpod 3.0, Drift, and modern Flutter stack

    933 GitHub stars~2.5k tokensUpdated 3 mo ago
    MobileAuto-check passed
  • Mobile App UI Design

    ceorkm/mobile-app-ui-design

    Design high-quality mobile app UI/UX screens, flows, and components.

    403 GitHub stars~2k tokensUpdated 3 mo ago
    MobileAuto-check passed
  • Marionette Flutter Drive App

    leancodepl/marionette_mcp

    Set up and drive a running Flutter app (debug or profile) with Marionette — an AI agent's hands and eyes for the app.

    482 GitHub stars~11k tokensUpdated 4 days ago
    MobileAuto-check passed
  • Flutter Screenshot

    JustLookAtNow/pt_mate

    Capture and show two Flutter UI screenshots for this project: one landscape/large-screen preview and one portrait/mobile preview, without using Flutter Web.

    503 GitHub stars~511 tokensUpdated 4 days ago
    MobileAuto-check passed

More from divinevideo/divine-mobile

All 103 skills in this repo
  • Fix ArgoCD ExternalSecret deployment failing with "namespace X is not permitted in project Y".

    266 GitHub stars~931 tokensUpdated today
    Auto-check passed
  • Art Direct

    divinevideo/divine-mobile

    Art direction for any content — reads text, PDF, Word, HTML, PPT, then proposes 2-3 creative directions with photography style, mood, and visual language.

    266 GitHub stars~4.8k tokensUpdated today
    Auto-check passed
  • Async Await Null Race Condition

    divinevideo/divine-mobile

    Fix "Null check operator used on a null value" errors when an object is set to null during an async await.

    266 GitHub stars~881 tokensUpdated today
    Auto-check passed
  • AWS V4 Signing Custom Headers Gcs

    divinevideo/divine-mobile

    Add custom metadata headers (x-amz-meta-) to AWS v4 signed requests for GCS S3-compatible API.

    266 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • Bash Herestring Newline Secrets

    divinevideo/divine-mobile

    Fix password/secret authentication failures caused by trailing newlines when creating Google Cloud secrets (or similar) with bash here-strings.

    266 GitHub stars~791 tokensUpdated today
    Auto-check passed
  • Fix silent video/media processing failures caused by URL extraction code that filters on file extensions (.mp4, .webm, .webp).

    266 GitHub stars~1.1k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Riverpod Ref Listen Build Only

What does Riverpod Ref Listen Build Only do?

Fix "ref.listen can only be used within the build method of a ConsumerWidget" assertion error in Flutter Riverpod 3.x. Riverpod Ref Listen Build Only is an agent skill from divinevideo/divine-mobile.x.

When should I use Riverpod Ref Listen Build Only?

Riverpod Ref Listen Build Only fits situations like: consumerStatefulWidget crashes with Failed assertion: line 492 pos 7: debugDoingBuild in flutterriverpod consumer.dart; ref.listen is called inside initState; addPostFrameCallback; any lifecycle method other than build().

How do I install Riverpod Ref Listen Build Only in Claude Code?

Run `npx skills add divinevideo/divine-mobile --skill riverpod-ref-listen-build-only -a claude-code`. Or copy the skill folder (.agents/skills/riverpod-ref-listen-build-only in divinevideo/divine-mobile) into .claude/skills/riverpod-ref-listen-build-only in your project. Claude Code loads it when a task matches its description.

How do I install Riverpod Ref Listen Build Only in Codex?

Run `npx skills add divinevideo/divine-mobile --skill riverpod-ref-listen-build-only -a codex`. Or copy the skill folder (.agents/skills/riverpod-ref-listen-build-only in divinevideo/divine-mobile) into .agents/skills/riverpod-ref-listen-build-only in your project. Codex loads it when a task matches its description.

Can I use Riverpod Ref Listen Build Only in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add divinevideo/divine-mobile --skill riverpod-ref-listen-build-only -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/riverpod-ref-listen-build-only, .gemini/skills/riverpod-ref-listen-build-only, .github/skills/riverpod-ref-listen-build-only and .opencode/skills/riverpod-ref-listen-build-only in your project.

What does Riverpod Ref Listen Build Only need to run?

SKILL.md names no scripts, command-line tools or credentials: Riverpod Ref Listen Build Only is instructions for the agent only.

Does Riverpod Ref Listen Build Only access the network?

SKILL.md names 2 domains. As links in the text: riverpod.dev and pub.dev. This is read from the text; nothing was executed.

Is Riverpod Ref Listen Build Only safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Riverpod Ref Listen Build Only use?

Riverpod Ref Listen Build Only is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Riverpod Ref Listen Build Only use?

About 1.1k tokens (SKILL.md is roughly 4.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Riverpod Ref Listen Build Only?

Skills that share tags, products or a category with Riverpod Ref Listen Build Only: Add Flutter Docusaurus Locale (matthiasn/lotti, 1.2k stars), Tm Launcher Design (Far-Se/tabame, 372 stars), Flutter Init (bear2u/my-skills, 933 stars) and Mobile App UI Design (ceorkm/mobile-app-ui-design, 403 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Riverpod Ref Listen Build Only?

divinevideo (a GitHub organization) maintains it in divinevideo/divine-mobile, which has 266 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 9, 2026.

Source: divinevideo/divine-mobile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.