我试图导航从一个屏幕到另一个与路线。当我点击按钮页面移动到路由提供我得到错误
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>
我怎么解决这个问题?
我以前遇到过这种情况,这是因为我在一个屏幕上有两个FloatingAction按钮,我必须为每个FloatingActionButton添加一个heroTag属性+值,以便错误消失。
例子:
FloatingActionButton(
heroTag: "btn1",
...
)
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"。
仅供未来读者参考:
非常感谢@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。构建器
我遇到了同样的错误。这是因为在一个屏幕上多次使用浮动动作按钮等按钮。
以前我使用浮动动作按钮,而不是我把它改成一个手势探测器来使用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),
),
这个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