title: A Hero widget cannot be the descendant of another Hero widget after version change
body: <p>I was recently trying to add in firebase fcm and it didn't work just caused several errors, so I rolled everything back to the original RUNNING code but upgraded flutter in the process...Since v1.3.10 a Hero cannot contain another Hero widget in its children hierarchy but I cannot find a fix. (ideally don't want to change version back)</p>
  
  <p>I've checked the heroTags and also can't find any nested Hero widgets - maybe it is because of the animated builder?</p>
  
  <pre><code>import 'package:flutter/material.dart';
  import 'dart:math';
  import 'package:vector_math/vector_math.dart' show radians, Vector3;
  import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  import './Custom Icons/my_flutter_app_icons.dart' as CustomIcons;
  import 'package:startoversword/liftPage.dart';
  import 'package:startoversword/analWinkPage.dart';
  import 'package:startoversword/lipPage.dart';
  import 'package:startoversword/windscreenWiperPage.dart';
  import 'package:startoversword/highHeelPage.dart';
  import 'package:startoversword/rollerCoasterPage.dart';
  import 'package:startoversword/notificationPage.dart';
  import 'package:flutter/services.dart';
  
  void main() async {
    await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    runApp(MyApp());
  }
  
  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Menu',
        home: _placeMyAppScaffold(),
      );
    }
  }
  
  class _placeMyAppScaffold extends StatelessWidget {
    Color defaultPink = Colors.white;
    Color pageThemeColor = Color(0xffF599E9);
    @override
    Widget build(BuildContext context) {
      // TODO: implement build
      return Scaffold(
          body: SizedBox.expand(child: RadialMenu()),
          appBar: AppBar(
            actions: &lt;Widget&gt;[
              FlatButton(
                child: Icon(Icons.notifications, color: Colors.white, size: 50.0),
                onPressed: () {
                  print("notification pressed");
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) =&gt; NotificationPage()));
                },
              ),
            ],
            title: Text('The S Word'),
            backgroundColor: pageThemeColor,
          ));
    }
  }
  
  class RadialMenu extends StatefulWidget {
    createState() =&gt; _RadialMenuState();
  }
  
  class _RadialMenuState extends State&lt;RadialMenu&gt;
      with SingleTickerProviderStateMixin {
    AnimationController controller;
  
    @override
    void initState() {
      super.initState();
      controller =
          AnimationController(duration: Duration(milliseconds: 900), vsync: this);
    }
  
    @override
    Widget build(BuildContext context) {
      return RadialAnimation(controller: controller);
    }
  
    @override
    void dispose() {
      controller.dispose();
      super.dispose();
    }
  }
  
  class RadialAnimation extends StatelessWidget {
    RadialAnimation({Key key, this.controller})
        : translation = Tween&lt;double&gt;(
            begin: 0.0,
            end: 100.0,
          ).animate(
            CurvedAnimation(parent: controller, curve: Curves.elasticOut),
          ),
          scale = Tween&lt;double&gt;(
            begin: 1.5,
            end: 0.0,
          ).animate(
            CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn),
          ),
          rotation = Tween&lt;double&gt;(
            begin: 0.0,
            end: 360.0,
          ).animate(
            CurvedAnimation(
              parent: controller,
              curve: Interval(
                0.0,
                0.7,
                curve: Curves.decelerate,
              ),
            ),
          ),
          super(key: key);
  
    final AnimationController controller;
    final Animation&lt;double&gt; rotation;
    final Animation&lt;double&gt; translation;
    final Animation&lt;double&gt; scale;
  
    @override
    Widget build(BuildContext context) {
      Color defaultPink = Color(0xffF599E9);
      return AnimatedBuilder(
          animation: controller,
          builder: (context, widget) {
            return Transform.rotate(
                angle: radians(rotation.value),
                child: Stack(alignment: Alignment.center, children: &lt;Widget&gt;[
                  Hero(
                    tag: "liftScreenButton",
                    child: Container(
                      child: _buildButton(
                        30,
                        color: Color(0xfff665c6),
                        icon: CustomIcons.YoniFonts.lift,
                        context: context,
                        nextScreen: 'LiftScreen',
                      ),
                    ),
                  ),
                  Hero(
                    tag: "winkScreenButton",
                    child: Container(
                      child: _buildButton(
                        90,
                        color: Color(0xffe654be),
                        icon: CustomIcons.YoniFonts.dot_circled,
                        context: context,
                        nextScreen: 'winkScreen',
                      ),
                    ),
                  ),
                  Hero(
                    tag: "lipScreenButton",
                    child: Container(
                      child: _buildButton(
                        150,
                        color: Color(0xffd643b7),
                        icon: CustomIcons.YoniFonts.lips,
                        context: context,
                        nextScreen: 'lipScreen',
                      ),
                    ),
                  ),
                  Hero(
                    tag: "windscreenWiperScreenButton",
                    child: Container(
                      child: _buildButton(
                        210,
                        color: Color(0xffc632b0),
                        icon: CustomIcons.YoniFonts.car,
                        context: context,
                        nextScreen: 'WindscreenWiperScreen',
                      ),
                    ),
                  ),
                  Hero(
                    tag: "highHeelScreenButton",
                    child: Container(
                      child: _buildButton(
                        270,
                        color: Color(0xffb621a9),
                        icon: CustomIcons.YoniFonts.high_heels,
                        context: context,
                        nextScreen: 'HighHeelScreen',
                      ),
                    ),
                  ),
                  Hero(
                    tag: "rollerCoasterScreenButton",
                    child: Container(
                      child: _buildButton(
                        330,
                        color: Color(0xffa711a2),
                        icon: CustomIcons.YoniFonts.roller_coaster,
                        context: context,
                        nextScreen: 'rollerCoasterScreen',
                      ),
                    ),
                  ),
                  Transform.scale(
                    scale: scale.value - 1,
                    child: FloatingActionButton(
                        child: Icon(CustomIcons.YoniFonts.upsideDownYoni),
                        heroTag: "upsideDownYoni",
                        onPressed: _close,
                        backgroundColor: defaultPink),
                  ),
                  Transform.scale(
                    scale: scale.value,
                    child: FloatingActionButton(
                      heroTag: "initalYoni",
                      child: Icon(CustomIcons.YoniFonts.yoni),
                      onPressed: _open,
                      backgroundColor: defaultPink,
                    ),
                  )
                ]));
          });
    }
  
    _open() {
      controller.forward();
    }
  
    _close({context, String nextScreen}) {
      controller.reverse();
      if (nextScreen == 'LiftScreen') {
        print("NEXT SCREEN IS LIFTPAGE");
        Navigator.push(
            context, MaterialPageRoute(builder: (context) =&gt; LiftPage()));
      } else if (nextScreen == "winkScreen") {
        print("NEXT SCREEN IS WINKPAGE");
        Navigator.push(
            context, MaterialPageRoute(builder: (context) =&gt; WinkPage()));
      } else if (nextScreen == "lipScreen") {
        print("NEXT SCREEN IS LIP PAGE");
        Navigator.push(
            context, MaterialPageRoute(builder: (context) =&gt; LipPage()));
      } else if (nextScreen == "WindscreenWiperScreen") {
        print("NEXT SCREEN IS WINDSCREENWIPERPAGE");
        Navigator.push(context,
            MaterialPageRoute(builder: (context) =&gt; WindScreenWiperPage()));
      } else if (nextScreen == "HighHeelScreen") {
        print("NEXT SCREEN IS HIGHHEELPAGE");
        Navigator.push(
            context, MaterialPageRoute(builder: (context) =&gt; HighHeelPage()));
      } else if (nextScreen == "rollerCoasterScreen") {
        print("NEXT SCREEN IS ROLLERCOASTERPAGE");
        Navigator.push(context,
            MaterialPageRoute(builder: (context) =&gt; RollerCoasterPage()));
      } else {
        return;
      }
      ;
    }
  
    _buildButton(double angle,
        {Color color, IconData icon, context, String nextScreen}) {
      final double rad = radians(angle);
      return Transform(
          transform: Matrix4.identity()
            ..translate(
                (translation.value) * cos(rad), (translation.value) * sin(rad)),
          child: FloatingActionButton(
              child: Icon(icon),
              heroTag: nextScreen,
              backgroundColor: color,
              onPressed: () =&gt; _close(context: context, nextScreen: nextScreen),
              elevation: 0));
    }
  }
  </code></pre>
  
  <p>The error message points to </p>
  
  <pre><code>_buildButton(double angle,
        {Color color, IconData icon, context, String nextScreen}) {
      final double rad = radians(angle);
      return Transform(
          transform: Matrix4.identity()
            ..translate(
                (translation.value) * cos(rad), (translation.value) * sin(rad)),
          child: FloatingActionButton(
              child: Icon(icon),
              heroTag: nextScreen, //error here
              backgroundColor: color,
              onPressed: () =&gt; _close(context: context, nextScreen: nextScreen),
              elevation: 0));
    }
  }
  </code></pre>
  
  <p>For interest here is the complete output</p>
  
  <pre><code>I/flutter (20678): #431    ComponentElement.mount 
  package:flutter/…/widgets/framework.dart:3911
  I/flutter (20678): #432    Element.inflateWidget 
  package:flutter/…/widgets/framework.dart:3093
  I/flutter (20678): #433    Element.updateChild 
  package:flutter/…/widgets/framework.dart:2896
  I/flutter (20678): #434    RenderObjectToWidgetElement._rebuild 
  package:flutter/…/widgets/binding.dart:940
  I/flutter (20678): #435    RenderObjectToWidgetElement.mount 
  package:flutter/…/widgets/binding.dart:911
  I/flutter (20678): #436    RenderObjectToWidgetAdapter.attachToRenderTree.&lt;anonymous closure&gt; 
  package:flutter/…/widgets/binding.dart:857
  I/flutter (20678): #437    BuildOwner.buildScope 
  package:flutter/…/widgets/framework.dart:2320
  I/flutter (20678): #438    RenderObjectToWidgetAdapter.attachToRenderTree 
  package:flutter/…/widgets/binding.dart:856
  I/flutter (20678): #439    _WidgetsFlutterBinding&amp;BindingBase&amp;GestureBinding&amp;ServicesBinding&amp;SchedulerBinding&amp;PaintingBinding&amp;SemanticsBinding&amp;RendererBinding&amp;WidgetsBinding.attachRootWidget 
  package:flutter/…/widgets/binding.dart:737
  I/flutter (20678): #440    runApp 
  package:flutter/…/widgets/binding.dart:787
  I/flutter (20678): #441    main 
  package:startoversword/main.dart:21
  I/flutter (20678): #452    SystemChrome.setPreferredOrientations (package:flutter/src/services/system_chrome.dart)
  I/flutter (20678): #463    OptionalMethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart)
  I/flutter (20678): #474    MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart)
  I/flutter (20678): (elided 46 frames from class _AssertionError, package dart:async, and package dart:async-patch)
  I/flutter (20678):
  I/flutter (20678): ════════════════════════════════════════════════════════════════════════════════════════════════════
  I/flutter (20678): Another exception was thrown: A Hero widget cannot be the descendant of another Hero widget.
  I/chatty  (20678): uid=10088(com.oxspines.talkingsword) 1.ui identical 3 lines
  I/flutter (20678): Another exception was thrown: A Hero widget cannot be the descendant of another Hero widget.
  I/OpenGLRenderer(20678): Davey! duration=865ms; Flags=0, IntendedVsync=76957734745126, Vsync=76957768078458, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=76957769369260, AnimationStart=76957769756360, PerformTraversalsStart=76957774959760, DrawStart=76957778308860, SyncQueued=76957778894960, SyncStart=76957788359860, IssueDrawCommandsStart=76957793180660, SwapBuffers=76957809783260, FrameCompleted=76958609467060, DequeueBufferDuration=116998000, QueueBufferDuration=12148000,
  I/Choreographer(20678): Skipped 57 frames!  The application may be doing too much work on its main thread.
  I/OpenGLRenderer(20678): Davey! duration=1061ms; Flags=0, IntendedVsync=76957801411790, Vsync=76958751411752, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=76958769243160, AnimationStart=76958772853660, PerformTraversalsStart=76958779455160, DrawStart=76958795072260, SyncQueued=76958796183260, SyncStart=76958889098460, IssueDrawCommandsStart=76958889855560, SwapBuffers=76958893194360, FrameCompleted=76958955694360, DequeueBufferDuration=35517000, QueueBufferDuration=4901000,
  </code></pre>