কীভাবে ঝাঁকুনিতে অ্যান্ড্রয়েড "ব্যাক" বোতামটি নিষ্ক্রিয় বা ওভাররাইড করবেন?


112

নির্দিষ্ট পৃষ্ঠায় থাকা অবস্থায় অ্যান্ড্রয়েড ব্যাক বোতামটি নিষ্ক্রিয় করার কোনও উপায় আছে কি?

class WakeUpApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "Time To Wake Up ?",
      home: new WakeUpHome(),
      routes: <String, WidgetBuilder>{
        '/pageOne': (BuildContext context) => new pageOne(),
        '/pageTwo': (BuildContext context) => new pageTwo(),
      },
    );
  }
}

পৃষ্ঠায় দুটি পৃষ্ঠায় যাওয়ার জন্য আমার একটি বোতাম আছে:

new FloatingActionButton(
  onPressed: () {    
    Navigator.of(context).pushNamed('/pageTwo');
  },
)

আমার সমস্যাটি হ'ল আমি যদি অ্যান্ড্রয়েড স্ক্রিনের নীচে ব্যাক তীর টিপুন তবে আমি পেজওনে ফিরে যাই। আমি এই বোতামটি একেবারে না দেখাতে চাই। আদর্শভাবে, আমি চাই না এই পর্দার বাইরে কোনও সম্ভাব্য উপায় না থাকলে যদি ব্যবহারকারী উদাহরণস্বরূপ 5 সেকেন্ডের জন্য স্ক্রিনে তার আঙুলটি টিপে না রাখে। (আমি বাচ্চাদের জন্য একটি অ্যাপ লেখার চেষ্টা করছি, এবং কেবলমাত্র পিতা-মাতারা নির্দিষ্ট পর্দার বাইরে নেভিগেট করতে সক্ষম হবেন)।

উত্তর:


202

উত্তরটি হ'ল WillPopScope। এটি পৃষ্ঠা দ্বারা সিস্টেম দ্বারা পপ হওয়া রোধ করবে। আপনি এখনও ব্যবহার করতে সক্ষম হবেনNavigator.of(context).pop()

@override
Widget build(BuildContext context) {
  return new WillPopScope(
    onWillPop: () async => false,
    child: new Scaffold(
      appBar: new AppBar(
        title: new Text("data"),
        leading: new IconButton(
          icon: new Icon(Icons.ac_unit),
          onPressed: () => Navigator.of(context).pop(),
        ),
      ),
    ),
  );
}

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

হাই @ রুমিআরসলেট, আপনি কি আমাকে পিছনে স্ট্যাক পরিচালনা করতে সাহায্য করতে পারেন যেমন আমার কাছে এ, বি, সি, ডি স্ক্রিন রয়েছে এবং আমি ডি-> বি বা ডি-> এ থেকে নেভিগেট করতে চাই, তবে আমি কীভাবে পরিচালনা করব এটা। আপনি কি দয়া করে আমাকে এতে গাইড করতে পারেন
রবীন্দ্র কুশওয়াহা

আমি জানি এই উত্তরটি সম্ভবত পুরানো। তবে একটি জিইএম! ব্যাখ্যাটি প্রসারিত করার বিষয়ে চিন্তা করুন। এটি দুর্দান্ত কাজ করে। ধন্যবাদ.
Val,

4
কেউ পপ () এর আগে কিছু করতে চাইলে এটি ব্যবহার করতে পারেনonWillPop: () async { onBack(); // "DO YOUR FUNCTION IS HERE WHEN POP" return false; }
হুয় টাওয়ার

24

রুমি রুসলেট যেমন উল্লেখ করেছেন, WillPopScopeসাধারণত যাওয়ার উপায়। তবে, আপনি যদি এমন একটি রাষ্ট্রীয় উইজেট বিকাশ করছেন যা সরাসরি পিছনের বোতামটিতে প্রতিক্রিয়া দেখা উচিত, আপনি এটি ব্যবহার করতে পারেন:

https://pub.dartlang.org/packages/back_button_intercepor

দ্রষ্টব্য: আমি এই প্যাকেজটির লেখক।


সম্পূর্ণ শ্রদ্ধার সাথে, আপনি কি মন্তব্য হিসাবে ভাল এটি উপযুক্ত মনে করেন না?
কক্সঅনরোড

25
@ কপসঅনরোড নো, যেহেতু এটি অন্য উত্তরের মন্তব্য নয়, বরং একই সমস্যাটি সমাধান করার সম্পূর্ণ ভিন্ন উপায়।
মারকজি

এটি একটি ভাল বিকল্প এবং এটি যদি কোনও মন্তব্যের অংশ হয় তবে তা উপেক্ষা করা যেত।
abhijat_saxena

17

রেমির উত্তরটি সঠিক হলেও সাধারণত আপনি কেবল পিছনের বোতামটি ব্লক করতে চান না তবে কোনও ব্যবহারকারী প্রস্থানটি নিশ্চিত করতে চান।

নিশ্চিতকরণ ডায়ালগ থেকে উত্তর পেয়ে আপনি এটি একইভাবে করতে পারেন, কারণ onWillPopভবিষ্যত।

@override
Widget build(BuildContext context) {
  return WillPopScope(
    child: Scaffold(...),
    onWillPop: () => showDialog<bool>(
      context: context,
      builder: (c) => AlertDialog(
        title: Text('Warning'),
        content: Text('Do you really want to exit'),
        actions: [
          FlatButton(
            child: Text('Yes'),
            onPressed: () => Navigator.pop(c, true),
          ),
          FlatButton(
            child: Text('No'),
            onPressed: () => Navigator.pop(c, false),
          ),
        ],
      ),
    ),
  );
}

এই উত্তরটি কেন একটি নিম্নগামী হয়? কেউ কি এটি বাস্তবায়ন করে এবং খারাপ অভিজ্ঞতা আছে?
সামিআজার

আমি ডিভাইস থেকে ব্যাক বোতাম টিপে প্রথম স্ক্রিনে না গিয়ে আগের স্ক্রিনে যেতে চাই। আমার এই জাতীয় ডায়ালগ বক্সের দরকার নেই। আমার কী করা উচিত
লক্ষ্মীওশ্বর্বরান

4

আমি এটি এখানে পোস্ট করছি যদি কেউ এটির সন্ধান করে এবং শুভ কামনা করে তবে তারা একটি সাধারণ উদাহরণ খুঁজে পেতে পারে https://gist.github.com/b-cancel/0ca372017a25f0c120b14dfca3591aa5

import 'package:flutter/material.dart';

import 'dart:async';

void main() => runApp(new BackButtonOverrideDemoWidget());

class BackButtonOverrideDemoWidget extends StatefulWidget{
  @override
  _BackButtonOverrideDemoWidgetState createState() => new _BackButtonOverrideDemoWidgetState();
}

class _BackButtonOverrideDemoWidgetState extends State<BackButtonOverrideDemoWidget> with WidgetsBindingObserver{

  //-------------------------Test Variable

  bool isBackButtonActivated = false;

  //-------------------------Required For WidgetsBindingObserver

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  //-------------------------Function That Triggers when you hit the back key

  @override
  didPopRoute(){
    bool override;
    if(isBackButtonActivated)
      override = false;
    else
      override = true;
    return new Future<bool>.value(override);
  }

  //-------------------------Build Method

  @override
  Widget build(BuildContext context) {
    return new Directionality(
      textDirection: TextDirection.ltr,
      child: new Container(
          color: (isBackButtonActivated) ? Colors.green : Colors.red,
          child: new Center(
              child: new FlatButton(
                color: Colors.white,
                onPressed: () {
                  isBackButtonActivated = !isBackButtonActivated;
                  setState(() {});
                },
                child: (isBackButtonActivated) ?
                new Text("DeActive the Back Button") : new Text("Activate the Back Button"),
              )
          )
      ),
    );
  }
}

আমি গতকাল আক্ষরিকভাবে এটি নিজেই ব্যবহার করেছি। এটি কেবল অ্যান্ড্রয়েডের জন্য মনে রাখবেন, অ্যাপলের কোনও ব্যাক বোতাম নেই। যদিও আপনি সম্ভবত আমাকে কী ভুল হয়েছে তা বলতে পারলেন তাই আমি এটি মেরামত করতে পারি, অথবা সম্ভবত এটি কেবলমাত্র আমার নির্দিষ্ট এমুলেটরটিতে কাজ করে। আমি কয়েক সপ্তাহের মধ্যে আমার স্ফুটনা আপডেট করেছি তাই সম্ভবত সমস্যা। আমাকে
ব্রায়ান বাতিল করুন

@ ব্রায়ানস্যানসেল আপনার উত্তর কেবলমাত্র তখনই কার্যকর হয় যদি আপনার কাছে এখনও কোনও ধাক্কা দেওয়া রুট না থাকে। পদ্ধতি উইজেটস বাইন্ডিং.হ্যান্ডলপপ রুট () দেখুন। এটি নিবন্ধভুক্তিতে পর্যবেক্ষকদের অবহিত করে এবং এটি সত্য হওয়ার সাথে সাথেই থেমে যায়। যখন সেখানে ধাক্কা দেওয়া রুট থাকে, নেভিগেটরটি প্রথমে সত্য ফিরে আসে, এবং তারপরে আপনার পর্যবেক্ষককে কখনই ডাকা হয় না। অন্য কথায়, আপনার কোড কেবল তখনই যখন অ্যাপ্লিকেশনটি পিছনে বোতামটি ক্লিক করে, যখন আর কোনও রুট অবশিষ্ট নেই, তখন অ্যাপ্লিকেশনটি বন্ধ হতে বাধা দিতে কাজ করে।
মারকজি

3

আপনি Future.value(bool)পিছনের বোতামটি হ্যান্ডেল করতে ব্যবহার করতে পারেন ।

bool _allow = true;

@override
Widget build(BuildContext context) {
  return WillPopScope(
    child: Scaffold(appBar: AppBar(title: Text("Back"))),
    onWillPop: () {
      return Future.value(_allow); // if true allow back else block it
    },
  );
}

এফওয়াইআই, এটি সমান onWillPop: () async => _allow
লিন

@ লিন হ্যাঁ আমি এটি জানি। আমি কেবল Future.value()কল ভাগ করে নিতে চেয়েছিলাম ।
কক্সঅনরোড

3

আমি মিক্সিন এবং উইলপপস্কোপ উইজেটটি কেবল আমার জন্য কাজটি করতে পারি নি। এটি আমার কাছে সেরা পন্থা, আমার মতে উইলপপস্কোপের চেয়ে অনেক ভাল।
final bool canPop = ModalRoute.of(context)?.canPop ?? false;
অ্যাপবারের ভিতরে এটির মতো ব্যবহার হয়েছে:

leading: ModalRoute.of(context)?.canPop ?? false
    ? IconButton(
        onPressed: () {
          Navigator.pop(context);
        },
        icon: (Platform.isAndroid)
            ? const Icon(Icons.arrow_back)
            : const Icon(Icons.arrow_back_ios),
      )
    : Container(),

2

উত্তরটি সম্ভবত আপনি জানতেন যে এটি উইলপপস্কোপ ব্যবহার করে তবে দুর্ভাগ্যক্রমে আইওএস-এ আপনি আগের পৃষ্ঠাটি পিছনে ফিরে সোয়াইপ করতে পারবেন না , তাই আসুন আপনার মেটিরিয়ালপেজ রুটটি কাস্টম করুন:

class CustomMaterialPageRoute<T> extends MaterialPageRoute<T> {
  @protected
  bool get hasScopedWillPopCallback {
    return false;
  }
  CustomMaterialPageRoute({
    @required WidgetBuilder builder,
    RouteSettings settings,
    bool maintainState = true,
    bool fullscreenDialog = false,
  }) : super( 
          builder: builder,
          settings: settings,
          maintainState: maintainState,
          fullscreenDialog: fullscreenDialog,
        );
}

এখন আপনি উইলপপস্কোপ ব্যবহার করতে পারেন এবং সোয়াইপ টু ব্যাক আইওএস-এ কাজ করবে। বিশদটির উত্তরটি এখানে: https://github.com/flutter/flutter/issues/14203#issuecomment-540663717


1

অ্যাপবারের শীর্ষস্থানীয়গুলিতে কেবল একটি ধারক যুক্ত করুন যা পিছনের বোতামটি লুকিয়ে রাখে।

AppBar(
        title: new Text('Page Title'),
        leading: new Container(),
      ),
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.