Skip to content

Radio assertion failed if rebuild: RadioGroupPolicy can't be used for a radio group that allows multiple selection #175258

@scribetw

Description

@scribetw

Steps to reproduce

  1. Run the attached example
  2. Press the FAB to trigger rebuilding

Expected results

The radio buttons become fewer

Actual results

Assertion failed.

It works if I use the deprecated way without RadioGroup.

Code sample

Code sample
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(colorSchemeSeed: Colors.blue),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({super.key, required this.title});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const _plans = {1, 2, 3, 4, 5, 6, 7, 8, 9};

  int? _limitedPlan;
  int _plan = 9;

  void _incrementLimit() {
    setState(() {
      _limitedPlan = (_limitedPlan ?? 0) + 1;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
//         child: Column(
//             children: [
//               ..._plans
//                 .where((i) => _limitedPlan == null || i > _limitedPlan!)
//                 .map((i) => Radio(
//                   groupValue: _plan,
//                   onChanged: (val) => setState(() => _plan = val!),
//                   value: i,
//                 )),
//               Text(
//                 '$_limitedPlan',
//                 style: Theme.of(context).textTheme.headlineMedium,
//               ),
//             ],
//           ),
        child: RadioGroup(
          groupValue: _plan,
          onChanged: (val) => setState(() => _plan = val!),
          child: Column(
            children: [
              ..._plans
                .where((i) => _limitedPlan == null || i > _limitedPlan!)
                .map((i) => Radio(value: i)),
              Text(
                '$_limitedPlan',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementLimit,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration Image

Logs

Logs
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞════════════════════════
The following assertion was thrown building
Radio<int>(dependencies: [InheritedCupertinoTheme,
_InheritedTheme, _LocalizationsScope-[GlobalKey#c916d],
_RadioGroupStateScope<int>], state: _RadioState<int>#612e9):
Assertion failed:
file:///opt/flutter/packages/flutter/lib/src/widgets/radio_group.dart:110:7
_debugCheckOnlySingleSelection()
"RadioGroupPolicy can't be used for a radio group that allows
multiple selection"

Widget creation tracking is currently disabled. Enabling it
enables improved error messages. It can be enabled by passing
`--track-widget-creation` to `flutter run` or `flutter test`.

When the exception was thrown, this was the stack
#2      _RadioGroupState.registerClient (package:flutter/src/widgets/radio_group.dart:110:7)
#3      RadioClient.registry= (package:flutter/src/widgets/radio_group.dart:270:16)
#4      _RawRadioState.didUpdateWidget (package:flutter/src/widgets/raw_radio.dart:170:5)
#5      StatefulElement.update (package:flutter/src/widgets/framework.dart:5893:55)
#6      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#7      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#8      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#9      Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#10     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#11     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#13     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#14     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#15     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#18     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#19     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#21     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#22     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#23     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#24     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#25     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#26     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#30     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#31     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#33     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#34     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#35     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#37     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#38     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#39     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#40     Element.updateChildren (package:flutter/src/widgets/framework.dart:4139:32)
#41     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7202:17)
#42     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#43     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#44     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#45     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#46     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#48     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#49     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#50     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#51     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#52     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#53     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#54     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#56     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#57     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#59     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#60     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#61     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#62     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#63     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#64     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#65     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#66     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#68     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#69     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#70     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#71     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#72     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#73     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#74     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#75     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#76     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#77     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#78     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#79     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#80     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#81     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#82     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#83     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#84     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#85     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#86     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#87     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#88     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#89     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#90     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#91     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#92     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#93     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#94     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#95     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#96     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#97     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#98     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#99     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#100    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#101    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#102    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#103    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#104    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#105    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11)
#106    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#107    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#108    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#109    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#110    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#111    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#112    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#113    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#114    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#115    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#116    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#117    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#119    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#120    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#121    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#122    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#123    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#124    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#125    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#126    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#127    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#128    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#129    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#130    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#131    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#132    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#133    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#134    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#135    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.35.3, on Ubuntu 22.04.5 LTS 6.8.0-79-generic,
    locale en_US.UTF-8) [211ms]
    • Flutter version 3.35.3 on channel stable at
      /home/rudy/.asdf/installs/flutter/3.35.3
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision a402d9a437 (9 days ago), 2025-09-03 14:54:31 -0700
    • Engine revision ddf47dd3ff
    • Dart version 3.9.2
    • DevTools version 2.48.0
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop,
      enable-windows-desktop, enable-android, enable-ios, cli-animations,
      enable-lldb-debugging

[✓] Android toolchain - develop for Android devices (Android SDK version 36.0.0)
    [1,765ms]
    • Android SDK at /home/rudy/Android/Sdk
    • Emulator version 36.1.9.0 (build_id 13823996) (CL:N/A)
    • Platform android-36, build-tools 36.0.0
    • ANDROID_HOME = /home/rudy/Android/Sdk
    • Java binary at:
      /home/rudy/.local/share/JetBrains/Toolbox/apps/android-studio/jbr/bin/java
      This is the JDK bundled with the latest Android Studio installation on
      this machine.
      To manually set the JDK path, use: `flutter config
      --jdk-dir="path/to/jdk"`.
    • Java version OpenJDK Runtime Environment (build 21.0.7+-13880790-b1038.58)
    • All Android licenses accepted.

[✓] Chrome - develop for the web [179ms]
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop [602ms]
    • Ubuntu clang version 14.0.0-1ubuntu1.1
    • cmake version 3.22.1
    • ninja version 1.10.1
    • pkg-config version 0.29.2
    • GL_EXT_framebuffer_blit: no
    • GL_EXT_texture_format_BGRA8888: no

[✓] Android Studio (version 2025.1.3) [176ms]
    • Android Studio at
      /home/rudy/.local/share/JetBrains/Toolbox/apps/android-studio
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • android-studio-dir =
      /home/rudy/.local/share/JetBrains/Toolbox/apps/android-studio
    • Java version OpenJDK Runtime Environment (build 21.0.7+-13880790-b1038.58)

[✓] IntelliJ IDEA Ultimate Edition (version 2025.2) [175ms]
    • IntelliJ at /snap/intellij-idea-ultimate/644
    • Flutter plugin version 87.1
    • Dart plugin version 252.25557.23

[✓] VS Code (version 1.103.2) [8ms]
    • VS Code at /usr/share/code
    • Flutter extension version 3.118.0

[✓] Connected device (3 available) [162ms]
    • sdk gphone64 x86 64 (mobile) • emulator-5554 • android-x64    • Android 16
      (API 36) (emulator)
    • Linux (desktop)              • linux         • linux-x64      • Ubuntu
      22.04.5 LTS 6.8.0-79-generic
    • Chrome (web)                 • chrome        • web-javascript • Google
      Chrome 140.0.7339.127

[✓] Network resources [1,017ms]
    • All expected network resources are available.

• No issues found!

Metadata

Metadata

Assignees

Labels

P2Important issues not at the top of the work lista: error messageError messages from the Flutter frameworkfound in release: 3.35Found to occur in 3.35found in release: 3.37Found to occur in 3.37frameworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onr: fixedIssue is closed as already fixed in a newer versionteam-frameworkOwned by Framework teamtriaged-frameworkTriaged by Framework teamworkaround availableThere is a workaround available to overcome the issue

Type

No type

Projects

Status

Done (PR merged)

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions