Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 787 Vote(s) - 3.5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Vertical viewport was given unbounded height

#11
Two ways which we can solve the above issues

**1. Using Flexible Widget,**

The `Flexible` widget can be used inside Row, Column, and Flex.The flexibility to expand to fill the available space in the main axis (e.g., horizontally for a [Row] or vertically for a [Column])

But, remember, unlike `Expanded`, The `Flexible` widget does not require the child to fill available space. So, it's always better to use `Flexible`.


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

**2. Using shrinkWrap: true**

Using `shrinkWrap` as true, we tell the Listview to render its List to available space, not take below remaining screen.

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


----------


Also, `physics` attribute can be used to allow/disallow scrolling of `Listview`

**Stop Scrolling**



ListView(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
),


**Allow Scrolling**

ListView(
shrinkWrap: true,
physics: ScrollPhysics(),
),

Reply

#12
There are a lot of answer but each one have its own limitation. everyone is saying use **shrinkWrap: true**. Yes you should use it but the effect of these code is when you will scroll the list, it will automatically move to top item, means scroll back to top.
So perfect solution is use shrinkwrap with **physics** then only the list will be able to scroll smoothly.


shrinkWrap: true, //
physics: ScrollPhysics(), // both line is mandatory

If you want to see other example of Listview.builder with column as a child and list can be scroll vertically then you can [see the example here][1] - arrange multiple text in a vertical list.


[1]:

[To see links please register here]

Reply

#13
Just want to add my solution that worked in my case where I have vertical list view together with other buttons and texts on the same screen:

Flexible(
child:
ListView.builder(
// make sure to add the following lines:
shrinkWrap: true,
physics: ScrollPhysics(),
// the rest of your list view code
) // ListView
) // Flexible

This solution works well particularly when you have other widgets on the SAME SCREEN. In this particular case, "*Expand*" or "*Flexible*" alone will not work.
Reply

#14
Also meet this error, because the code like this
```dart
return Container(
child: Column(
children: [
ListView.separated(
itemBuilder: (context, index) {
return CircleManagerSettingItem(widget.membersInfo[index]);
},
separatorBuilder: (_, index) => DD(
height: 1,
paddingLeft: 10,
paddingRight: 10,
),
itemCount: (widget.membersInfo.length)),
],
),
);
```
remove the `Column` inside the `Container` then Ok.
Reply

#15
in my case, I had to wrap the ListView inside a Container and give this container a specific Height
Reply

#16
# Cause of Viewport Exception

`GridView` / `ListView` **grow** until *constraints* (limits) stop this expansion & then scroll to view items beyond that size.

But `Column` lays out its children *without* any constraints, **completely ignoring its own size and screen size**. There is infinite space inside of `Column`.

`Viewport was given unbounded height` exception occurs because `Grid/ListView` expands to infinity inside a `Column`.

`Flexible/Expanded` exist to give `Column` children constraints based `Column's` size. (These two widgets cannot be used anywhere else, except inside `Row` and `Column`.)

Inside a `Flexible/Expanded` widget in `Column`, `Grid/ListView` only uses remaining space not taken by other, non-flexible widgets, which get laid out first. (See bottom for layout phases info.)

# `shrinkWrap` is not a good solution

Using `shrinkWrap: true` on `ListView` inside a `Column` isn't really helpful as:
- `ListView` no longer scrolls
- `ListView` can still overflow

A `ListView` tall enough to show all of its items, will not scroll. Arguably defeats the purpose of using a `ScrollView` widget (parent class of `ListView`).


In `Column` layout phase 1 (see bottom for explanation of layout phases), `ListView` can be any height it wants (there are no constraints).
A `ListView` with `shrinkWrap:true` will grow in height to show all its items.
With enough items, a `shrinkWrapped` `ListView` will grow & grow (it never scrolls) to overflow whatever `Column` is inside, be it screen or other tighter constraint.


##### Shouldn't `shrinkWrap` just make `ListView` only as big as its items *OR* remaining space (up to screen height), and then scroll?

That would make intuitive sense, but inside a `Column` in phase 1 **layout is done in *unbounded space***.

So, remaining space is unlimited/infinite. A max height is never reached. `shrinkWrap:true` just keeps growing `Column` height as items are added until overflowing the screen (or other smaller constraint).

#### Example `shrinkWrap:true` Overflow

Here's an example of adding items to a shrinkwrapped `ListView` in a `Column` until its height is taller than the screen, creating an overflow warning area:

(just keep pressing the **+** sign Floating Action Button)

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

class ColumnListViewPage extends StatefulWidget {
@override
_ColumnListViewPageState createState() => _ColumnListViewPageState();
}

class _ColumnListViewPageState extends State<ColumnListViewPage> {
int _count = 0;

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Column & ListView'),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
setState(() {
_count++;
});
},
),
body: SafeArea(
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.red)
),
/// // without center, Column will be as narrow as possible
alignment: Alignment.center,
/// Column is forced (constrained) to match screen dimension,
child: Column(
children: [
Text('Inner (Nested) Column'),
ListView.separated( // ← should be wrapped in Expanded
itemCount: _count,
separatorBuilder: (context, index) => const Divider(),
itemBuilder: (context, index) => Padding(
padding: const EdgeInsets.symmetric(vertical: 38.0),
child: Text('Row $index'),
),
shrinkWrap: true, // should be removed
)
],
),
),
),
);
}
}
```

##### For `GridView/ListView` in a `Column`, wrapping within `Expanded` or `Flexible` is likely the safest solution.

---

## Expanded / Flexible

`Expanded` and `Flexible` can only be used inside `Column` (and its siblings like `Row`, etc.).

They must be used as immediate children of `Column`. We can't "nest" `Expanded`/`Flexible` in `SizedBox` or other widgets. Only directly under `Column` as immediate children.

Inside `Column`, placing `ListView/GridView` in `Expanded` or `Flexible` ensures it will use only available space, rather than infinite space.

```
Column
→ Expanded
→ ListView
```

`ListView/GridView` inside `Expanded/Flexible` in a `Column` doesn't need `shrinkWrap` because it is constrained (given a max. height) by the `Expanded/Flexible` widget. So when that constrained/defined height is used up, `ListView/GridView` will stop growing & begin scrolling.

---

# Column Layout Phases

`Column` lays out children in 2 phases:
- 1st without constraints (unbounded space)
- 2nd with remaining space based on `Column's` parent

### Phase 1
Any `Column` child **not** inside `Flexible` or `Expanded` will be laid out in phase 1, in infinite, limitless space *completely ignoring screen size*.

Widgets that need a vertical boundary/constraint to limit their growth (e.g. `ListView`) will cause a `Vertical viewport was given unbounded height` exception in phase 1 as there *are no vertical bounds in unbounded space*.

Most widgets have intrinsic size. `Text` for example, is only as high as its content & font size/style. It doesn't try to grow to fill a space. Defined-height widgets play well in Phase 1 of `Column` layout.

### Phase 2
Any widget that grows to fill bounds, should be put in a `Flexible` or `Expanded` for Phase 2 layout.

Phase 2 calculates `Column's` remaining space from its parent constraints ***minus*** space used in Phase 1. This remaining space is provided to Phase 2 children as constraints.

`ListView` for example, will only grow to use remaining space & stop, avoiding viewport exceptions.


[More info on `Column` layout algorithm and how `Expanded` works within it][1].


[1]:

[To see links please register here]

Reply

#17
I have made a custom function to solve your problem.
You can directly use this function in your code base:

Widget horizontalListView(height, width, color, child, margin) {
return Column(
children: [
SizedBox(
height: 200,
child: ListView.builder(
itemCount: 10,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemBuilder: (context,index) {
return Container(
height: height,
width: width,
margin: EdgeInsets.all(margin),
color: color,
child: child
);
}
),
),
],
);
})

P.S. Sorry for bad alignment of code.
Reply

#18
Don't use `Column` for single child alignment. Use `Align` instead.

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

#19
put grid view inside `Flexible` or `Expanded` widget

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

#20
I faced this problem because I wanted to display a `GridView` inside a `ListView`, and the solution was by adding the following not only in the `ListView` but also in the `GridView` as well:

1. `shrinkwrap: true`
2. `scrollDirection: Axis.vertical`

Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through