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

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.


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


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


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

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

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

Czy możesz porównać proponowane podejście z zaakceptowaną odpowiedzią?
siwobrody

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.