Có nhiều anh hùng chia sẻ cùng một thẻ trong một cây con


117

Tôi đang cố điều hướng từ màn hình này sang màn hình khác với tuyến đường. Khi tôi nhấn nút để trang di chuyển đến tuyến đường với điều kiện tôi gặp lỗi

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

Đây là mã:

Các tuyến:

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

Và lỗi:

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

Tôi giải quyết điều này như thế nào?

Câu trả lời:


306

Tôi đã gặp phải điều này trước đây và đó là do tôi có hai FloatingActionnút trên một màn hình, tôi phải thêm thuộc tính heroTag + giá trị mỗi FloatingActionButtonđể lỗi biến mất.

Thí dụ:

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

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

Từ mã ví dụ bạn cung cấp, có vẻ như bạn không có FloatingActionButton, nhưng từ lỗi, nó dường như tham chiếu đến nó:

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

Có lẽ bạn đã sử dụng nó trên trang bạn đang điều hướng mà sau đó đã gây ra lỗi. Lưu ý rằng nếu bạn đang sử dụng một cách có lập trình để tạo các anh hùng được gắn thẻ, bạn sẽ cần phải tìm cách cấp cho họ các thẻ khác nhau. Ví dụ, nếu bạn có một ListView.builder()Tạo FloatingActionButtons, hãy thử qua thẻ với chuỗi định dạng vì vậy mỗi nút có một thẻ khác nhau, ví dụ như: heroTag: "btn$index".

Trong bất kỳ trường hợp nào, hy vọng rằng sẽ giúp một ai đó.


7
Bạn có thể chỉ cần vô hiệu hóa nó: heroTag: null,
mik

14
Các vấn đề tương tự sẽ là a ListTilewith a Heroinside. này Herokhông chỉ là một anh hùng, nhưng nó được nhân của bạn items.length, vì vậy thẻ phải'tag$index'
mrahimygk

làm cách nào để thêm một anh hùng bên trong GridView?
Andrey

2
Chà! Tôi đang điều hướng đến một màn hình đen. Biết màn hình đang tải đúng cách khi tôi đặt tệp âm thanh tự động phát lên đó để kiểm tra. Cuối cùng nhận thấy thông báo lỗi "anh hùng" này và tìm thấy phản hồi của bạn - cảm ơn bạn! Thực sự rất hữu ích.
Donna


15

Chỉ dành cho Độc giả trong tương lai:

đánh giá cao nhận xét của @ m.vincent, nguyên nhân gây ra lỗi này cho tôi là tôi đang sử dụng Anh hùng bên trong SliverChildBuilderDelegate(rõ ràng) có một chỉ mục, vì vậy tôi đã sử dụng chỉ mục với thẻ như 'tag$index'thế này

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

LƯU Ý: điều này có thể xảy ra với bất kỳ tiện ích con nào được tạo chỉ mục như ListView.


Cảm ơn, nó rất hữu ích. Khi bạn điều hướng đến trang tiếp theo, hãy chuyển chỉ mục nhấn. Để khớp thẻ Anh hùng nhấn và tên thẻ anh hùng trang tiếp theo.
Abdullah Khan

2

Thêm bao nhiêu tiện ích tùy thích với thẻ anh hùng dưới dạng Chuỗi

  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

Đối với tôi, chỉ thêm một cái duy nhất heroTagvào FloatingActionButtonskhông có tác dụng. Tôi đã kết thúc việc gói nó heroTagtrong một Textwidget và điều đó đã giải quyết được vấn đề cho tôi.

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

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

1

Tôi đã trải qua cùng một Lỗi. Đó là do việc sử dụng các nút như nút hành động nổi nhiều lần trong một màn hình.
Trước đây, tôi đã sử dụng nút tác vụ nổi thay vì thay vào đó, tôi đã đổi nó thành bộ phát hiện cử chỉ để sử dụng ontap để nó hoạt động

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

Bạn có thể vui lòng so sánh cách tiếp cận bạn đề xuất với câu trả lời được chấp nhận không?
greybeard

0

Đơn giản chỉ cần đặt tag: Uuid()nếu có nhiều mục có cùng một thẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.