我试图导航从一个屏幕到另一个与路线。当我点击按钮页面移动到路由提供我得到错误

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>

我怎么解决这个问题?


当前回答

这是正确的,因为根据flutter文档,每个路由(屏幕)应该有一个浮动动作按钮,除非您显式设置了英雄标记。

颤振文档

如果没有显式设置,则只能有一个 FloatingActionButton每个路由(即每个屏幕),否则 会有标签冲突(一条路由上不能有多个英雄) 相同的标签)。材料设计说明书只推荐使用 每个屏幕上有一个浮动操作按钮。

其他回答

你可以设置一个唯一的id或只设置null:

FloatingActionButton(
  heroTag: null,
  ...
)

添加任意数量的小部件,使用英雄标签作为字符串

  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,
      ),
    );
  }

这个heroTag问题的简单解决方案是将该属性作为唯一值提供。它可以是String值。在我的情况下,我提供了一个字符串铸造索引值。下面是我的解决方案,它非常有效

FloatingActionButton(
  onPressed: (){ 
    print(index); 
    Navigator.push( context, 
       MaterialPageRoute( builder: (context)=> AddLead()
       ),
     );
    }, 
  heroTag: '$index',
  child: Image.asset('assets/pencil.png',height: 30, width: 30,), backgroundColor: Constants.myColor, 
),

欲了解更多信息,请点击此链接https://wise4rmgodadmob.medium.com/how-to-solve-there-are-multiple-heroes-that-share-the-same-tag-within-a-subtree-a5146fdec2b8

对我来说,只是添加一个独特的heroTag到我的FloatingActionButtons没有工作。我最终在一个文本小部件中包装了heroTag,这为我解决了问题。

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

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

如果有多个具有相同标记的项目,则只需设置tag: Uuid()。