একাধিক নায়ক আছেন যারা একটি সাবট্রির মধ্যে একই ট্যাগ ভাগ করে নিয়েছেন


117

আমি রুট দিয়ে এক স্ক্রিন থেকে অন্য স্ক্রিনে নেভিগেট করার চেষ্টা করছি। আমি যখন পৃষ্ঠাটিতে রুটটিতে সরানোর জন্য বোতামটি চাপি তখন আমি ত্রুটি পাই

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>

আমি কীভাবে এটি সমাধান করব?

উত্তর:


306

আমি এর আগেও এর মুখোমুখি হয়েছি এবং এটি কারণ ছিল যে আমার 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"

যে কোনও ইভেন্টে, আশা কারও সহায়ক।


7
আপনি কেবল এটিকে বাতিল করতে পারেন: হিরো ট্যাগ: নাল,
মিক

14
অনুরূপ ইস্যুগুলি ListTileএকটি Heroঅভ্যন্তরের সাথে থাকবে। এটি Heroকেবল একজন নায়ক নয়, এটি আপনার দ্বারা গুণিত হয়েছে items.length, তাই ট্যাগটি হওয়া উচিত'tag$index'
mrahimygk

গ্রিডভিউয়ের মধ্যে আমি কীভাবে কোনও নায়ককে যুক্ত করতে পারি?
অ্যান্ড্রে

4
কি দারুন! আমি একটি কালো পর্দায় নেভিগেট করছিলাম। আমি এটি পরীক্ষা করার জন্য একটি অটো-প্লে সাউন্ড ফাইল রেখেছিলে জানতাম স্ক্রিনটি সঠিকভাবে লোড হচ্ছে। অবশেষে এই "নায়ক" ত্রুটি বার্তাটি লক্ষ্য করে আপনার প্রতিক্রিয়া খুঁজে পেয়েছে - আপনাকে ধন্যবাদ সত্যিই খুব সহায়ক।
ডোনা


15

ভবিষ্যতে কেবল পাঠকদের জন্য:

@ মি.ভিনসেন্ট মন্তব্যের প্রতি কৃতজ্ঞ, আমার জন্য এই ত্রুটির কারণটি হ'ল আমি হিরোটি ব্যবহার করছিলাম 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',
              ),
            ),

দ্রষ্টব্য: তালিকাভিউ.বিল্ডারের মতো সূচক তৈরি করা বাচ্চাদের সাথে যে কোনও উইজেটের সাথে এটি ঘটতে পারে


ধন্যবাদ, এটি খুব সহায়ক। আপনি যখন পরবর্তী পৃষ্ঠায় নেভিগেট করেন তখন ট্যাপ সূচকটিও পাস করুন। হিরো ট্যাগ এবং পরবর্তী পৃষ্ঠার নায়ক ট্যাগের সাথে আলতো চাপুন।
আবদুল্লাহ খান

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

2

আমার জন্য, heroTagআমার FloatingActionButtonsকাজ করে না এমন একটি অনন্য যোগ করা । আমি heroTagএকটি Textউইজেটে মোড়ানো শেষ করেছি এবং এটি আমার জন্য সমস্যার সমাধান করেছে।

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

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

1

আমি একই ত্রুটি পেরিয়েছি। এটি একক স্ক্রিনে একাধিকবার ভাসমান অ্যাকশন বোতামের মতো বোতামগুলির ব্যবহারের কারণে।
পূর্বে আমি ফ্লোটিং অ্যাকশন বোতামটি ব্যবহার করেছি পরিবর্তে আমি এটিকে পরিবর্তন করে একটি অঙ্গভঙ্গি ডিটেক্টর হিসাবে অনট্যাপ ব্যবহার করতে এটি কাজ করে

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

আপনি দয়া করে গৃহীত উত্তরের সাথে প্রস্তাবিত পদ্ধতির তুলনা করতে পারেন?
গ্রাইবার্ড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.