하위 트리 내에서 동일한 태그를 공유하는 여러 영웅이 있습니다.


128

경로를 사용하여 한 화면에서 다른 화면으로 이동하려고합니다. 페이지의 버튼을 눌렀을 때 오류가 발생하면 경로로 이동합니다.

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>

이 문제를 어떻게 해결합니까?

답변:


340

나는 전에 이것을 만났고 FloatingAction한 화면에 두 개의 버튼 이 있었기 때문에 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".

어쨌든 누군가에게 도움이되기를 바랍니다.


9
간단히 무효화 할 수 있습니다 : heroTag : null,
mik

14
비슷한 문제가 될 것 ListTileHero내부. 이것은 Hero단지 하나의 영웅이 아니라, 그것은 당신의 곱 items.length태그가 있어야한다, 그래서'tag$index'
mrahimygk

GridView 내에 영웅을 추가하려면 어떻게해야합니까?
안드레이

2
와! 나는 검은 화면으로 이동하고 있었다. 테스트를 위해 자동 재생 사운드 파일을 넣었을 때 화면이 제대로로드되는 것을 알았습니다. 마침내이 "영웅"오류 메시지를 확인하고 응답을 찾았습니다. 감사합니다! 참으로 매우 도움이됩니다.
Donna

당신은 내 하루를 구했습니다!
badelectron77


16

미래의 독자를 위해 :

@ 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와 같은 인덱스 생성 자식이있는 위젯에서 발생할 수 있습니다.


감사합니다. 매우 유용합니다. 다음 페이지로 이동하면 탭 인덱스도 전달합니다. 탭 Hero 태그와 다음 페이지 Hero 태그 이름을 일치시킵니다.
Abdullah Khan

3

나를 위해, heroTag내 유일한 것을 추가하는 FloatingActionButtons것은 작동하지 않았습니다. 나는 포장 결국 heroTagA의 Text위젯 그것은 나를 위해 문제를 해결했다.

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

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

이것은 정말 기괴합니다.
Luke Pighetti 20.04.04

2

Hero 태그를 사용하여 원하는만큼의 위젯을 Strings로 추가하세요.

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

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

당신이 제안한 접근 방식과 받아 들여진 대답을 비교해 주시겠습니까?
greybeard

0

tag: Uuid()동일한 태그를 가진 여러 항목이있는 경우 간단히 설정 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.