আমি কীভাবে ঝাঁকুনিতে একটি বোতাম অক্ষম করব?


113

আমি কেবল ফ্লটারের হ্যাং পেতে শুরু করছি, তবে কীভাবে একটি বোতামের সক্ষম রাষ্ট্র সেট করবেন তা নির্ধারণ করতে আমার সমস্যা হচ্ছে।

দস্তাবেজগুলি থেকে, এটি onPressedবোতামটি অক্ষম করার জন্য বাতিল করতে এবং এটি সক্ষম করার জন্য একটি মান দেওয়ার কথা বলে। বাটনটি একই অবস্থায় একই সাথে চলতে থাকলে এটি ঠিক আছে if

আমি একটি কাস্টম স্টেটফুল উইজেট তৈরি করার প্রয়োজন আমার এই ধারণাটি পেয়েছি যা আমাকে কোনওভাবে বাটনের সক্ষম রাষ্ট্র (বা অনপ্রেসড কলব্যাক) আপডেট করতে দেয়।

সুতরাং আমার প্রশ্ন আমি কীভাবে এটি করব? এটি দেখতে বেশ সহজ সরল প্রয়োজন বলে মনে হচ্ছে তবে কীভাবে এটি করা যায় সে সম্পর্কে আমি ডক্সে কিছুই খুঁজে পাচ্ছি না।

ধন্যবাদ।


আপনি কী বলতে চেয়েছেন তা কী আপনি স্পষ্ট করতে পারেন "যদি বাটনটি একইরকম অবস্থায় লাইফসাইকের জন্য অবিরত থাকে তবে এই ভাল"। ?
শেঠ লাড

উত্তর:


125

আমি মনে করি আপনি buildআপনার বোতামে কিছু সহায়ক ফাংশন পাশাপাশি কিছু সম্পত্তি বন্ধ করার জন্য একটি স্টেটফুল উইজেট প্রবর্তন করতে চাইতে পারেন ।

  • স্টেটফুল উইজেট / স্টেট ব্যবহার করুন এবং আপনার অবস্থা ধরে রাখতে একটি পরিবর্তনশীল তৈরি করুন (উদাঃ isButtonDisabled)
  • প্রথমদিকে এটি সত্যে সেট করুন (যদি এটি আপনি চান)
  • বোতামটি রেন্ডার করার সময়, কোনওটি বা কোনও ফাংশনে সরাসরিonPressed মান সেট করবেন নাnullonPressed: () {}
  • পরিবর্তে , শর্তসাপেক্ষে এটি কোনও ত্রৈমাসিক বা কোনও সহায়ক ফাংশন ব্যবহার করে সেট করুন (নীচে উদাহরণস্বরূপ)
  • isButtonDisabledএই শর্তাধীন অংশ হিসাবে পরীক্ষা করুন এবং হয় nullবা কিছু ফাংশন ফিরে ।
  • যখন বোতাম টিপানো হয় (বা আপনি যখনই বোতামটি অক্ষম করতে চান) setState(() => isButtonDisabled = true)শর্তসাপেক্ষ ভেরিয়েবলটি ফ্লিপ করতে ব্যবহার করুন ।
  • ঝাঁকুনি build()আবার নতুন রাষ্ট্রের সাথে পদ্ধতিটি কল করবে এবং বোতামটি একটি nullপ্রেস হ্যান্ডলারের সাথে রেন্ডার হবে এবং অক্ষম হয়ে যাবে।

ফ্লটার কাউন্টার প্রকল্পটি ব্যবহার করে এখানে আরও কিছু প্রসঙ্গ দেওয়া আছে।

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  bool _isButtonDisabled;

  @override
  void initState() {
    _isButtonDisabled = false;
  }

  void _incrementCounter() {
    setState(() {
      _isButtonDisabled = true;
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("The App"),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              'You have pushed the button this many times:',
            ),
            new Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            _buildCounterButton(),
          ],
        ),
      ),
    );
  }

  Widget _buildCounterButton() {
    return new RaisedButton(
      child: new Text(
        _isButtonDisabled ? "Hold on..." : "Increment"
      ),
      onPressed: _isButtonDisabled ? null : _incrementCounter,
    );
  }
}

এই উদাহরণে আমি শর্তসাপেক্ষে Textএবং onPressedএটি সেট করতে একটি ইনলাইন ত্রিভুজ ব্যবহার করছি , তবে এটি কোনও ফাংশনে আনতে আপনার পক্ষে আরও উপযুক্ত হতে পারে (আপনি বোতামের পাঠ্যও পরিবর্তন করতে একই পদ্ধতি ব্যবহার করতে পারেন):

Widget _buildCounterButton() {
    return new RaisedButton(
      child: new Text(
        _isButtonDisabled ? "Hold on..." : "Increment"
      ),
      onPressed: _counterButtonPress(),
    );
  }

  Function _counterButtonPress() {
    if (_isButtonDisabled) {
      return null;
    } else {
      return () {
        // do anything else you may want to here
        _incrementCounter();
      };
    }
  }

3
আপনাকে আর্গুমেন্ট হিসাবে ফ্যাট অ্যারো ফাংশন যুক্ত করতে হবে অন্যথায়, বাটন সক্ষম হয়ে গেলে _CrementCounter () ফাংশনটি ততক্ষণে ডাকা হবে। এইভাবে এটি বোতামটি ক্লিক না করা অবধি অপেক্ষা করবে: অনপ্রেসডটি দেখতে এমন হওয়া উচিত:onPressed: _isButtonDisabled ? null : () => _incrementCounter
ভিট ভেরেস

2
@ ভিটভিয়ার্স যা সাধারণত সত্য তবে _উত্তরবাটন প্রেস () কোনও ফাংশন ফিরিয়ে দিচ্ছে return () {}তাই এটি উদ্দেশ্যমূলক। আমি এখানে ফ্যাট তীরটি ব্যবহার করতে চাই না কারণ আমি ফাংশনটি কার্যকর করতে এবং ফিরে আসতে nullএবং বোতামটি অক্ষম করতে চাই।
অ্যাশটন থমাস

@ অ্যাসটন থমাস হ্যাঁ, নিষ্কাশনের পদ্ধতিতে _উক্তর বাটন প্রেস () ঠিক তেমনই আপনার ব্যাখ্যা অনুসারে, তবে আপনি উত্তোলনের পরামর্শ দেওয়ার আগে আমি টার্নারি অপারেটরের সাথে কোডটি উল্লেখ করছিলাম। আপনার প্রথম উদাহরণে এটি যখন _CrementCounter () পদ্ধতি কার্যকর করতে হবে তখন বোতামটি সক্ষম করা উচিত। পরবর্তী সময় আমি আরও স্পষ্টভাবে কী বলতে চাইছি তা নির্দেশ করার চেষ্টা করব :)
ভিট ভেরেস

30
কোনও disabledসম্পত্তি, ফ্লার্ট টিম ব্যবহার করে কী ভুল হয়েছিল ? এটি কেবল স্বজ্ঞাত নয়: - /
কোঁকড়া

1
সঠিক উপায়টি অ্যাবসরবপয়েন্টার বা IgnorePointer এর সাথে রয়েছে। অনপ্রেসড নাল থেকে সেট আপ করার সাথে যুক্তির পরিবর্তে কেবল উইজেটের উপায়।
ejdrian313

93

ডক্স অনুসারে:

"যদি অনপ্রেসড কলব্যাকটি শূন্য থাকে তবে বোতামটি অক্ষম হয়ে যাবে এবং ডিফল্টরূপে অক্ষম রঙের একটি ফ্ল্যাট বোতামের অনুরূপ।"

https://docs.flutter.io/flutter/material/RaisedButton-class.html

সুতরাং, আপনি এই জাতীয় কিছু করতে পারেন:

    RaisedButton(
      onPressed: calculateWhetherDisabledReturnsBool() ? null : () => whatToDoOnPressed,
      child: Text('Button text')
    );

2
দস্তাবেজগুলি বিচার করে, এটি এভাবে প্রয়োগ করা দরকার। মত গৃহীত উত্তর বৈশিষ্ট্য সঙ্গে disabledElevation, disabledColorএবং DisabledTextColorকাজ দেয়ার উদ্দেশ্যে করা যেমন হবে না।
জোয়েল ব্রোস্ট্রমে

এই স্টিভের জন্য পিএফএফ ধন্যবাদ, বর্তমানে গৃহীত উত্তরের সমস্ত কোডের মধ্য দিয়ে যাওয়ার পরিকল্পনা করছিল না। @ chris84948, এটি গ্রহণযোগ্য উত্তরে পরিবর্তন করার বিষয়টি বিবেচনা করুন।
কুলারবাইটস


17

বিন্যাস

onPressed: null // disables click

এবং

onPressed: () => yourFunction() // enables click

1
এই সমাধানে এর মান onPressedসর্বদা একটি কার্যকারিতা হয় তাই বোতামটি 'ক্লিকযোগ্য' হিসাবে রেন্ডার করা হয় যদিও isEnabledসম্পত্তি সেট করা থাকলে এটি ক্লিক ইভেন্টটিকে অগ্রাহ্য করবে । বোতামটি সত্যিই অক্ষম করতে, ব্যবহার করুনRaisedButton(onPressed: isEnabled ? _handleClick : null
কোঁকড়া

15

নির্দিষ্ট এবং সীমিত সংখ্যক উইজেটের জন্য, এ্যাগনোরপয়েন্টারে একটি উইজেটে এগুলি মুড়িয়ে ফেলা ঠিক এটি করে: যখন তার ignoringসম্পত্তিটি সত্য সেট করা হয়, তখন সাব-উইজেট (আসলে পুরো সাবট্রিটি) ক্লিকযোগ্য হয় না।

IgnorePointer(
    ignoring: true, // or false
    child: RaisedButton(
        onPressed: _logInWithFacebook,
        child: Text("Facebook sign-in"),
        ),
),

অন্যথায়, আপনি যদি একটি সম্পূর্ণ সাবট্রি নিষ্ক্রিয় করতে চান, তবে অ্যাবসারবপয়েন্টার () এ দেখুন।


9

বেশিরভাগ উইজেটগুলির জন্য সক্ষম ও অক্ষম কার্যকারিতা একই।

প্রাক্তন, বোতাম, সুইচ, চেকবক্স ইত্যাদি etc.

onPressedনীচে প্রদর্শিত হিসাবে ঠিক সম্পত্তি সেট করুন

onPressed : nullফেরৎ অক্ষম উইজেট

onPressed : (){}বা onPressed : _functionNameআয় উইজেট সক্রিয়


6

আপনি অ্যাসারবপয়েন্টারও ব্যবহার করতে পারেন এবং আপনি এটি নিম্নলিখিত উপায়ে ব্যবহার করতে পারেন:

AbsorbPointer(
      absorbing: true, // by default is true
      child: RaisedButton(
        onPressed: (){
          print('pending to implement onPressed function');
        },
        child: Text("Button Click!!!"),
      ),
    ),

আপনি যদি এই উইজেট সম্পর্কে আরও জানতে চান তবে নীচের লিঙ্কটি ফ্লার্ট ডক্সটি পরীক্ষা করতে পারেন


2
উপেক্ষা করুন- / অ্যাবসারবপয়েন্টার অক্ষম শৈলীগুলিকে কেবল একটি স্মরণিকা হিসাবে বিবেচনা করে না :-)
পাস্কাল

4

এটি আমার মতে সবচেয়ে সহজ উপায়:

RaisedButton(
  child: Text("PRESS BUTTON"),
  onPressed: booleanCondition
    ? () => myTapCallback()
    : null
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.