มีฮีโร่หลายตัวที่แชร์แท็กเดียวกันภายในแผนผังย่อย


128

ฉันพยายามนำทางจากหน้าจอหนึ่งไปยังอีกหน้าจอหนึ่งด้วยเส้นทาง เมื่อฉันกดปุ่มเพื่อเลื่อนหน้าไปยังเส้นทางหากฉันได้รับข้อผิดพลาด

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>

ฉันจะแก้ปัญหานี้ได้อย่างไร

คำตอบ:


340

ฉันเคยพบสิ่งนี้มาก่อนและเป็นเพราะฉันมีFloatingActionปุ่มสองปุ่มบนหน้าจอเดียวฉันต้องเพิ่มคุณสมบัติ heroTag + ค่าต่อFloatingActionButtonเพื่อให้ข้อผิดพลาดหายไป

ตัวอย่าง:

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

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

จากโค้ดตัวอย่างที่คุณให้มาดูเหมือนว่าคุณไม่มี a FloatingActionButtonแต่จากข้อผิดพลาดดูเหมือนว่าจะอ้างอิง:

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

บางทีคุณอาจใช้มันบนหน้าที่คุณกำลังนำทางไปซึ่งทำให้เกิดข้อผิดพลาด โปรดทราบว่าหากคุณใช้วิธีการสร้างฮีโร่ที่ติดแท็กแบบเป็นโปรแกรมคุณจะต้องหาวิธีให้แท็กต่างๆ ตัวอย่างเช่นถ้าคุณมีListView.builder()การสร้างลองผ่านแท็กที่มีการจัดรูปแบบสตริงเพื่อให้แต่ละปุ่มมีแท็กที่แตกต่างกันเช่น:FloatingActionButtonsheroTag: "btn$index"

ไม่ว่าในกรณีใดหวังว่าจะช่วยให้ใครบางคน


9
คุณสามารถลบมัน: heroTag: null
mik

14
ปัญหาที่คล้ายกันจะอยู่ในListTileที่มีHeroอยู่ภายใน นี่Heroไม่ใช่แค่ฮีโร่ตัวเดียว แต่มันถูกคูณด้วยของคุณitems.lengthดังนั้นแท็กควรเป็น'tag$index'
mrahimygk

ฉันจะเพิ่มฮีโร่ใน GridView ได้อย่างไร
Andrey

2
ว้าว! ฉันกำลังไปที่หน้าจอสีดำ รู้ว่าหน้าจอกำลังโหลดอย่างถูกต้องขณะที่ฉันใส่ไฟล์เสียงเล่นอัตโนมัติเพื่อทดสอบ ในที่สุดก็สังเกตเห็นข้อความแสดงข้อผิดพลาด "ฮีโร่" นี้และพบคำตอบของคุณ - ขอบคุณ! มีประโยชน์มากแน่นอน
Donna

คุณช่วยวันของฉัน!
badelectron77


16

สำหรับผู้อ่านในอนาคต:

ขอบคุณความคิดเห็นของ @ m.vincent สิ่งที่ทำให้เกิดข้อผิดพลาดนี้สำหรับฉันคือฉันใช้ Hero ภายใน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


ขอบคุณข้อมูลนี้มีประโยชน์มาก เมื่อคุณไปที่หน้าถัดไปให้ส่งแตะดัชนีด้วย เพื่อจับคู่แท็กฮีโร่แตะและชื่อแท็กฮีโร่ของหน้าถัดไป
Abdullah Khan

3

สำหรับฉันแค่เพิ่มเอกลักษณ์heroTagให้กับงานของฉันFloatingActionButtonsไม่ได้ผล ฉันสิ้นสุดห่อheroTagในTextเครื่องมือและแก้ปัญหาสำหรับผม

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

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

นี่เป็นเรื่องแปลกจริงๆ
Luke Pighetti

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

คุณช่วยเปรียบเทียบแนวทางที่คุณแนะนำกับคำตอบที่ยอมรับได้ไหม
greybeard

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.