ऊर्ध्वाधर व्यूपोर्ट को निर्बाध ऊंचाई दी गई थी


131

यह मेरा कोड है:

  @override
  Widget build(BuildContext context) {
    return new Material(
      color: Colors.deepPurpleAccent,
      child: new Column(
       mainAxisAlignment: MainAxisAlignment.center,
          children:<Widget>[new GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
            return new Center(
                child: new CellWidget()
            );
          }),)]
      )
    );
  }

अपवाद निम्नानुसार है:

I/flutter ( 9925): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 9925): The following assertion was thrown during performResize():
I/flutter ( 9925): Vertical viewport was given unbounded height.
I/flutter ( 9925): Viewports expand in the scrolling direction to fill their container.In this case, a vertical
I/flutter ( 9925): viewport was given an unlimited amount of vertical space in which to expand. This situation
I/flutter ( 9925): typically happens when a scrollable widget is nested inside another scrollable widget.
I/flutter ( 9925): If this widget is always nested in a scrollable widget there is no need to use a viewport because
I/flutter ( 9925): there will always be enough vertical space for the children. In this case, consider using a Column
I/flutter ( 9925): instead. Otherwise, consider using the "shrinkWrap" property (or a ShrinkWrappingViewport) to size
I/flutter ( 9925): the height of the viewport to the sum of the heights of its children.
I/flutter ( 9925): 
I/flutter ( 9925): When the exception was thrown, this was the stack:
I/flutter ( 9925): #0      RenderViewport.performResize.<anonymous closure> (package:flutter/src/rendering/viewport.dart:827:15)
I/flutter ( 9925): #1      RenderViewport.performResize (package:flutter/src/rendering/viewport.dart:880:6)
I/flutter ( 9925): #2      RenderObject.layout (package:flutter/src/rendering/object.dart:1555:9)

आप कॉलम के बजाय साधारण कंटेनर का भी उपयोग कर सकते हैं (मुख्यतः एक से अधिक बच्चों के विजेट के लिए।)
नेपोलियन

विजेट बिल्ड (BuildContext संदर्भ) {नई सामग्री लौटाएं (रंग: Colors.deepPurpleAccent, बाल: नया कंटेनर (संरेखण: संरेखण। किराए पर लेना, बच्चा: नया GridView.count (crossAxisount: _column), बच्चे: नई List.generate (_row * _column)। (इंडेक्स) {नया केंद्र लौटाएं (बच्चा: नया सेलविजेट ();})),)); - यह कोड भी @Napolean
पल्लव बोहरा

कॉलम के तहत अधिकतम करने के लिए mainAxisSize को जोड़ने का प्रयास करें और देखें कि क्या यह मदद करता है।
pblead26

इसे देखें यदि यह काम करता है, क्योंकि मुझे लगता है कि यह किया जाना चाहिए: stackoverflow.com/a/61708887/10563627
परेश मंगुक्किया

जवाबों:


262

इस दो पंक्तियों को जोड़ना

ListView.builder(
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
...

8
धन्यवाद, बस एक छोटी सी सलाह आप इसे स्क्रॉल-सक्षम करने के लिए लचीले द्वारा ListView को घेर सकते हैं
Shady Mohamed Sherif


164

यह आम तौर पर होता है जब आप एक इस्तेमाल करने की कोशिश ListView/ GridViewएक के अंदर Column, वहाँ इसे सुलझाने के कई तरीके हैं, मैं यहाँ कुछ लिस्टिंग कर रहा हूँ।

  1. लपेटें ListViewमेंExpanded

    Column(
      children: <Widget>[
        Expanded( // wrap in Expanded
          child: ListView(...),
        ),
      ],
    )
    
  2. लपेटें ListViewमें SizedBoxऔर दे एक घिरेheight

    Column(
      children: <Widget>[
        SizedBox(
          height: 400, // fixed height
          child: ListView(...),
        ),
      ],
    )
    
  3. का प्रयोग करें shrinkWrap: trueमें ListView

    Column(
      children: <Widget>[
        ListView(
          shrinkWrap: true, // use this
        ),
      ],
    )
    

5
एक ऊर्ध्वाधर सूची के साथ एक क्षैतिज सूची में शामिल होने की कोशिश की। केवल आकार-प्रकार की विधि काम करेगी, लेकिन इसकी ऊंचाई पर भी निर्धारित है। इसे और कैसे करें?
भग्न

1
shrinkWrap: trueकाम किया
अली 80

1
यह उत्तर है।
१०:१६ पर विशालाख्यान

यह वही है जिसे मैं देख रहा था। किसी भी मौका आप प्रत्येक विकल्प के पेशेवरों और विपक्षों को जोड़ सकते हैं?
एमरजिन्स 0

इससे मुझे बहुत मदद मिली। धन्यवाद @CopsOnRoad
डिस्काउंट

34

तो, हर कोई उत्तर पोस्ट लेकिन कोई भी समझाने के लिए क्यों परवाह: मैं के बारे में दस्तावेज़ की प्रतिलिपि बनाएंगे shrinkWrap:

क्या [स्क्रॉलडायरेक्शन] में स्क्रॉल दृश्य की सीमा को देखी जा रही सामग्री द्वारा निर्धारित किया जाना चाहिए।

यदि स्क्रॉल दृश्य लपेट को छोटा नहीं करता है, तो स्क्रॉल दृश्य अधिकतम स्क्रॉल आकार [स्क्रॉलडायरेक्शन] में विस्तारित हो जाएगा। यदि स्क्रॉल दृश्य ने [स्क्रॉलडायरेनिशन] में अनबाउंड बाधाएँ दी हैं, तो [छोटा होना] सच होना चाहिए।

स्क्रॉल दृश्य की सामग्री को लपेटते हुए सिकोड़ें अधिकतम अनुमत आकार में विस्तार करने की तुलना में बहुत अधिक महंगा है क्योंकि सामग्री स्क्रॉल के दौरान विस्तार और अनुबंध कर सकती है, जिसका अर्थ है कि स्क्रॉल स्थिति में परिवर्तन होने पर स्क्रॉल दृश्य के आकार को फिर से विभाजित करने की आवश्यकता होती है।

के लिए चूक false

इसलिए, डॉक्स की शब्दावली को लेते हुए, यहां जो कुछ भी हो रहा है, वह यह है कि हमारी ListViewस्थिति असमान बाधाओं की स्थिति में है (जिस दिशा में हम स्क्रॉल कर रहे हैं), इस प्रकार ListViewशिकायत करेंगे कि:

... एक ऊर्ध्वाधर व्यूपोर्ट को एक असीमित मात्रा में ऊर्ध्वाधर स्थान दिया गया था जिसमें विस्तार करना था।

बस यह निर्धारित shrinkWrapकरने के trueलिए कि यह सामग्री द्वारा परिभाषित अपने आकार को लपेटता है। उदाहरण के लिए एक नमूना कोड:

// ...
  ListView(
    // Says to the `ListView` that it must wrap its
    // height (if it's vertical) and width (if it's horizontal).
    shrinkWrap: true,
  ),
// ...

फिर भी, आपके कोड के साथ क्या हो रहा है, फिर भी, @ Rémi सुझाव इस मामले के लिए सबसे अच्छा है, Alignबजाय a का उपयोग करते हुए Column


28

लचीले या विस्तारित विजेट के अंदर ग्रिड दृश्य डालें

return new Material(
    color: Colors.deepPurpleAccent,
    child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children:<Widget>[
         Flexible(
          child:  GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
          return new Center(
             child: new CellWidget(),
          );
        }),))]
    )
);

1
विस्तारित और shrinkWrap: trueGridView में जोड़ें ।
विल्मर

14

यह स्थिति आमतौर पर तब होती है जब एक स्क्रॉल करने योग्य विजेट किसी अन्य स्क्रॉल करने योग्य विजेट के अंदर होता है।

मेरे मामले में मैं कॉलम के अंदर ग्रिड व्यू का उपयोग करता हूं और वह त्रुटि फेंकता है।

GridView विजेट में shrinkWrapसंपत्ति / नामित पैरामीटर है, इसे सेट करने के लिए trueमेरी समस्या ठीक हो गई है।

GridView.count(
  shrinkWrap: true,
  // rest of code
)

10

Columnएकल बच्चे संरेखण के लिए उपयोग न करें । Alignइसके बजाय उपयोग करें ।

    new Align(
      alignment: Alignment.topCenter,
      child: new GridView(),
    )

हालांकि इससे मेरी त्रुटि हल हो गई लेकिन फिर भी, मैं अपने GridView को लंबवत रूप से केन्द्रित नहीं कर पा रहा हूँ। यह पहले जैसा ही दिखाता है। संरेखण के लिए सभी झंडों को आज़माया। * मैं क्या याद कर रहा हूँ?
पल्लव बोहरा

6

हालाँकि shrinkWrapबात यह है, लेकिन आप इसमें स्क्रॉल नहीं कर सकते ListView

यदि आप स्क्रॉलिंग कार्यक्षमता चाहते हैं, तो आप physicsसंपत्ति जोड़ सकते हैं:

ListView.builder(
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
    physics: ScrollPhysics(),
...

5

यह उत्तर @CopsOnRoad के उत्तर पर आधारित है

ऐसा इसलिए होता है क्योंकि ListView/GridViewविजेट का आकार लेने के लिए कोई अभिभावक नहीं है, इसलिए इसकी ऊंचाई अनंत है और यह स्पंदन लिस्ट व्यू की ऊंचाई को नहीं जानता है और न ही प्रस्तुत कर सकता है।

  1. समाधान एक: निश्चित ऊंचाई

    इसे सीधे लपेटें Containerया SizedBoxमृत ऊंचाई लिखने के लिए।

    Column(
      children: <Widget>[
        SizedBox(
         height: 400, // fixed height
        child: ListView(...),
       ),
     ],
    )
    

यह ठीक है, लेकिन अगर ऊंचाई को अनुकूल करने की आवश्यकता है, तो आप इसे लिखने पर काम नहीं करेंगे।

  1. समाधान दो: छोटा: सच

    स्क्रॉल shrinkWrap: trueकरने के physics: ScrollPhysics()लिए प्रयास करें

    shrinkWrap: trueAndroid की तरह एक सा है wrap_content

    ListView.builder(
       scrollDirection: Axis.vertical,
       shrinkWrap: true,
       physics: ScrollPhysics()
    ...
    

हालांकि, संकलन के बाद, आपको पृष्ठ के निचले भाग में एक लंबी पीली चेतावनी मिलेगी।

तो अभी भी नहीं कर सकता

  1. समाधान तीन: विस्तारित या लचीला

    Flexible Android में LinearLayout के बराबर, स्पंदन में एक लचीला लेआउट है।

    फ्लेक्सिबल में एक है flex। यह विशेषता, लेआउट_वेट के बराबर है, शेष सभी जगह लेती है।

    इसलिए, हम सूची दृश्य को लचीले के साथ लपेट सकते हैं।

    Column(
      children: <Widget>[
        Expanded( 
          child: ListView(...),
        ),
      ],
    )
    

यह उत्तर आधारित है: ऊर्ध्वाधर व्यूपोर्ट को निर्बाध ऊंचाई दी गई थी।


वे सभी पहले से ही मेरे समाधान परेश में शामिल हैं। मुझे आशा है कि आपने कुछ नया जोड़ा होगा।
कोप्सऑनरॉड

हां मुझे पता है, लेकिन मैंने उस समाधान को समझाने की कोशिश की है, यहां तक ​​कि मुझे भी लगता है कि मुझे भी आपको एक क्रेडिट के रूप में उल्लेख करना चाहिए
परेश मंगुक्किया

1

दूसरी सूची के लिए इस एक का परीक्षण करें

ListView.builder(
            physics: NeverScrollableScrollPhysics(),

0

एक विजेट है जिसे सेंटर कहा जाता है। आपको यह हासिल करने में मदद करनी चाहिए कि आप क्या करना चाहते हैं (इसे लंबवत रूप से केन्द्रित करें)। केंद्र विजेट के लिए आधिकारिक प्रलेखन

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