'Getting Incorrect use of ParentDataWidget error when I use ListView
In this part of my application I have ListView
, when I run app I get this error and I can't resolve that:
Scaffold(
body: Directionality(
textDirection: TextDirection.rtl,
child: Container(
child: StreamBuilder(
stream: globals.database.ticketsDao.getTicketsStream(),
builder: (BuildContext context, AsyncSnapshot<List<Tickets>> snapshot) {
if (snapshot.hasData) {
return Column(
children: <Widget>[
Expanded(
child: ListView.separated(
itemBuilder: (context, index) {
return ListTile(
title: Flexible(
child: Text(
snapshot.data[index].subject,
style: Theme.of(context).textTheme.caption.copyWith(fontFamily: 'IranSansBold'),
),
),
subtitle: Text(
snapshot.data[index].description,
style: Theme.of(context).textTheme.caption.copyWith(fontFamily: 'IranSansLight'),
),
);
},
separatorBuilder: (context, index) {
return Divider();
},
itemCount: snapshot.data.length),
),
],
);
} else {
return Container(
child: Center(
child: Text(
Strings.notAnyTickets,),
),
));
}
},
),
),
));
error:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building DefaultTextStyle(debugLabel:
((englishLike subhead 2014).merge(blackMountainView
subhead)).copyWith, inherit: false, color: Color(0xdd000000), family:
Roboto, size: 16.0, weight: 400, baseline: alphabetic, decoration:
TextDecoration.none, softWrap: wrapping at box width, overflow:
clip): Incorrect use of ParentDataWidget.
Flexible widgets must be
placed directly inside Flex widgets. Flexible(no depth, flex: 1,
dirty) has a Flex ancestor, but there are other widgets between them:
- _ListTile
- Padding(padding: EdgeInsets(16.0, 0.0, 16.0, 0.0))
- Semantics(container: false, properties: SemanticsProperties, selected: false, label: null, value: null, hint: null, hintOverrides:
null)
- Listener(listeners: [down], behavior: opaque)
- _GestureSemantics
- Listener(listeners: <none behavior: translucent)
- RepaintBoundary
- IndexedSemantics(index: 0)
- KeepAlive(keepAlive: false)
- SliverList(delegate: SliverChildBuilderDelegate#6802e(estimated child count: 19))
- SliverPadding(padding: EdgeInsets(0.0, 0.0, 0.0, 50.0))
- Viewport(axisDirection: down, anchor: 0.0, offset: ScrollPositionWithSingleContext#c95ba(offset:
0.0, range: null..null, viewport: 335.0, ScrollableState, AlwaysScrollableScrollPhysics - ClampingScrollPhysics,
IdleScrollActivity#05a39, ScrollDirection.idle))
- IgnorePointer-[GlobalKey#a3d1a](ignoring: false, ignoringSemantics: false)
- Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null, hintOverrides: null)
- Listener(listeners: [down], behavior: opaque)
- _GestureSemantics
- Listener(listeners: [signal], behavior: deferToChild)
- _ScrollSemantics-[GlobalKey#7cd1b]
- RepaintBoundary
- CustomPaint
- RepaintBoundary
- Expanded(flex: 1) These widgets cannot come between a Flexible and its Flex. The ownership chain for the parent of the offending
Flexible was: DefaultTextStyle ← AnimatedDefaultTextStyle ←
_ListTile ← MediaQuery ← Padding ← SafeArea ← Semantics ← Listener ← _GestureSemantics ← RawGestureDetector ← ⋯
Solution 1:[1]
Gives this error because A Flexible
widget must be a descendant of a Row
, Column
, or Flex
,
Using a Flexible
widget gives a child of a Row
, Column
, or 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
)
fixing the above issue there is two way,
1: is to move the Flexible
widget inside a flex
widget. Example below
ListView.separated(
itemBuilder: (context, index) {
return Container(
height: 50,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Flexible(child: Text('Title')),
Flexible(child: Text("Sub Title"))
],
),
);
},
separatorBuilder: (context, index) {
return Divider();
},
itemCount: snapshot.data.length)
2:Remove the Flexible
widget
ListTile(
title: Text(
snapshot.data[index].firstAndLastName,
style: Theme.of(context).textTheme.caption.copyWith(fontFamily: 'IranSansBold'),
),
subtitle: Text(
snapshot.data[index].firstAndLastName,
style: Theme.of(context).textTheme.caption.copyWith(fontFamily:
'IranSansLight'),
),
);
Solution 2:[2]
Flexible Widgets must be the direct child of an Expanded or Flex Widget.
In your case, you are using Flexible as a part of a ListTile widget, which is not a suitable parent.
Flexible widgets must be placed directly inside Flex widgets.
Flexible has a Flex ancestor, but there are other widgets between them: - _ListTile
Solution 3:[3]
Flexible
and Expanded
can have row
, column
or flex
as child, but not ListView
related widgets.
If you still want the same feel of expanded properties in your widgets, use ConstrainedBox
Ex:
ConstrainedBox(
constraints: BoxConstraints(minHeight: 50, maxHeight: 500),
child: ListView.separated(...),
)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Paresh Mangukiya |
Solution 2 | Community |
Solution 3 | Sanjay Chakrapani |