Khung nhìn dọc được cung cấp chiều cao không giới hạn


123

Đây là mã của tôi:

  @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()
            );
          }),)]
      )
    );
  }

Ngoại lệ như sau:

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)

bạn cũng có thể sử dụng Vùng chứa đơn giản thay vì Cột (chủ yếu cho nhiều tiện ích con.)
Napoléan

Tạo widget (BuildContext context) {return new Material (màu: Colors.deepPurpleAccent, con: new Container (alignment: Alignment.center, child: new GridView.count (crossAxisCount: _column, children: new List.generate (_row * _column, (index) {return new Center (con: new CellWidget ());})),)); --Mã này cũng không giúp được @Napolean
pallav bohara

hãy thử thêm mainAxisSize thành max trong Cột và xem nó có hữu ích không.
pblead 26

Nhìn vào cái này nếu nó hoạt động, vì tôi nghĩ nó nên được thực hiện: stackoverflow.com/a/61708887/10563627
Paresh Mangukiya

Câu trả lời:



156

Điều này thường xảy ra khi bạn cố gắng sử dụng a ListView/ GridViewbên trong a Column, có nhiều cách để giải quyết nó, tôi liệt kê một vài cách ở đây.

  1. Quấn ListViewvàoExpanded

    Column(
      children: <Widget>[
        Expanded( // wrap in Expanded
          child: ListView(...),
        ),
      ],
    )
    
  2. Bọc ListViewtrong SizedBoxvà đưa ra một bị chặnheight

    Column(
      children: <Widget>[
        SizedBox(
          height: 400, // fixed height
          child: ListView(...),
        ),
      ],
    )
    
  3. Sử dụng shrinkWrap: truetrong ListView.

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

5
Đã thử điều này với chế độ xem danh sách dọc chứa chế độ xem danh sách ngang. Chỉ có phương pháp hộp kích thước sẽ hoạt động nhưng nó quá quy định về chiều cao. Làm thế nào khác để làm điều này?
fractal

shrinkWrap: trueđã hoàn thành công việc
Ali80

1
Đây là câu trả lời.
vishalknishad

Đây là những gì tôi đang tìm kiếm. Bất kỳ cơ hội nào bạn có thể thêm ưu và nhược điểm của từng lựa chọn?
emragins

Điều này đã giúp tôi rất nhiều. Cảm ơn @CopsOnRoad
Kobby Giảm giá

30

Vì vậy, mọi người đã đăng câu trả lời nhưng không ai quan tâm giải thích tại sao: Tôi sẽ sao chép tài liệu về shrinkWrap:

Liệu mức độ của chế độ xem cuộn trong [scrollDirection] có nên được xác định bởi nội dung được xem hay không.

Nếu chế độ xem cuộn không thu nhỏ phần bọc, thì chế độ xem cuộn sẽ mở rộng đến kích thước tối đa cho phép trong [scrollDirection]. Nếu dạng xem cuộn có các ràng buộc không bị ràng buộc trong [scrollDirection], thì [scrollWrap] phải là true.

Thu nhỏ gói nội dung của chế độ xem cuộn đắt hơn đáng kể so với việc mở rộng đến kích thước tối đa cho phép vì nội dung có thể mở rộng và co lại trong quá trình cuộn, có nghĩa là kích thước của chế độ xem cuộn cần được tính toán lại bất cứ khi nào vị trí cuộn thay đổi.

Mặc định là false.

Vì vậy, lấy từ vựng của các tài liệu, điều đang xảy ra ở đây là chúng ta ListViewđang ở trong một tình huống bị ràng buộc không giới hạn (theo hướng mà chúng ta đang cuộn), do đó ListViewsẽ phàn nàn rằng:

... một khung nhìn dọc được cung cấp một lượng không gian thẳng đứng không giới hạn để mở rộng.

Chỉ cần đặt shrinkWrapthành truesẽ đảm bảo rằng nó bao bọc kích thước được xác định bởi nội dung. Một mã mẫu để minh họa:

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

Đó là những gì đang xảy ra với mã của bạn, tuy nhiên, đề xuất @ Rémi là tốt nhất cho trường hợp này, sử dụng Alignthay vì a Column.


27

đặt chế độ xem lưới bên trong tiện ích Linh hoạt hoặc Mở rộng

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
Đã mở rộng và thêm shrinkWrap: truevào GridView.
Wilmer

13

Tình huống này thường xảy ra khi một tiện ích con có thể cuộn được lồng bên trong một tiện ích con có thể cuộn khác.

Trong trường hợp của tôi, tôi sử dụng GridView bên trong Cột và lỗi đó xảy ra.

GridView widget có shrinkWraptham số thuộc tính / được đặt tên, để đặt nó, truevấn đề của tôi đã được khắc phục.

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

9

Không sử dụng Columncho căn chỉnh con đơn lẻ. Sử dụng Alignthay thế.

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

Nó mặc dù đã giải quyết được lỗi của tôi nhưng vẫn không thể căn giữa GridView của mình theo chiều dọc. Nó hiển thị giống như trước đây. Đã thử tất cả các cờ cho Alignment. * Tôi còn thiếu gì?
pallav bohara

5

Mặc dù shrinkWraplàm điều đó, nhưng bạn không thể cuộn vào ListView.

Nếu bạn muốn có chức năng cuộn, bạn có thể thêm thuộc physicstính:

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

3

điều này xảy ra bởi vì ListView/GridViewtiện ích con không có cha mẹ để lấy kích thước của nó, vì vậy chiều cao của nó là vô hạn và sự thay đổi đó không biết chiều cao của ListView và không thể hiển thị.

  1. Giải pháp một: chiều cao cố định

    Gói nó trực tiếp với Containerhoặc SizedBoxđể viết chiều cao chết.

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

Cái này cũng được, nhưng nếu chiều cao cần thích ứng, nếu ghi thì không được.

  1. Giải pháp hai: co lại

    Hãy thử shrinkWrap: truevới physics: ScrollPhysics()để cuộn

    shrinkWrap: truehơi giống trong android wrap_content.

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

Tuy nhiên, sau khi biên dịch, bạn sẽ thấy một cảnh báo dài màu vàng ở cuối trang.

Vì vậy, vẫn không thể

  1. Giải pháp ba: Mở rộng hoặc Linh hoạt

    Flexible Là một cách bố trí linh hoạt theo kiểu vẩy, tương đương với LinearLayout trong android.

    Có một trong Linh hoạt flexThuộc tính, bằng layout_weight, chiếm tất cả không gian còn lại.

    Vì vậy, chúng ta có thể bọc ListView bằng Linh hoạt.

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

Câu trả lời này dựa trên: Khung nhìn dọc được cung cấp chiều cao không giới hạn.


Tất cả chúng đều đã có trong giải pháp Paresh của tôi. Tôi hy vọng bạn đã thêm một cái gì đó mới.
CopsOnRoad

Vâng, tôi biết, nhưng tôi đã cố gắng giải thích giải pháp đó ngay cả khi tôi nghĩ rằng tôi cũng nên đề cập đến bạn như một tín dụng
Paresh Mangukiya

1

kiểm tra cái này cho lần xem danh sách thứ hai

ListView.builder(
            physics: NeverScrollableScrollPhysics(),

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.