I / flutter(5378):引发了另一个异常:子树中有多个共享相同标签的英雄

时间:2019-11-06 03:28:33

标签: flutter

当我单击但遇到错误时,我正在尝试从一个屏幕向另一个屏幕进行 导航

我已经从互联网和其他网站上找到了一些错误修复程序,但仍然存在错误。

这是我的代码:


  _buildCard(String title, String rating, String imgPath) {
    return Padding(
        padding: EdgeInsets.all(10.0),
        child: InkWell(
          onTap: () {
            Navigator.of(context)
                .push(MaterialPageRoute(builder: (context) => DetailPage()));
          },
  buildIcon(String imgPath1, String iconName, String titleIcon) {
    return Padding(
        padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 10.0),
        child: InkWell(
          onTap: () {
            BuildContext context;
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) =>
                    DetailsIcon(heroTag: imgPath1, iconName: iconName)));
          },

这是我的错误

  

I / flutter(5378):引发了另一个异常:在子树中有多个共享相同标签的英雄。

2 个答案:

答案 0 :(得分:0)

Hero标签必须唯一,也许一张图像被渲染多次。您可以使用以下代码生成随机字符串:

import 'dart:math';

String _randomString(int length) {
   var rand = new Random();
   var codeUnits = new List.generate(
      length, 
      (index){
         return rand.nextInt(33)+89;
      }
   );

   return new String.fromCharCodes(codeUnits);
}

答案 1 :(得分:0)

您的每个 heroTag 必须具有唯一值。

如果您使用的是英雄小部件,请在其中添加heroTag值作为列表视图索引,该索引将作为唯一值使用。同样,将相同的索引传递到下一个屏幕中要转换英雄小部件的相应英雄小部件。

例如: //在发送屏幕上

onTap: () {
            BuildContext context;
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) =>
                    DetailsIcon(heroTag: index.toString(), iconName: iconName)));
          },

//在接收屏幕上

class DetailsIconextends StatelessWidget {
  DetailsIcon({this.heroTag,this.iconName}) : super(key: key);

  final String photo;
  final String onTap;

  Widget build(BuildContext context) {
    return SizedBox(
      width: width,
      child: Hero(
        tag: heroTag,
        child: Material(
          color: Colors.transparent,
          child: InkWell(
            onTap: onTap,
            child: Image.asset(
              iconName,
              fit: BoxFit.contain,
            ),
          ),
        ),
      ),
    );
  }
}

此外,如果您不只使用一个窗口小部件而不是窗口小部件列表,则只需在两个屏幕heroTag上添加一个公共值即可进行过渡。

这将帮助您解决问题。

有关更多参考,请访问Flutter Hero Animations 我希望这会有所帮助。