ऐसे कई हीरो हैं जो एक ही टैग को एक सबट्री के भीतर साझा करते हैं


127

मैं रूट के साथ एक स्क्रीन से दूसरे स्क्रीन पर नेविगेट करने की कोशिश कर रहा हूं। जब मैं पृष्ठ पर जाने वाले मार्ग पर जाने के लिए बटन दबाता हूं बशर्ते मुझे त्रुटि मिले

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

यहाँ कोड है:

मार्ग:

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

और त्रुटि:

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

मैं इसे कैसे हल करूं?

जवाबों:


339

मैंने पहले भी इसका सामना किया है, और यह इसलिए था क्योंकि मेरे पास FloatingActionएक स्क्रीन पर दो बटन थे FloatingActionButton, त्रुटि दूर होने के लिए मुझे एक हीरोटैग संपत्ति + मूल्य प्रति जोड़ना था ।

उदाहरण:

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

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

आपके द्वारा प्रदान किए गए उदाहरण कोड से ऐसा नहीं लगता है कि आपके पास एक है FloatingActionButton, लेकिन त्रुटि से यह इसे संदर्भित करता है:

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

शायद आपने इसे उस पृष्ठ पर उपयोग किया था जिसे आप नेविगेट कर रहे थे, फिर त्रुटि उत्पन्न हुई। ध्यान दें कि यदि आप टैग किए गए नायकों को बनाने के प्रोग्रामेटिक तरीके का उपयोग कर रहे हैं, तो आपको उन्हें अलग-अलग टैग देने का एक तरीका खोजना होगा। उदाहरण के लिए, यदि आपके पास एक ListView.builder()निर्माण है FloatingActionButtons, तो स्ट्रिंग स्वरूपण के साथ टैग पास करने का प्रयास करें ताकि प्रत्येक बटन का एक अलग टैग हो, जैसे heroTag: "btn$index":।

किसी भी घटना में, आशा है कि किसी की मदद करता है।


9
आप बस इसे शून्य कर सकते हैं: हीरोटैग: अशक्त,
मिक

14
इसी तरह के मुद्दे ListTileएक Heroअंदर के साथ होंगे । यह Heroकेवल एक नायक नहीं है, लेकिन यह आपके द्वारा गुणा किया जाता है items.length, इसलिए टैग होना चाहिए'tag$index'
mrahimygk

मैं एक ग्रिड के अंदर हीरो कैसे जोड़ सकता हूं?
एंड्री

2
वाह! मैं एक ब्लैक स्क्रीन पर नेविगेट कर रहा था। जानता था कि स्क्रीन ठीक से लोड हो रही है क्योंकि मैंने परीक्षण करने के लिए उस पर एक ऑटो-प्ले साउंड फ़ाइल डाल दी थी। अंत में इस "नायक" त्रुटि संदेश पर ध्यान दिया गया और आपकी प्रतिक्रिया मिली - धन्यवाद! वास्तव में बहुत उपयोगी है।
डोना

आपने मेरा दिन बचाया!
8


16

भविष्य में सिर्फ पाठकों के लिए:

@ m.vincent टिप्पणी की सराहना करते हुए, मेरे लिए यह त्रुटि किस कारण है कि मैं हीरो का उपयोग कर रहा था SliverChildBuilderDelegateजिसके अंदर (स्पष्ट रूप से) एक सूचकांक है, इसलिए मैंने 'tag$index'इस तरह टैग के साथ सूचकांक का उपयोग किया

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

ध्यान दें: ऐसा किसी भी विजेट के साथ हो सकता है जिसमें इंडेक्स बनाए गए बच्चे जैसे ListView.Builder हो


धन्यवाद, यह बहुत उपयोगी है। जब आप अगले पेज पर जाएँ तो टैप इंडेक्स भी पास करें। टैप हीरो टैग और अगले पेज हीरो टैग नाम से मिलान करने के लिए।
अब्दुल्ला खान

3

मेरे लिए, बस heroTagमेरे FloatingActionButtonsकाम करने के लिए एक अद्वितीय जोड़ने का काम नहीं किया। मैंने heroTagएक Textविजेट में रैपिंग को समाप्त कर दिया और इससे मेरे लिए समस्या हल हो गई।

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

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

यह वास्तव में विचित्र है।
ल्यूक पिगेटी

2

स्ट्रिंग्स के रूप में हीरो टैग के साथ आप जितने चाहें उतने विजेट जोड़ें

  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

मैं उसी एरर से गुजरा। इसका कारण सिंगल स्क्रीन में कई बार फ्लोटिंग एक्शन बटन जैसे बटन का उपयोग है।
पहले मैंने एक फ्लोटिंग एक्शन बटन का इस्तेमाल किया था बजाय मैंने इसे ontap उपयोग करने के लिए एक जेस्चर डिटेक्टर में बदल दिया ताकि यह काम करे

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

क्या आप स्वीकार किए गए उत्तर के दृष्टिकोण की तुलना कर सकते हैं?
ग्रेबर्ड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.