ঝাঁকুনি সমস্ত রুট সরান


98

আমি একটি লগআউট বোতামটি বিকাশ করতে চাই যা আমাকে লগ ইন রুটে প্রেরণ করবে এবং এর থেকে সমস্ত অন্যান্য রুট সরিয়ে দেবে Navigator। ডকুমেন্টেশনে কোনও কীভাবে RoutePredicateমুছে ফেলা হবে বা কীভাবে মুছে ফেলা হবে তা সমস্ত ফাংশন ব্যাখ্যা করবে বলে মনে হয় না ।

উত্তর:


265

আমি নিম্নলিখিত কোড সহ এটি সম্পাদন করতে সক্ষম হয়েছি:

Navigator.of(context)
    .pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);

গোপন এখানে একটি RoutePredicate যে সবসময় মিথ্যা ফেরৎ ব্যবহার করছে (Route<dynamic> route) => false। এই পরিস্থিতিতে /loginআমি যে নতুন রুটিকে ধাক্কা দিয়েছি তা বাদ দিয়ে এটি সমস্ত রুট সরিয়ে দেয়।


4
ধন্যবাদ এটি সফলভাবে কাজ করেছে। আপনি কি দয়া করে এমন কোনও লিঙ্ক প্রেরণ করতে পারেন, যেখানে আমি আরও বুঝতে পারি ....
পাওয়ান

এ নিয়ে আমার সমস্যা হয়েছে! আইওএস-এ, উইজেট হিসাবে নেটিভ ভিউ ব্যবহার করে, আপনার পদ্ধতিটি ব্যবহারের পরে নেটিভ ভিউটি সঠিকভাবে নিষ্পত্তি হবে না এবং অস্তিত্ব অব্যাহত রাখে না, ফলস্বরূপ আমার এমন একটি দৃষ্টিভঙ্গি রয়েছে যা কখনও কখনও ব্যবহার করা হবে না যা কোনও প্রকারের পটভূমিতে চলছে এবং নিষ্পত্তি করা অসম্ভব impossible । এটি কেবল আইওএস ডিভাইসে ঘটবে বলে মনে হচ্ছে।
লরেঞ্জো

@ LorenzoImperatrice আপনি কি এই সমস্যার সমাধান খুঁজে পেয়েছেন? আমার একই সমস্যা হচ্ছে
ম্যাটিউজ টাইলম্যান

4
এটি ব্যবহার করার পরেও আমার কাছে দৃষ্টান্তগুলি খোলা আছে। স্ক্রিনটি ধাক্কা দেওয়ার এবং বাকী স্ট্যাকটি অপসারণের অন্য কোনও সমাধান?
মনোজ এমএম

এই পদ্ধতির সাহায্যে আমরা কীভাবে যুক্তিগুলি পাস করতে পারি।
বিকাশ করুন

78

আমি নিম্নলিখিত কোড স্নিপেট দিয়ে করতে পারি:

 Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
    LoginScreen()), (Route<dynamic> route) => false),

আপনি যদি ধাক্কা দেওয়া রুটের নীচে সমস্ত রুট সরাতে চান, রুটপ্রেডিকেট সর্বদা মিথ্যা , যেমন (রুট রুট) => মিথ্যা প্রত্যাবর্তন করে ।


24

আর একটি বিকল্প হ'ল popUntil()

Navigator.of(context).popUntil(ModalRoute.withName('/root'));

আপনি নামক রুটে ফিরে না আসা পর্যন্ত এটি সমস্ত রুটকে পপ করবে।


4
আমি এই উত্তর পছন্দ!
নভেম্বল

14

আরেকটি সমাধান ব্যবহার করা হয় pushAndRemoveUnit()। অন্য সমস্ত রুট ব্যবহার সরানোর জন্যModalRoute.withName('/')

Navigator.pushAndRemoveUntil(context,   
                        MaterialPageRoute(builder: (BuildContext context) => Login()),    
                        ModalRoute.withName('/'));   

তথ্যসূত্র: https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html


10

আপনি যদি নির্দিষ্ট স্ক্রিনে ফিরে যেতে চান এবং আপনি নামযুক্ত রাউটার ব্যবহার না করেন তবে পরবর্তী পদ্ধতি ব্যবহার করতে পারেন

উদাহরণ:

Navigator.pushAndRemoveUntil(context,
                  MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
                  (Route<dynamic> route) => route is HomePage
              );

সঙ্গে রুট হোম আপনি আপনার উইজেট নাম চেক করুন।


NoAnimatedRoute কি?
এলোমেলোভাবে এই

@ প্রকাশ্লো মনোযোগ দেবেন না =) এটি কেবলমাত্র আমার প্রয়োগটি পরিবর্তে ম্যাটারিয়ালপেজরোট ব্যবহার করতে পারে। তবে আমি উত্তরটি সম্পাদনা করেছি, ধন্যবাদ।
ভোলাডাইমার বিলোভাস

(রুট <লিনামিক> রুট) => রুট.আইস ফার্স্ট) কেউ কেউ যদি প্রথম রুট পর্যন্ত সরাতে চায়।
হুসনাইন হায়দার

4

আপনি যদি নামযুক্ত রুটস ব্যবহার করে থাকেন তবে আপনি সহজভাবে এটি করতে পারেন:

Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);

"/ লগইন" হ'ল সেই রুটটি যেখানে আপনি রুট স্ট্যাকটি চাপতে চান।

মনে রাখবেন যে :

এই বিবৃতিটি স্ট্যাকের সমস্ত রুট সরিয়ে দেয় এবং ঠেলাঠেলিকে একটিকে মূল করে তোলে।


3

আমি জানি না কেন কেউ কেন সেকুলারবাইন্ডিং ইনস্ট্যান্স ব্যবহার করে সমাধানটির কথা উল্লেখ করেনি , পার্টিতে কিছুটা দেরি হলেও, আমি মনে করি এটি এখানে সঠিকভাবে উত্তর দেওয়ার সঠিক উপায় হবে think

    SchedulerBinding.instance.addPostFrameCallback((_) async {
                              Navigator.of(context).pushNamedAndRemoveUntil(
                                  '/login',
                                  (Route<dynamic> route) => false);
                            });

উপরের কোডটি সমস্ত রুটগুলি সরিয়ে দেয় এবং '/ লগইন' করতে নেভিগেট করে এটি একটি কালব্যাক শিডিয়ুল করে নতুন রুটে নেভিগেট করার আগে সমস্ত ফ্রেম রেন্ডার করে দেয় তাও নিশ্চিত করে


1

এটা আমার জন্য কাজ করছে। আসলে, আমি ব্লকের সাথে কাজ করছিলাম তবে আমার সমস্যাটি ছিল লগইন স্ক্রিন ব্লক। লগআউট করার পরে এটি আপডেট হচ্ছে না। এটি পূর্ববর্তী মডেল ডেটা ধারণ করে। এমনকি, আমি ভুল এন্ট্রি প্রবেশ করিয়েছিলাম এটি হোম স্ক্রিনে যাচ্ছিল।

ধাপ 1:

Navigator.of(context).pushNamedAndRemoveUntil(
        UIData.initialRoute, (Route<dynamic> route) => false);

কোথায়, UIData.initialRoute = "/" or "/login"

ধাপ ২:

এটি স্ক্রিনটি রিফ্রেশ করার জন্য কাজ করছে। আপনি যদি ব্লকের সাথে কাজ করছেন তবে এটি খুব সহায়ক হবে।

runApp(MyApp());

কোথায়, MyApp() is the root class.

রুট ক্লাস (অর্থাত মাই অ্যাপ) কোড

class MyApp extends StatelessWidget {

  final materialApp = Provider(
      child: MaterialApp(
          title: UIData.appName,
          theme: ThemeData(accentColor: UIColor().getAppbarColor(),
            fontFamily: UIData.quickFont,
          ),
          debugShowCheckedModeBanner: false,
          //home: SplashScreen(),
          initialRoute: UIData.initialRoute,
          routes: {
            UIData.initialRoute: (context) => SplashScreen(),
            UIData.loginRoute: (context) => LoginScreen(),
            UIData.homeRoute: (context) => HomeScreen(),
          },
          onUnknownRoute: (RouteSettings rs) => new MaterialPageRoute(
              builder: (context) => new NotFoundPage(
                appTitle: UIData.coming_soon,
                icon: FontAwesomeIcons.solidSmile,
                title: UIData.coming_soon,
                message: "Under Development",
                iconColor: Colors.green,
              )
          )));

  @override
  Widget build(BuildContext context) {
    return materialApp;
  }
}

void main() => runApp(MyApp());

এখানে আমার লগআউট পদ্ধতি,

void logout() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    preferences.clear();

    // TODO: we can use UIData.loginRoute instead of UIData.initialRoute
    Navigator.of(context).pushNamedAndRemoveUntil(
        UIData.initialRoute, (Route<dynamic> route) => false);
    //TODO: It's working as refresh the screen
    runApp(MyApp());
  }

0

নিশ্চিত না যে আমি এটি সঠিকভাবে করছি কিনা

তবে রুট উইজেট না হওয়া পর্যন্ত পপিংয়ের ক্ষেত্রে আমার ব্যবহারের ক্ষেত্রে এটি উপযুক্ত

void popUntilRoot({Object result}) {
    if (Navigator.of(context).canPop()) {
      pop();
      popUntilRoot();
    }
}

0
to clear route - 

  onTap: () {
                    //todo to clear route -
                    Navigator.of(context).pop();
                    Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateEmployeeUpdateDateActivity(_token),));
                    widget.listener.onEmployeeDateClick(_day,_month, _year);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.