경로를 사용하여 한 화면에서 다른 화면으로 이동하려고합니다. 페이지의 버튼을 눌렀을 때 오류가 발생하면 경로로 이동합니다.
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
것은 작동하지 않았습니다. 나는 포장 결국 heroTag
A의 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()
동일한 태그를 가진 여러 항목이있는 경우 간단히 설정 하십시오.