जब कीबोर्ड दिखाई देता है, तो स्पंदन विगेट्स आकार लेते हैं। इसे कैसे रोका जाए?


114

मेरे पास इस तरह विस्तारित विजेट का एक कॉलम है:

 return new Container(
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new Expanded(
            flex: 1,
            child: convertFrom,
          ),
          new Expanded(
            flex: 1,
            child: convertTo,
          ),
          new Expanded(
            flex: 1,
            child: description,
          ),
        ],
      ),
    );

यह इस तरह दिख रहा है:

यहां छवि विवरण दर्ज करें

convertFrom, एक TextField शामिल है। जब मैं इस टेक्स्ट फ़ील्ड पर टैप करता हूं, तो स्क्रीन पर एंड्रॉइड कीबोर्ड दिखाई देता है। इससे स्क्रीन का आकार बदल जाता है, इसलिए विजेट इस तरह आकार लेते हैं:

यहां छवि विवरण दर्ज करें

क्या स्क्रीन पर कीबोर्ड को "ओवरले" करने का एक तरीका है ताकि मेरा कॉलम आकार नहीं बदल सके? यदि मैं Expandedविजेट्स और हार्डकोड का उपयोग प्रत्येक विजेट के लिए ऊँचाई पर नहीं करता हूँ, तो विजेट्स आकार नहीं देते हैं, लेकिन जब कीबोर्ड दिखाई देता है, तो मुझे ब्लैक-एंड-यलो स्ट्राइप्ड एरर मिलती है (क्योंकि पर्याप्त जगह नहीं है)। यह भी सभी स्क्रीन आकारों के लिए लचीला नहीं है।

मुझे यकीन नहीं है कि यह एक एंड्रॉइड-विशिष्ट या स्पंदन-विशिष्ट है।


अपने पाड़ शरीर में एक SingleChildScrollView का उपयोग करें।
linhadiretalipe

जवाबों:


286

अद्यतन उत्तर

resizeToAvoidBottomPaddingअब पदावनत हो गया है

अद्यतन समाधान resizeToAvoidBottomInsetसंपत्ति को सेट करना है false


मूल उत्तर

अपने में Scaffold, resizeToAvoidBottomPaddingसंपत्ति सेट करें false


11
क्या इसके समान प्रभाव पैदा करने का कोई तरीका है android:windowSoftInputMode="adjustPan"? यदि मैं resizeToAvoidBottomPaddingपाड़ में जोड़ता हूं तो यह TextField को कवर करता है।
एपिकैलिटी

3
मुझे Android के बारे में पता नहीं है, लेकिन आम तौर पर इस मामले में एक ListView के अंदर अपने लेआउट को लपेटने के लिए एक अच्छा अभ्यास है
अज़ीज़ा

@aziza, मैं एक ही मुद्दे से पीड़ित था लेकिन आपके समाधान के बाद इसका काम ठीक है, लेकिन एक और मुद्दा है कृपया लिंक से वीडियो की जांच करें जब कीबोर्ड दिखाई देता है तो छवि ब्लिंक थी। dropbox.com/s/lian92mnzz8kv9w/FlutterIssue1.mov?dl=0
किशन व्यास

@ किशनवयस मेरे साथ एक ही छवि चली गई है।
स्टिकओवरफ़्लो

@aziza ठोस जवाब
वैल

35

अधिकांश अन्य उत्तर का उपयोग करने का सुझाव देते हैं resizeToAvoidBottomPadding=false। मेरे अनुभव में यह कीबोर्ड को टेक्स्ट फ़ील्ड को कवर करने की अनुमति देता है यदि वे नीचे हैं जहां कीबोर्ड दिखाई देगा।

मेरा वर्तमान समाधान यह है कि मेरे कॉलम को स्क्रीन के समान ऊँचाई पर रखने के लिए बाध्य किया जाए, फिर इसे इस SingleChildScrollViewतरह से रखें कि फ़्लटर स्वचालित रूप से मेरी स्क्रीन को बस तब तक ऊपर स्क्रॉल करता है जब कीबोर्ड का उपयोग किया जाता है।

Widget build(BuildContext context) {
  return Scaffold(
    body: SingleChildScrollView(
      physics: NeverScrollableScrollPhysics(),
      child: ConstrainedBox(
        constraints: BoxConstraints(
          minWidth: MediaQuery.of(context).size.width,
          minHeight: MediaQuery.of(context).size.height,
        ),
        child: IntrinsicHeight(
          child: Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              // CONTENT HERE
            ],
          ),
        ),
      ),
    ),
  );
}

मैं उपयोग करता हूं NeverScrollableScrollPhysicsताकि उपयोगकर्ता खुद को स्क्रॉल न कर सके।


4
मैंने बिना आपके तरीके की कोशिश की NeverScrollableScrollPhysicsऔर सब ठीक लग रहा है सिवाय उपयोगकर्ता के ऊपर और नीचे स्वाइप करने की कोशिश कर सकते हैं और वे ओवरस्क्रॉल चमक देख सकते हैं। जब मैं इसका उपयोग करता हूं तो NeverScrollableScrollPhysicsयह मुझे वैसा ही व्यवहार देता है जैसेresizeToAvoidBottomInset
साजद जौर्ड

झूठी के लिए प्राथमिक संपत्ति सेट करें।
वीएलएक्सयू

1
लेकिन इसका उपयोग करने NeverScrollableScrollPhysicsसे यह कीबोर्ड के साथ भी स्क्रॉल नहीं हो पाता है।
हाईवा डोस्की

18

जिसके बजाय पदावनत resizeToAvoidBottomInsetकरने के लिए सेट है।falseresizeToAvoidBottomPadding

    return Scaffold(
      resizeToAvoidBottomInset : false,
      body: YourWidgets(),
    );

3
वे एक ही उत्तर हैं @Ojonugwa, शायद संपादक ने स्वीकार किए गए उत्तर को अद्यतन करने के बाद मैंने उसे पोस्ट किया, अब अंतर यह है कि मेरा उदाहरण इसमें शामिल है?
आर्टीमॉमएलके

5

मेरा दृष्टिकोण भौतिकी के SingleChildScrollViewसाथ उपयोग करना है ClampingScrollPhysics

SingleChildScrollView(
  physics: ClampingScrollPhysics(),
  child: Container(),
)

4

विधि 1:android:windowSoftInputMode="adjustResize" AndroidManifest.xml फ़ाइल से निकालें (अन्यथा यह फ़्लटर कोड को ओवरराइड कर देगा) और resizeToAvoidBottomPadding: falseनीचे की तरह पाड़ में जोड़ें :

Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar()
)

विधि 2 (अनुशंसित नहीं): बस android:windowSoftInputMode="stateVisible"Android में जोड़ें AndroidManifest.xml गतिविधि में यह केवल Android के लिए काम करेगा IOS जैसे I के लिए नहीं।

<activity
       ...
        android:windowSoftInputMode="stateVisible">

नोट: इसे सेट न करेंandroid:windowSoftInputMode="adjustResize"


4

वैसे मुझे लगता है कि अगर हम @ अमन के समाधान को लागू करते हैं तो यह हमारे ऐप को बदसूरत व्यवहार करेगा जैसे कि कीबोर्ड दिखाई देता है, यह उपलब्ध ऊंचाई के अनुसार स्क्रीन के हमारे व्यूपोर्ट को समायोजित नहीं करेगा और यह कीबोर्ड के पीछे अन्य क्षेत्रों को छिपा देगा। इसलिए मैं SingleChildScrollViewइसके बजाय उपयोग करने का सुझाव दूंगा।

अपना कोड SingleChildScrollViewनीचे दिए अनुसार लपेटें ,

 return new Container(
  child: SingleChildScrollView(
    child: new Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
      new Expanded(
        flex: 1,
        child: convertFrom,
      ),
      new Expanded(
        flex: 1,
        child: convertTo,
      ),
      new Expanded(
        flex: 1,
        child: description,
      ),
    ],
  ),
 ),
);

आप इस तथ्य से अवगत हैं कि यह तुरंत त्रुटियों का एक समूह फेंक देगा क्योंकि विस्तारित विजेट में सिंगलचिल्डक्रोलव्यू द्वारा दिए गए भरने के लिए अनंत स्थान होगा
क्रिश्चियन एक्स

2

उपयोग के मामले के आधार पर आप यह भी एक प्रयोग करने पर विचार कर सकता है सूचीदृश्य । यह सुनिश्चित करेगा कि जब पर्याप्त जगह न हो तो सामग्री स्क्रॉल करें। एक उदाहरण के रूप में, आप गैलरी ऐप में टेक्स्टफील्ड डेमो देख सकते हैं


4
लेकिन यह अभी भी आपके द्वारा चयनित टेक्स्टफिल्ड को दृश्यमान नहीं बनाता है, कीबोर्ड अभी भी इसे ओवरलैप करेगा। आपको इसे स्वयं स्क्रॉल करना होगा। एंड्रॉइड डेवलपर / उपयोगकर्ता के रूप में उपयोग नहीं किया जाता है
लड़का 23

2

मेरा सुझाव resizeToAvoidBottomInset: falseवैसे भी विजेट को रोकने से उपयोग करने के लिए है, अगर कीबोर्ड अचानक स्क्रीन पर दिखाई देता है। उदाहरण के लिए, यदि कोई उपयोगकर्ता आपके ऐप में रहते हुए फेसबुक चैट हेड्स का उपयोग करता है।

कीबोर्ड को ओवरलेइंग विजेट से रोकने के लिए, स्क्रीन पर जहां आपको इसकी आवश्यकता है, मैं निम्नलिखित दृष्टिकोण का सुझाव देता हूं, जहां SingleChildScrollViewउपलब्ध स्थान की ऊंचाई कम हो जाती है। इस स्थिति में, SingleChildScrollViewकेंद्रित विजेट पर भी स्क्रॉल करता है।

final double screenHeight = MediaQuery.of(context).size.height;
final double keyboardHeight = MediaQuery.of(context).viewInsets.bottom;
return Scaffold(
  resizeToAvoidBottomInset: false,
  body: SizedBox(
    height: screenHeight - keyboardHeight,
    child: SingleChildScrollView(
      child: Column(
        children: [
          const SizedBox(height: 200),
          for (var i = 0; i < 10; i++) const TextField()
        ],
      ),
    ),
  ),
);

1

मेरे लिए सत्य से असत्य से आइटम संपत्ति के नीचे बदलना

<item name="android:windowFullscreen">false</item>

फाइल में

android/app/src/main/res/values/styles.xml

फ़्लटर को इनपुट फ़ोकस पर सभी पृष्ठ सामग्री को ऊपर की ओर खींचें

फ़्लटर इनपुट फ़ोकस पर सभी पृष्ठ सामग्री को ऊपर की ओर खींचें


यह केवल एंड्रॉइड के लिए काम कर रहा है क्योंकि यह दिखाई देता है ...
क्रिश्चियन एक्स

1

मैं एक ही मुद्दे का सामना कर रहा था और मैंने इसे ठीक करने के लिए यादृच्छिक समाधानों की कोशिश करना शुरू कर दिया और अचानक इसे ठीक कर दिया। यहां छवि विवरण दर्ज करें

SingleChildScrollView () के भीतर मुख्य पैरेंट कंटेनर लपेटें और इसे डिवाइस की ऊँचाई यानी डिवाइस_हाइट = MediaQuery.of (संदर्भ) .size.height दें।

यह पूरे पृष्ठ को स्क्रॉल करने योग्य बना देगा लेकिन किसी भी विजेट का आकार नहीं बदलता है।


पूरी तरह से काम करना! धन्यवाद!!
गिहान सैंडारू

मैं खुशी से मदद कर सकता है !
रुद्र ठाकुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.