子树中有多个共享相同标签的英雄


116

我试图通过路线从一个屏幕导航到另一个屏幕。当我按一下按钮将页面移到提供的路线时,我得到了错误

I/flutter ( 8790): Another exception was thrown: There are multiple heroes that share the same tag within a subtree.

这是代码:

路线:

 <String, WidgetBuilder>{
    '/first':(BuildContext context) =>NavigatorOne() ,
    '/second':(BuildContext context) =>NavigatorTwo(),
    '/third':(BuildContext context) =>NavigatorThree(),

  },

Navigator.of(context).pushNamed('/first');
Navigator.of(context).pushNamed('/second');
Navigator.of(context).pushNamed('/third');

class NavigatorOne extends StatefulWidget {
  @override
  _NavigatorOneState createState() =>  _NavigatorOneState();
}

class _NavigatorOneState extends State<NavigatorOne> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(

      appBar: AppBar(),
      body: Container(
      color: Colors.green,
      child: RaisedButton(child: Text(' one 1'),onPressed: (){
        Navigator.of(context).pushNamed('/second');
      },),
    ),
    ); 
  }
}

错误:

══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════ I/flutter (21786): The following assertion was thrown during a scheduler callback: I/flutter (21786): There are multiple heroes that share the same tag within a subtree. I/flutter (21786): Within each subtree for which heroes are to be animated (typically a PageRoute subtree), each Hero I/flutter (21786): must have a unique non-null tag. I/flutter (21786): In this case, multiple heroes had the following tag: <default FloatingActionButton tag>

我该如何解决?

Answers:


303

我之前曾遇到过这个问题,这是因为我FloatingAction在一个屏幕上有两个按钮,所以必须添加一个heroTag属性+每个值FloatingActionButton,以消除错误。

例:

new FloatingActionButton(
    heroTag: "btn1",
    ...
)

new FloatingActionButton(
    heroTag: "btn2",
    ...
)

从您提供的示例代码中,您似乎没有FloatingActionButton,但是从错误中似乎确实引用了它:

I/flutter (21786): In this case, multiple heroes had the following tag: default FloatingActionButton tag

也许您在导航页面上使用了它,然后触发了错误。请注意,如果您使用编程方式创建带标签的英雄,则需要找到一种为他们赋予不同标签的方法。例如,如果您正在ListView.builder()创建FloatingActionButtons,请尝试传递带有字符串格式的标签,以便每个按钮具有不同的标签,例如:heroTag: "btn$index"

无论如何,希望能对某人有所帮助。


7
您可以简单地将其取消:heroTag:null,
mik

14
类似的问题将在一个ListTileHero内部。这Hero不仅是一个英雄,而且还乘以您的英雄,items.length因此标记应为'tag$index'
mrahimygk

如何在GridView中添加英雄?
安德烈

2
哇!我导航到黑屏。当我在其上放置自动播放的声音文件进行测试时,知道屏幕已正确加载。终于注意到了这个“英雄”错误消息,并找到了您的回复-谢谢!确实非常有帮助。
唐娜


15

仅适用于将来的读者:

在欣赏到@ m.vincent评论,什么导致这个错误对我来说,我用英雄里面SliverChildBuilderDelegate哪些(显然)有一个索引,所以我用的指标有像标签'tag$index'这样

SliverChildBuilderDelegate(
    (BuildContext context, int index) {
      return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Hero(
              tag: 'tagImage$index',
              child: Image.asset(
                'image source here',
              ),
            ),

注意:这可能发生在任何具有索引创建子级的小部件(如ListView.Builder)中


谢谢,这非常有帮助。当您导航到下一页时,也要通过点击索引。要匹配英雄标签和下一页英雄标签名称。
阿卜杜拉·汗

2

使用英雄标签添加尽可能多的小部件(如字符串)

  Widget floatingButt(Function function, IconData icon, String heroTag) {
    return FloatingActionButton(
      onPressed: function,
      heroTag: heroTag,
      materialTapTargetSize: MaterialTapTargetSize.padded,
      backgroundColor: Constants.primaryColor, // from your values file
      child: Icon(
        icon,
        size: 36.0,
      ),
    );
  }

2

对我来说,只为我添加一个唯一项heroTagFloatingActionButtons行不通的。我最终将包裹heroTag在一个Text小部件中,这为我解决了问题。

new FloatingActionButton(
    heroTag: Text("btn1"),
    ...
)

new FloatingActionButton(
    heroTag: Text("btn2"),
    ...
)

1

我遇到了同样的错误。这是因为在单个屏幕中多次使用了诸如浮动操作按钮之类的按钮。
以前我使用浮动动作按钮,而是将其更改为手势检测器以使用ontap,因此它可以正常工作

  GestureDetector(

              //backgroundColor: Colors.amber[100],
              onTap: add,
              child: Icon(
                FontAwesomeIcons.plus,
                size: 30,
              ),
            ),
            SizedBox(
              width: 20,
            ),
            GestureDetector(
             // heroTag: "btn2",
             // backgroundColor: Colors.amber[100],
              onTap: sub,
              child: Icon(FontAwesomeIcons.minus, size: 30),
            ),

您能否将您建议的方法与接受的答案进行比较?
灰胡子

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.