Próbuję nawigować z jednego ekranu na drugi za pomocą trasy. Kiedy naciskam przycisk, aby strona przesunęła się na trasę, pod warunkiem, że pojawia się błąd
I/flutter ( 8790): Another exception was thrown: There are multiple heroes that share the same tag within a subtree.
Oto kod:
Trasy:
<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');
},),
),
);
}
}
I błąd:
══╡ 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>
Jak to rozwiązać?
ListTile
zHero
wnętrzem. toHero
nie jest tylko jeden bohater, ale jest on pomnożony przez twójitems.length
, więc tag powinien być'tag$index'
Możesz ustawić unikalny identyfikator lub ustawić tylko wartość null:
new FloatingActionButton( heroTag: null, ... )
źródło
Tylko dla czytelników w przyszłości:
w docenić @ m.vincent komentarzu, co powoduje ten błąd dla mnie jest to, że używałem Hero wnętrze
SliverChildBuilderDelegate
, które (oczywiście) ma indeks, więc użyłem indeksu z tagiem jak'tag$index'
takSliverChildBuilderDelegate( (BuildContext context, int index) { return Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Hero( tag: 'tagImage$index', child: Image.asset( 'image source here', ), ),
UWAGA: może się to zdarzyć w przypadku dowolnego widżetu z elementami podrzędnymi utworzonymi przez indeks, takimi jak ListView.Builder
źródło
Dla mnie, po prostu dodając unikatowy
heroTag
na mójFloatingActionButtons
nie działa. Skończyło się na owijanieheroTag
wText
widget i że rozwiązał problem dla mnie.new FloatingActionButton( heroTag: Text("btn1"), ... ) new FloatingActionButton( heroTag: Text("btn2"), ... )
źródło
Dodaj tyle widżetów, ile chcesz, z tagami bohaterów jako ciągi znaków
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, ), ); }
źródło
Przeszedłem przez ten sam błąd. Dzieje się tak z powodu wielokrotnego użycia przycisków takich jak pływający przycisk akcji na jednym ekranie.
Wcześniej użyłem pływającego przycisku akcji zamiast tego zmieniłem go na detektor gestów, aby używać ontap, więc zadziałało
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), ),
źródło
Po prostu ustaw,
tag: Uuid()
jeśli masz wiele elementów z tym samym tagiem.źródło