আমি কীভাবে অন স্ক্রিন কীবোর্ডকে বরখাস্ত করতে পারি?


137

আমি একটি দিয়ে ব্যবহারকারীর ইনপুট সংগ্রহ করছি TextFormFieldএবং যখন ব্যবহারকারী একটি প্রেসিং করে FloatingActionButtonযে তারা সম্পন্ন হয়েছে তা নির্দেশ করে, আমি অন স্ক্রিন কীবোর্ডটি খারিজ করতে চাই।

কীভাবে কীভাবে কীভাবে স্বয়ংক্রিয়ভাবে চলে যাব?

import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  MyHomePageState createState() => new MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  TextEditingController _controller = new TextEditingController();

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.send),
        onPressed: () {
          setState(() {
            // send message
            // dismiss on screen keyboard here
            _controller.clear();
          });
        },
      ),
      body: new Container(
        alignment: FractionalOffset.center,
        padding: new EdgeInsets.all(20.0),
        child: new TextFormField(
          controller: _controller,
          decoration: new InputDecoration(labelText: 'Example Text'),
        ),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

void main() {
  runApp(new MyApp());
}

কলিন, @ প্যাস্কালের দ্বিতীয় উত্তরটি আপডেট হওয়া, সঠিক উত্তর হওয়া উচিত।
জ্যাক 21

উত্তর:


223

ঝাঁকুনি v1.7.8 + হটফিক্স ২. হিসাবে, যাওয়ার উপায় হ'ল:

FocusScope.of(context).unfocus()

সে সম্পর্কে পিআর সম্পর্কে মন্তব্য :

এখন যেহেতু # 31909 (be75fb3) অবতরণ করেছে, আপনি ব্যবহার করা উচিত FocusScope.of(context).unfocus()পরিবর্তে FocusScope.of(context).requestFocus(FocusNode()), যেহেতু FocusNodeগুলি হয় ChangeNotifiers, এবং সঠিকভাবে বিন্যস্ত করতে হবে।

-> আর ব্যবহার করবেন না̶r̶e̶q̶u̶e̶s̶t̶F̶o̶c̶u̶s̶(̶F̶o̶c̶u̶s̶N̶o̶d̶e̶(̶)̶

 F̶o̶c̶u̶s̶S̶c̶o̶p̶e̶.̶o̶f̶(̶c̶o̶n̶t̶e̶x̶t̶)̶.̶r̶e̶q̶u̶e̶s̶t̶F̶o̶c̶u̶s̶(̶F̶o̶c̶u̶s̶N̶o̶d̶e̶(̶)̶)̶;̶

1
হটফিক্স v1.7.8 + হটফিক্স 4 এ আমার জন্য কাজ করেছেন
রাজেশ জুনিয়র

2
আমার জন্য কাজ করুন, এই উত্তরটি সঠিক হিসাবে মুখোশযুক্ত করা উচিত
ব্যবহারকারীর 3087360

@ কাইন আপনি দয়া করে বিস্তারিত বলতে পারেন? প্রতি ডকুমেন্টেশন, এটি করার উপায় (দেখুন api.flutter.dev/flutter/widgets/FocusNode/unfocus.html )
পাস্কাল

@ পাসল হ্যাঁ আমি ডকুমেন্টেশন পড়েছি এবং এটি আমার পছন্দসই সমাধান হতে পারে তবে আমার অ্যাপ্লিকেশনটিতে এটি সর্বদা কার্যকর হয় না (বেশ কয়েকটি TextFieldএস এবং অন্যান্য সম্পাদনা উইজেট সহ একটি জটিল জটিল রূপ )। আমি জানি না তবে মাঝে মাঝে unfocusএর কোনও প্রভাব পড়ে না। এটি গ্রহণযোগ্য সমাধান (অন্য কোনও পরিবর্তন নয়) দিয়ে প্রতিস্থাপন করা সমস্যার সমাধান করে। সম্ভবত এটি সেই অবস্থানের সাথে সম্পর্কিত যেখানে unfocusথেকে ফোন করা হয়েছিল। আমাকে এটিকে কল করতে হবে যেমন CheckBoxListTile.onChangedব্যবহারকারী যখন চেকবক্স উইজেটের সাথে ইন্টারঅ্যাক্ট করে এবং অন্যান্য অনুরূপ অবস্থান থেকে কীবোর্ড খারিজ করে দেয়। সঠিক সমস্যার অবস্থান আমার মনে নেই।
গাভী

@ কেইন ব্যাখ্যার জন্য ধন্যবাদ। ফ্লাটার দলকে একটি উদাহরণ প্রদান করা আশ্চর্যজনক হবে ;-)
পাস্কাল

206

দ্রষ্টব্য: এই উত্তরটি পুরানো। ঝাঁকুনির নতুন সংস্করণগুলির উত্তর দেখুন

এর ফোকাস TextFormFieldকেড়ে নিয়ে কোনও অব্যবহৃতটিকে দিয়ে আপনি কীবোর্ডটি খারিজ করতে পারেন FocusNode:

FocusScope.of(context).requestFocus(FocusNode());

আপনি এই কোডটি কোথায় প্রয়োগ করবেন? টেক্সটফর্মফিল্ডে; onChanged:আপনার কাস্টম বোতামটির পরে বা অ্যাকশনে হতে পারে?
চার্লস জুনিয়র

@ চার্লসজেআর আমি এটি আমার বোতামটির ক্রিয়াতে করি।
ডানকান জোন্স

আপনি চাইলে আমার প্যাকেজটি ব্যবহার করতে পারেন :) pub.dartlang.org/packages/keyboard_ કાર્યવાહી
diegoveloper

17
উত্তর দেখুন - এই পাখির v1.7.8 আগে stackoverflow.com/a/56946311/8696915 যা দেয়FocusScope.of(context).unfocus()
রিচার্ড জনসন

1
আপনার .unfocus () এ অ্যাক্সেস থাকলে এটি করবেন না যেহেতু এটি মেমরি ফুটো করে দেবে। নতুন ফোকাসনোড () কখনই পরিষ্কার হবে না। .Unfocus () সম্পর্কে মন্তব্য দেখুন
মাইকেল পিটারসন

70

ফোকাসস্কোপ সহ সমাধান আমার পক্ষে কাজ করে না। আমি অন্য একটি পেয়েছি:

import 'package:flutter/services.dart';

SystemChannels.textInput.invokeMethod('TextInput.hide');

এটি আমার সমস্যার সমাধান করেছে।


এটিকে কল করা আমার পক্ষে কীবোর্ডটি আড়াল করে না। এটি কি অ্যান্ড্রয়েড এবং আইওএস উভয় ক্ষেত্রেই কাজ করা উচিত?
Jardo

আইওএস (12.1, আইফোন 5 এস) এবং অ্যান্ড্রয়েড (পিক্সেল 3)
জ্যানি থিউনিসেন

তুমি কোথায় রেখেছ? আমি এটিকে অ্যাপটিতে কোডের প্রথম বিট হিসাবে কেবল যুক্ত করার চেষ্টা করেছি এবং এটি কিছুই করতে পারেনি।
জাস্টিন 808

আপনার অর্থ কী - "কোডের প্রথম বিট"? buildউদাহরণ হিসাবে এটি পদ্ধতিতে sert োকান।
আন্দ্রে তুর্কভস্কি

1
সংখ্যার কী-বোর্ডের জন্য এটির সমতুল্য কি আছে?
ড্যানিয়েল মাকসিমোভিচ

19

ঝাঁকুনির জন্য 1.17.3 (জুন 2020 হিসাবে স্থিতিশীল চ্যানেল), ব্যবহার করুন

FocusManager.instance.primaryFocus.unfocus();

12

উপরের সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করে না।

ঝাঁকুনি এটির পরামর্শ দেয় - আপনার উইজেটটিকে নতুন গেস্টচারডেক্টর () এর ভিতরে রাখুন যার উপরে আলতো চাপলে কীবোর্ডটি লুকানো হবে এবং অন ট্যাপ ফোকাসস্কোপ.অফ (প্রসঙ্গ) ব্যবহার করবে quআপনিফোকাস (নতুন ফোকাসনোড ())

class Home extends StatelessWidget {
@override
  Widget build(BuildContext context) {
    var widget = new MaterialApp(
        home: new Scaffold(
            body: new Container(
                height:500.0,
                child: new GestureDetector(
                    onTap: () {
                        FocusScope.of(context).requestFocus(new FocusNode());
                    },
                    child: new Container(
                        color: Colors.white,
                        child:  new Column(
                            mainAxisAlignment:  MainAxisAlignment.center,
                            crossAxisAlignment: CrossAxisAlignment.center,

                            children: [
                                new TextField( ),
                                new Text("Test"),                                
                            ],
                        )
                    )
                )
            )
        ),
    );

    return widget;
}}

12

নিম্নলিখিত কোডটি আমাকে কীবোর্ড আড়াল করতে সহায়তা করেছিল

   void initState() {
   SystemChannels.textInput.invokeMethod('TextInput.hide');
   super.initState();
   }

12

তালিকাটি স্ক্রোল করার সময় কীবোর্ডটিকে স্বয়ংক্রিয়ভাবে লুকানোর জন্য .unfocus () এর প্রয়োগকরণের উদাহরণ

FocusScope.of(context).unfocus();

আপনি খুঁজে পেতে পারেন

https://github.com/flutter/flutter/issues/36869#issuecomment-518118441

Szotp ধন্যবাদ


1
হ্যাঁ, এটি করার সহজ উপায় এটি।
মিথুন নাথ

8
GestureDetector(
          onTap: () {
            FocusScope.of(context).unfocus();
          },
          child:Container(
    alignment: FractionalOffset.center,
    padding: new EdgeInsets.all(20.0),
    child: new TextFormField(
      controller: _controller,
      decoration: new InputDecoration(labelText: 'Example Text'),
    ),
  ), })

ট্যাপ ইশারায় এটি চেষ্টা করুন


ধন্যবাদ ... এই সমাধানটি নিয়েছেন
অজয় কুমার

6

যেহেতু বিড়বিড় করে সমস্ত কিছু উইজেট, আমি একটি উইজেট এবং এতে একটি মিশ্রণ সহ একটি স্বল্প ইউটিলিটি মডিউলটিতে SystemChannels.textInput.invokeMethod('TextInput.hide');এবং FocusScope.of(context).requestFocus(FocusNode());পদ্ধতিটি মোড়ানোর সিদ্ধান্ত নিয়েছি ।

উইজেটের সাহায্যে আপনি যে কোনও উইজেটকে (একটি ভাল আইডিই সমর্থন ব্যবহার করার সময় খুব সুবিধাজনক) KeyboardHiderউইজেটের সাথে মোড়াতে পারেন :

class SimpleWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return KeyboardHider(
      /* Here comes a widget tree that eventually opens the keyboard,
       * but the widget that opened the keyboard doesn't necessarily
       * takes care of hiding it, so we wrap everything in a
       * KeyboardHider widget */
      child: Container(),
    );
  }
}

মিক্সিনের সাহায্যে আপনি কীবোর্ডটি কোনও রাজ্য থেকে লুকিয়ে ট্রিগার করতে পারেন বা যে কোনও মিথস্ক্রিয়া অনুসারে উইজেট:

class SimpleWidget extends StatefulWidget {
  @override
  _SimpleWidgetState createState() => _SimpleWidgetState();
}

class _SimpleWidgetState extends State<SimpleWidget> with KeyboardHiderMixin {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () {
        // Hide the keyboard:
        hideKeyboard();
        // Do other stuff, for example:
        // Update the state, make an HTTP request, ...
      },
    );
  }
}

কেবল একটি keyboard_hider.dartফাইল তৈরি করুন এবং উইজেট এবং মিক্সিন ব্যবহারের জন্য প্রস্তুত:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

/// Mixin that enables hiding the keyboard easily upon any interaction or logic
/// from any class.
abstract class KeyboardHiderMixin {
  void hideKeyboard({
    BuildContext context,
    bool hideTextInput = true,
    bool requestFocusNode = true,
  }) {
    if (hideTextInput) {
      SystemChannels.textInput.invokeMethod('TextInput.hide');
    }
    if (context != null && requestFocusNode) {
      FocusScope.of(context).requestFocus(FocusNode());
    }
  }
}

/// A widget that can be used to hide the text input that are opened by text
/// fields automatically on tap.
///
/// Delegates to [KeyboardHiderMixin] for hiding the keyboard on tap.
class KeyboardHider extends StatelessWidget with KeyboardHiderMixin {
  final Widget child;

  /// Decide whether to use
  /// `SystemChannels.textInput.invokeMethod('TextInput.hide');`
  /// to hide the keyboard
  final bool hideTextInput;
  final bool requestFocusNode;

  /// One of hideTextInput or requestFocusNode must be true, otherwise using the
  /// widget is pointless as it will not even try to hide the keyboard.
  const KeyboardHider({
    Key key,
    @required this.child,
    this.hideTextInput = true,
    this.requestFocusNode = true,
  })  : assert(child != null),
        assert(hideTextInput || requestFocusNode),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      behavior: HitTestBehavior.opaque,
      onTap: () {
        hideKeyboard(
          context: context,
          hideTextInput: hideTextInput,
          requestFocusNode: requestFocusNode,
        );
      },
      child: child,
    );
  }
}

4

আপনি ক্লাস unfocus()থেকে পদ্ধতি ব্যবহার করতে পারেন FocusNode

import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  MyHomePageState createState() => new MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  TextEditingController _controller = new TextEditingController();
  FocusNode _focusNode = new FocusNode(); //1 - declare and initialize variable

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.send),
        onPressed: () {
            _focusNode.unfocus(); //3 - call this method here
        },
      ),
      body: new Container(
        alignment: FractionalOffset.center,
        padding: new EdgeInsets.all(20.0),
        child: new TextFormField(
          controller: _controller,
          focusNode: _focusNode, //2 - assign it to your TextFormField
          decoration: new InputDecoration(labelText: 'Example Text'),
        ),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

void main() {
  runApp(new MyApp());
}

1
ওহে! আপনি নিজের উত্তরের সাথে আরও কিছুটা প্রসঙ্গ যুক্ত করতে নিজের উত্তরটি সম্পাদনা করতে পারলে সবচেয়ে ভাল হবে ।
গ্রোভেলপ্লেক্স

1
কোডিং অন্তত পরিমাণ সঙ্গে সবচেয়ে ভালো সমাধান
Val,

হ্যাঁ, নির্দিষ্ট উইজেটে আলতো চাপলে এটি ফোকাসটি সরিয়ে দেয়। এটি আমার অ্যাপ্লিকেশনের প্রতিটি উইজেটে যুক্ত করতে পারছি না।
ডিপিড্রেনা

উইজেটে ট্যাপ করা unfocusপদ্ধতিটি কল করার একমাত্র উপায় । আপনি যদি নিজের অ্যাপ্লিকেশনটিতে এটি স্প্যাম করতে না চান তবে আপনি TextFormFieldপরিবর্তনের ইভেন্ট বা প্রতিক্রিয়াশীল প্যাটার্নের মতো কোনও ভিন্ন উপায়ে ব্যবহার করতে পারেন , এটি আপনার অ্যাপের আর্কিটেকচারের উপর নির্ভর করে।
ইভানড্রো এপি। এস।

4

বিভিন্ন সংস্করণের জন্য বিভিন্ন পদ্ধতির মতো দেখায়। আমি ফ্লটার ভি 1.17.1 ব্যবহার করছি এবং নীচে আমার জন্য কাজ করে।

onTap: () {
    FocusScopeNode currentFocus = FocusScope.of(context);
    if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
       currentFocus.focusedChild.unfocus();
    }
}

1
_dismissKeyboard(BuildContext context) {
   FocusScope.of(context).requestFocus(new FocusNode());
}

@override
Widget build(BuildContext context) {

return new GestureDetector(
    onTap: () {
    this._dismissKeyboard(context);
    },
    child: new Container(
    color: Colors.white,
    child: new Column(
        children: <Widget>[/*...*/],
    ),
    ),
 );
}

0

একটি পাঠ্য সম্পাদনা নিয়ামক ব্যবহার করে দেখুন। শুরুতে,

    final myController = TextEditingController();
     @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    myController.dispose();
    super.dispose();
  }

এবং অন প্রেস ইভেন্টে,

onPressed: () {
            commentController.clear();}

এটি কিবোর্ডকে বরখাস্ত করবে।

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