Bir alt ağaçta aynı etiketi paylaşan birden fazla kahraman var


120

Rotayla bir ekrandan diğerine gitmeye çalışıyorum. Hatayı almam koşuluyla sayfanın rotaya gitmesi için düğmeye bastığımda

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

İşte kod:

Rotalar:

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

Ve Hata:

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

Bunu nasıl çözerim?

Yanıtlar:


312

Bununla daha önce karşılaştım ve FloatingActionbir ekranda iki düğmem olduğu için hatanın ortadan kalkması FloatingActionButtoniçin her bir heroTag özelliği + değer eklemem gerekiyordu.

Misal:

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

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

Sağladığınız örnek koddan bir a sahip olduğunuz görünmüyor FloatingActionButton, ancak hatadan ona referans veriyor gibi görünüyor:

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

Belki de onu gittiğiniz sayfada kullandınız ve ardından hatayı tetiklediniz. Etiketli kahramanlar oluşturmanın programlı bir yolunu kullanıyorsanız, onlara farklı etiketler vermenin bir yolunu bulmanız gerekeceğini unutmayın. Eğer bir varsa Örneğin, ListView.builder()oluşturmayı FloatingActionButtons, her düğme farklı bir etiket, örneğin sahiptir böylece dize biçimlendirme etiketleri geçen deneyin: heroTag: "btn$index".

Her halükarda, birisine yardımcı olacağını umun.


7
Basitçe onu geçersiz kılabilirsiniz: heroTag: null,
mik

14
Benzer sorunlar ListTilebir Heroiçte olacaktır. bu Herosadece bir kahraman değil, sizin ile çarpılır items.length, bu yüzden etiket şu olmalıdır'tag$index'
mrahimygk

GridView'e nasıl kahraman ekleyebilirim?
Andrey

2
Vaov! Siyah bir ekrana gidiyorum. Test etmek için üzerine bir otomatik çalma ses dosyası koyduğum için ekranın düzgün yüklendiğini biliyordum. Sonunda bu "kahraman" hata mesajını fark etti ve cevabınızı buldu - teşekkür ederim! Gerçekten çok yardımcı oldu.
Donna


15

Sadece gelecekte okuyucular için:

içinde m.vincent yorumun @ için teşekkür ederiz benim için bu hata i Kahraman içini kullanıyordum ne olduğunu neden SliverChildBuilderDelegateolan (besbelli) bir dizin vardır, ben gibi etiketiyle indeksi kullanılan yüzden 'tag$index'böyle

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

NOT: Bu, ListView.Builder gibi dizin oluşturulmuş çocuklara sahip herhangi bir widget'ta olabilir.


Teşekkürler, çok yardımcı oluyor. Bir sonraki sayfaya gittiğinizde, dokunma dizinini de geçtiğinizde. Tap Hero etiketi ve sonraki sayfa kahraman etiketi adıyla eşleştirmek için.
Abdullah Khan

2

Strings olarak kahraman etiketleriyle istediğiniz kadar widget ekleyin

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

2

Benim için, sadece benzersiz ekleyerek heroTagbenim için FloatingActionButtonsçalışmadı. heroTagBir Textparçacığın içine sarmayı bıraktım ve bu benim için sorunu çözdü.

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

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

1

Aynı Hatayı yaşadım. Tek ekranda kayan işlem düğmesi gibi düğmelerin birden çok kez kullanılması nedeniyledir.
Önceden kayan bir eylem düğmesi kullandım, bunun yerine ontap kullanmak için onu bir hareket detektörü olarak değiştirdim, böylece çalıştı

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

Lütfen önerdiğiniz yaklaşımı kabul edilen cevapla karşılaştırır mısınız?
greybeard

0

tag: Uuid()Aynı etikete sahip birden çok öğe varsa bunu ayarlamanız yeterlidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.