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

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

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 속성 + 값을 추가해야했습니다 .

예:

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".

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


답변

고유 ID를 설정하거나 null 만 설정할 수 있습니다.

new FloatingActionButton(
heroTag: null,
...
)


답변

미래의 독자를 위해 :

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


답변

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

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

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


답변

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


답변

나는 같은 오류를 겪었습니다. 단일 화면에서 플로팅 액션 버튼과 같은 버튼을 여러 번 사용하기 때문입니다.
이전에는 플로팅 작업 버튼을 대신 사용하여 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),
            ),


답변

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