Skip to content

Commit 94248a0

Browse files
authored
Merge pull request #151 from koukibadr/fix#149-resolve-separator-builder-rendering
fix #149: resolve separator builder rendering issue
2 parents c2505f0 + 59325fa commit 94248a0

4 files changed

Lines changed: 79 additions & 45 deletions

File tree

example/lib/main.dart

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/material.dart';
2-
import 'package:searchable_listview/resources/arrays.dart';
32
import 'package:searchable_listview/searchable_listview.dart';
43

54
void main() {
@@ -48,6 +47,7 @@ class _ExampleAppState extends State<ExampleApp> {
4847
Actor(age: 66, name: 'Denzel', lastName: 'Washington'),
4948
Actor(age: 49, name: 'Ben', lastName: 'Affleck'),
5049
];
50+
List<Actor> filteredActors = [];
5151

5252
final Map<String, List<Actor>> mapOfActors = {
5353
'test 1': [
@@ -64,6 +64,12 @@ class _ExampleAppState extends State<ExampleApp> {
6464

6565
final TextEditingController searchTextController = TextEditingController();
6666

67+
@override
68+
void initState() {
69+
super.initState();
70+
filteredActors = actors;
71+
}
72+
6773
@override
6874
Widget build(BuildContext context) {
6975
return SizedBox(
@@ -74,7 +80,7 @@ class _ExampleAppState extends State<ExampleApp> {
7480
Expanded(
7581
child: Padding(
7682
padding: const EdgeInsets.all(15),
77-
child: renderSimpleSearchableList(),
83+
child: renderAsynchSearchableListview(),
7884
),
7985
),
8086
Align(
@@ -102,26 +108,52 @@ class _ExampleAppState extends State<ExampleApp> {
102108
return SearchableList<Actor>(
103109
textAlignVertical: TextAlignVertical.center,
104110
searchFieldHeight: 40,
105-
searchTextPosition: SearchTextPosition.bottom,
106111
lazyLoadingEnabled: false,
112+
separatorBuilder: (context, index) {
113+
return Container(
114+
height: 40,
115+
);
116+
},
107117
sortPredicate: (a, b) => a.age.compareTo(b.age),
108118
itemBuilder: (item) {
109-
return ActorItem(actor: item);
119+
int index = filteredActors.indexOf(item);
120+
if (index == 0) {
121+
return Container(
122+
color: Colors.red,
123+
height: 10,
124+
width: 300,
125+
);
126+
} else {
127+
return ActorItem(actor: filteredActors[index - 1]);
128+
}
110129
},
130+
emptyWidget: Column(
131+
children: [
132+
Container(
133+
color: Colors.red,
134+
height: 10,
135+
width: 300,
136+
),
137+
const Column(
138+
children: [Icon(Icons.error), Text('No Data found')],
139+
)
140+
],
141+
),
111142
filter: (query) {
112-
return actors
143+
filteredActors = actors
113144
.where((element) =>
114145
element.name.toLowerCase().contains(query.toLowerCase()) ||
115146
element.lastName.toLowerCase().contains(query.toLowerCase()))
116147
.toList();
148+
return filteredActors;
117149
},
118150
initialList: actors,
119151
);
120152
}
121153

122154
Widget renderSimpleSearchableList() {
123155
return SearchableList<Actor>(
124-
seperatorBuilder: (context, index) {
156+
separatorBuilder: (context, index) {
125157
return const Divider();
126158
},
127159
textStyle: const TextStyle(fontSize: 25),
@@ -196,8 +228,10 @@ class _ExampleAppState extends State<ExampleApp> {
196228
element.lastName.contains(query))
197229
.toList();
198230
},
199-
seperatorBuilder: (context, index) {
200-
return const Divider();
231+
separatorBuilder: (context, index) {
232+
return Container(
233+
height: 30,
234+
);
201235
},
202236
textStyle: const TextStyle(fontSize: 25),
203237
emptyWidget: const EmptyView(),

example/pubspec.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ packages:
55
dependency: transitive
66
description:
77
name: async
8-
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
8+
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
99
url: "https://pub.dev"
1010
source: hosted
11-
version: "2.12.0"
11+
version: "2.13.0"
1212
boolean_selector:
1313
dependency: transitive
1414
description:
@@ -53,10 +53,10 @@ packages:
5353
dependency: transitive
5454
description:
5555
name: fake_async
56-
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
56+
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
5757
url: "https://pub.dev"
5858
source: hosted
59-
version: "1.3.2"
59+
version: "1.3.3"
6060
flutter:
6161
dependency: "direct main"
6262
description: flutter
@@ -79,10 +79,10 @@ packages:
7979
dependency: transitive
8080
description:
8181
name: leak_tracker
82-
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
82+
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
8383
url: "https://pub.dev"
8484
source: hosted
85-
version: "10.0.8"
85+
version: "10.0.9"
8686
leak_tracker_flutter_testing:
8787
dependency: transitive
8888
description:
@@ -145,7 +145,7 @@ packages:
145145
path: ".."
146146
relative: true
147147
source: path
148-
version: "2.17.2"
148+
version: "2.19.0"
149149
sky_engine:
150150
dependency: transitive
151151
description: flutter
@@ -211,10 +211,10 @@ packages:
211211
dependency: transitive
212212
description:
213213
name: vm_service
214-
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
214+
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
215215
url: "https://pub.dev"
216216
source: hosted
217-
version: "14.3.1"
217+
version: "15.0.0"
218218
sdks:
219219
dart: ">=3.7.0-0 <4.0.0"
220220
flutter: ">=3.18.0-18.0.pre.54"

lib/searchable_listview.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class SearchableList<T> extends StatefulWidget {
5656
this.reverse = false,
5757
this.sortPredicate,
5858
this.sortWidget,
59-
this.seperatorBuilder,
59+
this.separatorBuilder,
6060
this.scrollController,
6161
this.closeKeyboardWhenScrolling = false,
6262
this.displaySearchIcon = true,
@@ -114,7 +114,7 @@ class SearchableList<T> extends StatefulWidget {
114114
this.itemExtent,
115115
this.listViewPadding,
116116
this.reverse = false,
117-
this.seperatorBuilder,
117+
this.separatorBuilder,
118118
this.sortPredicate,
119119
this.sortWidget,
120120
this.scrollController,
@@ -185,7 +185,7 @@ class SearchableList<T> extends StatefulWidget {
185185
this.showSearchField = true,
186186
}) : super(key: key) {
187187
searchTextController ??= TextEditingController();
188-
seperatorBuilder = null;
188+
separatorBuilder = null;
189189
isExpansionList = true;
190190
//! use itemBuiler instead of expansionTitleBuilder and expansionListBuilder
191191
itemBuilder = null;
@@ -240,7 +240,7 @@ class SearchableList<T> extends StatefulWidget {
240240
asyncListCallback = null;
241241
asyncListFilter = null;
242242
searchTextController ??= TextEditingController();
243-
seperatorBuilder = null;
243+
separatorBuilder = null;
244244
sliverScrollEffect = true;
245245
onRefresh = null;
246246
shrinkWrap = false;
@@ -361,7 +361,7 @@ class SearchableList<T> extends StatefulWidget {
361361

362362
/// Builder callback required when using [seperated] constructor
363363
/// return the Widget that will seperate all the elements inside the list
364-
late Widget Function(BuildContext context, int index)? seperatorBuilder;
364+
late Widget Function(BuildContext context, int index)? separatorBuilder;
365365

366366
/// The scroll direction of the list
367367
/// by default [Axis.vertical]
@@ -627,8 +627,8 @@ class _SearchableListState<T> extends State<SearchableList<T>> {
627627
isLazyLoadingEnabled: widget.lazyLoadingEnabled,
628628
list: list,
629629
itemBuilder: widget.itemBuilder,
630-
isListViewSeparated: widget.seperatorBuilder != null,
631-
seperatorBuilder: widget.seperatorBuilder,
630+
isListViewSeparated: widget.separatorBuilder != null,
631+
seperatorBuilder: widget.separatorBuilder,
632632
),
633633
)
634634
: ListViewRendering(
@@ -642,8 +642,8 @@ class _SearchableListState<T> extends State<SearchableList<T>> {
642642
isLazyLoadingEnabled: widget.lazyLoadingEnabled,
643643
list: list,
644644
itemBuilder: widget.itemBuilder,
645-
isListViewSeparated: widget.seperatorBuilder != null,
646-
seperatorBuilder: widget.seperatorBuilder,
645+
isListViewSeparated: widget.separatorBuilder != null,
646+
seperatorBuilder: widget.separatorBuilder,
647647
);
648648
}
649649
}

lib/widgets/list_view_rendering.dart

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,19 @@ class ListViewRendering<T> extends StatelessWidget {
3232

3333
@override
3434
Widget build(BuildContext context) {
35-
if (isLazyLoadingEnabled) {
35+
if (isListViewSeparated) {
36+
return ListView.separated(
37+
controller: scrollController,
38+
scrollDirection: scrollDirection,
39+
itemCount: list.length,
40+
physics: physics,
41+
shrinkWrap: shrinkWrap,
42+
padding: padding,
43+
reverse: reverse,
44+
itemBuilder: (context, index) => itemBuilder!(list[index]),
45+
separatorBuilder: seperatorBuilder!,
46+
);
47+
} else if (isLazyLoadingEnabled) {
3648
return ListView(
3749
physics: physics,
3850
shrinkWrap: shrinkWrap,
@@ -45,30 +57,18 @@ class ListViewRendering<T> extends StatelessWidget {
4557
return itemBuilder!(item);
4658
}).toList(),
4759
);
48-
}
49-
if (isListViewSeparated) {
50-
return ListView.separated(
51-
controller: scrollController,
52-
scrollDirection: scrollDirection,
53-
itemCount: list.length,
60+
} else {
61+
return ListView.builder(
5462
physics: physics,
5563
shrinkWrap: shrinkWrap,
64+
itemExtent: itemExtent,
5665
padding: padding,
5766
reverse: reverse,
67+
controller: scrollController,
68+
scrollDirection: scrollDirection,
69+
itemCount: list.length,
5870
itemBuilder: (context, index) => itemBuilder!(list[index]),
59-
separatorBuilder: seperatorBuilder!,
6071
);
6172
}
62-
return ListView.builder(
63-
physics: physics,
64-
shrinkWrap: shrinkWrap,
65-
itemExtent: itemExtent,
66-
padding: padding,
67-
reverse: reverse,
68-
controller: scrollController,
69-
scrollDirection: scrollDirection,
70-
itemCount: list.length,
71-
itemBuilder: (context, index) => itemBuilder!(list[index]),
72-
);
7373
}
7474
}

0 commit comments

Comments
 (0)