Istnieje wielu bohaterów, którzy mają ten sam tag w poddrzewie

128

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ć?

Norbert
źródło

Odpowiedzi:

340

FloatingActionSpotkałem się z tym wcześniej, a to dlatego, że miałem dwa przyciski na jednym ekranie, musiałem dodać właściwość heroTag + wartość na FloatingActionButton, aby błąd zniknął .

Przykład:

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

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

Z podanego przez Ciebie przykładowego kodu nie wynika, że ​​masz kod FloatingActionButton, ale z błędu wydaje się, że odwołuje się do niego:

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

Być może użyłeś go na przeglądanej stronie, która następnie spowodowała błąd. Zwróć uwagę, że jeśli używasz programowego sposobu tworzenia oznaczonych bohaterów, musisz znaleźć sposób na nadanie im różnych tagów. Na przykład, jeśli masz ListView.builder()tworzenie FloatingActionButtons, spróbuj przekazać tagi z formatowaniem ciągów, aby każdy przycisk miał inny tag, np heroTag: "btn$index". : .

W każdym razie mam nadzieję, że to komuś pomoże.

Robert Stevens
źródło
9
Możesz to po prostu anulować: heroTag: null,
mik
14
Podobne problemy byłyby w przypadku ListTilez Herownętrzem. to Heronie jest tylko jeden bohater, ale jest on pomnożony przez twój items.length, więc tag powinien być'tag$index'
mrahimygk
jak mogę dodać bohatera do widoku GridView?
Andrey
2
Łał! Przechodziłem do czarnego ekranu. Wiedziałem, że ekran ładuje się prawidłowo, gdy umieściłem na nim plik dźwiękowy automatycznie odtwarzany w celu przetestowania. W końcu zauważyłem ten komunikat o błędzie „bohater” i znalazłem odpowiedź - dziękuję! Rzeczywiście bardzo pomocne.
Donna
Uratowałeś mi dzień!
badelectron77
32

Możesz ustawić unikalny identyfikator lub ustawić tylko wartość null:

new FloatingActionButton(
heroTag: null,
...
)
Jesus David Escenario Creativo
źródło
16

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'tak

SliverChildBuilderDelegate(
    (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

ewaluacje
źródło
Dzięki, to bardzo pomocne. Po przejściu do następnej strony przejdź również do indeksu kranu. Aby dopasować tag Tap Hero i nazwę tagu Hero następnej strony.
Abdullah Khan
3

Dla mnie, po prostu dodając unikatowy heroTagna mój FloatingActionButtonsnie działa. Skończyło się na owijanie heroTagw Textwidget i że rozwiązał problem dla mnie.

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

new FloatingActionButton(
    heroTag: Text("btn2"),
    ...
)
tymotaoh
źródło
To jest naprawdę dziwne.
Luke Pighetti
2

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,
      ),
    );
  }
Leonard O.
źródło
1

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),
            ),
Joe Rush
źródło
Czy możesz porównać proponowane podejście z zaakceptowaną odpowiedzią?
siwobrody
0

Po prostu ustaw, tag: Uuid()jeśli masz wiele elementów z tym samym tagiem.

Shiva Yadav
źródło