サブツリー内で同じタグを共有する複数のヒーローがいます


117

ルートを使用して、ある画面から別の画面に移動しようとしています。ページのボタンを押してルートに移動すると、エラーが発生します

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>

どうすればこれを解決できますか?

回答:


306

これは以前に発生したことがありFloatingActionますが、1つの画面に2つのボタンがあるFloatingActionButtonため、エラーをなくすためにheroTagプロパティ+値を追加する必要がありました。

例:

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を:ヌルを、
MIK

14
同様の問題はListTileHero内部にあります。これはHeroひとつの英雄ではありませんが、それはあなたが乗算されitems.length、そのタグがあるべき'tag$index'
mrahimygk

GridView内にヒーローを追加するにはどうすればよいですか?
アンドレイ

2
うわー!黒い画面に移動していました。テストのために自動再生サウンドファイルを画面に配置したときに、画面が正しく読み込まれていることがわかりました。最後に、この「ヒーロー」エラーメッセージに気づき、あなたの応答を見つけました-ありがとう!本当に役に立ちました。
ドナ


15

将来の読者のためだけに:

@ m.vincentのコメントに感謝します。このエラーの原因は、SliverChildBuilderDelegate(明らかに)インデックスが含まれているHeroを使用していたため、次のよう'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

私にとって、ユニークなものheroTagを追加するだけでFloatingActionButtonsはうまくいきませんでした。ウィジェットでラップすることheroTagになり、Textそれで問題は解決しました。

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

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

1

私は同じエラーを経験しました。フローティングアクションボタンなどのボタンを1画面で複数回使用しているためです。
以前は、フローティングアクションボタンを使用していましたが、オンタップを使用するジェスチャー検出器に変更したため、機能しました

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

あなたが提案するアプローチを受け入れられた答えと比較していただけますか?
greybeard

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.