Es gibt mehrere Helden, die innerhalb eines Teilbaums dasselbe Tag verwenden

103

Ich versuche, mit der Route von einem Bildschirm zum anderen zu navigieren. Wenn ich auf die Schaltfläche drücke, damit die Seite zur Route wechselt, wird der Fehler angezeigt

I/flutter ( 8790): Another exception was thrown: There are multiple heroes that share the same tag within a subtree.

Hier ist der Code:

Routen:

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

Und der Fehler:

══╡ 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>

Wie löse ich das?

Norbert
quelle

Antworten:

260

Ich bin schon einmal darauf gestoßen, und weil ich zwei FloatingActionSchaltflächen auf einem Bildschirm hatte, musste ich eine heroTag-Eigenschaft + Wert pro hinzufügen FloatingActionButton, damit der Fehler behoben wurde .

Beispiel:

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

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

Aus dem von Ihnen angegebenen Beispielcode geht nicht hervor, dass Sie einen haben FloatingActionButton, aber aus dem Fehler scheint er darauf zu verweisen:

I/flutter (21786): In this case, multiple heroes had the following tag: default FloatingActionButton tag

Vielleicht haben Sie es auf der Seite verwendet, zu der Sie navigiert haben, und dann den Fehler ausgelöst. Beachten Sie, dass Sie, wenn Sie eine programmatische Methode zum Erstellen von Helden mit Tags verwenden, eine Möglichkeit finden müssen, ihnen verschiedene Tags zu geben. Wenn Sie beispielsweise eine ListView.builder()Erstellung haben FloatingActionButtons, versuchen Sie, Tags mit Zeichenfolgenformatierung zu übergeben, damit jede Schaltfläche ein anderes Tag hat, z heroTag: "btn$index".

Hoffe auf jeden Fall, dass das jemandem hilft.

Robert Stevens
quelle
5
Sie können es einfach aufheben: heroTag: null,
mik
12
Ähnliche Probleme wären in einem ListTilemit einem HeroInneren. Dies Heroist nicht nur ein Held, sondern es wird mit Ihrem multipliziert items.length, daher sollte der Tag sein'tag$index'
mrahimygk
Wie kann ich einen Helden in eine GridView einfügen?
Andrey
1
Beeindruckend! Ich navigierte zu einem schwarzen Bildschirm. Ich wusste, dass der Bildschirm richtig geladen wurde, als ich eine Auto-Play-Sounddatei zum Testen darauf legte. Endlich bemerkte diese "Helden" -Fehlermeldung und fand Ihre Antwort - danke! Sehr hilfreich.
Donna
1
wow du hast mir etwas zeit gespart, danke!
Gigalala
23

Sie können eine eindeutige ID oder nur null festlegen:

new FloatingActionButton(
heroTag: null,
...
)
Jesus David EscenarioCreativo
quelle
13

Nur für Leser in der Zukunft:

Um @ m.vincent Kommentar zu schätzen, was diesen Fehler für mich verursacht, ist, dass ich Hero verwendet habe, in SliverChildBuilderDelegatedem (offensichtlich) ein Index enthalten ist, also habe ich den Index mit dem Tag 'tag$index'wie diesem verwendet

SliverChildBuilderDelegate(
    (BuildContext context, int index) {
      return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Hero(
              tag: 'tagImage$index',
              child: Image.asset(
                'image source here',
              ),
            ),

HINWEIS: Dies kann bei jedem Widget mit vom Index erstellten untergeordneten Elementen wie ListView.Builder der Fall sein

evals
quelle
Danke, es ist sehr hilfreich. Wenn Sie zur nächsten Seite navigieren, übergeben Sie auch den Tap-Index. Um mit dem Tap Hero-Tag und dem Helden-Tag-Namen der nächsten Seite übereinzustimmen.
Abdullah Khan
2

Fügen Sie beliebig viele Widgets mit Helden-Tags wie Strings hinzu

  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,
      ),
    );
  }
Leonard O.
quelle
1

Ich habe denselben Fehler durchlaufen. Dies liegt an der mehrfachen Verwendung von Schaltflächen wie schwebenden Aktionstasten auf einem Bildschirm.
Früher habe ich stattdessen eine schwebende Aktionstaste verwendet und sie in einen Gesten-Detektor geändert , um ontap zu verwenden, damit es funktioniert

  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),
            ),
Joe Rush
quelle
Können Sie bitte den von Ihnen vorgeschlagenen Ansatz mit der akzeptierten Antwort vergleichen?
Graubart
0

Einfach einstellen, tag: Uuid()wenn mehrere Elemente mit demselben Tag vorhanden sind.

Shiva Yadav
quelle