Skip to content

Commit 1496523

Browse files
committed
feat(ObserveModel): add displayingChildModelMap
1 parent 1d13d6f commit 1496523

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

lib/src/common/models/observe_model.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ abstract class ObserveModel {
2020
/// Stores model list for children widgets those are displaying.
2121
List<ObserveDisplayingChildModel> innerDisplayingChildModelList;
2222

23+
/// Stores model map for children widgets those are displaying.
24+
Map<int, ObserveDisplayingChildModel> innerDisplayingChildModelMap;
25+
2326
/// Stores index list for children widgets those are displaying.
2427
List<int> get displayingChildIndexList =>
2528
innerDisplayingChildModelList.map((e) => e.index).toList();
@@ -35,5 +38,6 @@ abstract class ObserveModel {
3538
required this.sliver,
3639
required this.viewport,
3740
required this.innerDisplayingChildModelList,
41+
required this.innerDisplayingChildModelMap,
3842
});
3943
}

lib/src/gridview/models/gridview_observe_model.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
import 'package:flutter/foundation.dart';
77
import 'package:flutter/rendering.dart';
88
import 'package:scrollview_observer/src/common/models/observe_model.dart';
9-
10-
import 'gridview_observe_displaying_child_model.dart';
9+
import 'package:scrollview_observer/src/gridview/models/gridview_observe_displaying_child_model.dart';
1110

1211
class GridViewObserveModel extends ObserveModel {
1312
GridViewObserveModel({
1413
required this.sliverGrid,
1514
required RenderViewportBase viewport,
1615
required this.firstGroupChildList,
1716
required this.displayingChildModelList,
17+
required this.displayingChildModelMap,
1818
required bool visible,
1919
}) : super(
2020
visible: visible,
2121
sliver: sliverGrid,
2222
viewport: viewport,
2323
innerDisplayingChildModelList: displayingChildModelList,
24+
innerDisplayingChildModelMap: displayingChildModelMap,
2425
);
2526

2627
/// The target sliverGrid.
@@ -32,19 +33,26 @@ class GridViewObserveModel extends ObserveModel {
3233
/// Stores observing model list of displaying children widgets.
3334
final List<GridViewObserveDisplayingChildModel> displayingChildModelList;
3435

36+
/// Stores observing model map of displaying children widgets.
37+
final Map<int, GridViewObserveDisplayingChildModel> displayingChildModelMap;
38+
3539
@override
3640
bool operator ==(Object other) {
3741
if (identical(this, other)) return true;
3842
if (other is GridViewObserveModel) {
3943
return listEquals(firstGroupChildList, other.firstGroupChildList) &&
40-
listEquals(displayingChildModelList, other.displayingChildModelList);
44+
listEquals(
45+
displayingChildModelList, other.displayingChildModelList) &&
46+
mapEquals(displayingChildModelMap, other.displayingChildModelMap);
4147
} else {
4248
return false;
4349
}
4450
}
4551

4652
@override
4753
int get hashCode {
48-
return firstGroupChildList.hashCode + displayingChildModelList.hashCode;
54+
return firstGroupChildList.hashCode +
55+
displayingChildModelList.hashCode +
56+
displayingChildModelMap.hashCode;
4957
}
5058
}

lib/src/listview/models/listview_observe_model.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ class ListViewObserveModel extends ObserveModel {
1515
required RenderViewportBase viewport,
1616
required this.firstChild,
1717
required this.displayingChildModelList,
18+
required this.displayingChildModelMap,
1819
required bool visible,
1920
}) : super(
2021
visible: visible,
2122
sliver: sliverList,
2223
viewport: viewport,
2324
innerDisplayingChildModelList: displayingChildModelList,
25+
innerDisplayingChildModelMap: displayingChildModelMap,
2426
);
2527

2628
/// The target sliverList.
@@ -33,19 +35,26 @@ class ListViewObserveModel extends ObserveModel {
3335
/// Stores observing model list of displaying children widgets.
3436
final List<ListViewObserveDisplayingChildModel> displayingChildModelList;
3537

38+
/// Stores observing model map of displaying children widgets.
39+
final Map<int, ListViewObserveDisplayingChildModel> displayingChildModelMap;
40+
3641
@override
3742
bool operator ==(Object other) {
3843
if (identical(this, other)) return true;
3944
if (other is ListViewObserveModel) {
4045
return firstChild == other.firstChild &&
41-
listEquals(displayingChildModelList, other.displayingChildModelList);
46+
listEquals(
47+
displayingChildModelList, other.displayingChildModelList) &&
48+
mapEquals(displayingChildModelMap, other.displayingChildModelMap);
4249
} else {
4350
return false;
4451
}
4552
}
4653

4754
@override
4855
int get hashCode {
49-
return firstChild.hashCode + displayingChildModelList.hashCode;
56+
return firstChild.hashCode +
57+
displayingChildModelList.hashCode +
58+
displayingChildModelMap.hashCode;
5059
}
5160
}

lib/src/observer_core.dart

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class ObserverCore {
3939
visible: false,
4040
firstChild: null,
4141
displayingChildModelList: [],
42+
displayingChildModelMap: {},
4243
);
4344
}
4445
final scrollDirection = _obj.constraints.axis;
@@ -90,18 +91,24 @@ class ObserverCore {
9091
visible: false,
9192
firstChild: null,
9293
displayingChildModelList: [],
94+
displayingChildModelMap: {},
9395
);
9496
}
9597

9698
if (targetFirstChild is! RenderIndexedSemantics) return null;
9799

100+
final firstDisplayingChildIndex = targetFirstChild.index;
101+
final firstDisplayingChildModel = ListViewObserveDisplayingChildModel(
102+
sliverList: _obj,
103+
viewport: viewport,
104+
index: firstDisplayingChildIndex,
105+
renderObject: targetFirstChild,
106+
);
107+
Map<int, ListViewObserveDisplayingChildModel> displayingChildModelMap = {
108+
firstDisplayingChildIndex: firstDisplayingChildModel,
109+
};
98110
List<ListViewObserveDisplayingChildModel> displayingChildModelList = [
99-
ListViewObserveDisplayingChildModel(
100-
sliverList: _obj,
101-
viewport: viewport,
102-
index: targetFirstChild.index,
103-
renderObject: targetFirstChild,
104-
),
111+
firstDisplayingChildModel,
105112
];
106113

107114
// Find the remaining children that are being displayed
@@ -123,26 +130,26 @@ class ObserverCore {
123130
displayingChild = _obj.childAfter(displayingChild);
124131
continue;
125132
}
126-
displayingChildModelList.add(ListViewObserveDisplayingChildModel(
133+
134+
final displayingChildIndex = displayingChild.index;
135+
final displayingChildModel = ListViewObserveDisplayingChildModel(
127136
sliverList: _obj,
128137
viewport: viewport,
129-
index: displayingChild.index,
138+
index: displayingChildIndex,
130139
renderObject: displayingChild,
131-
));
140+
);
141+
displayingChildModelList.add(displayingChildModel);
142+
displayingChildModelMap[displayingChildIndex] = displayingChildModel;
132143
displayingChild = _obj.childAfter(displayingChild);
133144
}
134145

135146
return ListViewObserveModel(
136147
sliverList: _obj,
137148
viewport: viewport,
138149
visible: true,
139-
firstChild: ListViewObserveDisplayingChildModel(
140-
sliverList: _obj,
141-
viewport: viewport,
142-
index: targetFirstChild.index,
143-
renderObject: targetFirstChild,
144-
),
150+
firstChild: firstDisplayingChildModel,
145151
displayingChildModelList: displayingChildModelList,
152+
displayingChildModelMap: displayingChildModelMap,
146153
);
147154
}
148155

@@ -169,6 +176,7 @@ class ObserverCore {
169176
visible: false,
170177
firstGroupChildList: [],
171178
displayingChildModelList: [],
179+
displayingChildModelMap: {},
172180
);
173181
}
174182
final scrollDirection = _obj.constraints.axis;
@@ -210,20 +218,26 @@ class ObserverCore {
210218
visible: false,
211219
firstGroupChildList: [],
212220
displayingChildModelList: [],
221+
displayingChildModelMap: {},
213222
);
214223
}
215224

216225
if (targetFirstChild is! RenderIndexedSemantics) return null;
217226
lastFirstGroupChildWidget = targetFirstChild;
218227

228+
final firstDisplayingChildIndex = targetFirstChild.index;
219229
final firstModel = GridViewObserveDisplayingChildModel(
220230
sliverGrid: _obj,
221231
viewport: viewport,
222-
index: targetFirstChild.index,
232+
index: firstDisplayingChildIndex,
223233
renderObject: targetFirstChild,
224234
);
225-
List<GridViewObserveDisplayingChildModel> firstGroupChildModelList = [];
226-
firstGroupChildModelList.add(firstModel);
235+
Map<int, GridViewObserveDisplayingChildModel> displayingChildModelMap = {
236+
firstDisplayingChildIndex: firstModel,
237+
};
238+
List<GridViewObserveDisplayingChildModel> firstGroupChildModelList = [
239+
firstModel,
240+
];
227241

228242
final showingChildrenMaxOffset =
229243
rawScrollViewOffset + _obj.constraints.remainingPaintExtent - overlap;
@@ -238,12 +252,15 @@ class ObserverCore {
238252
toNextOverPercent: toNextOverPercent,
239253
)) {
240254
if (targetChild is! RenderIndexedSemantics) break;
241-
firstGroupChildModelList.add(GridViewObserveDisplayingChildModel(
255+
final targetChildIndex = targetChild.index;
256+
final displayingChildModel = GridViewObserveDisplayingChildModel(
242257
sliverGrid: _obj,
243258
viewport: viewport,
244-
index: targetChild.index,
259+
index: targetChildIndex,
245260
renderObject: targetChild,
246-
));
261+
);
262+
firstGroupChildModelList.add(displayingChildModel);
263+
displayingChildModelMap[targetChildIndex] = displayingChildModel;
247264
lastFirstGroupChildWidget = targetChild;
248265
}
249266

@@ -268,12 +285,15 @@ class ObserverCore {
268285
if (displayingChild is! RenderIndexedSemantics) {
269286
continue;
270287
}
271-
showingChildModelList.add(GridViewObserveDisplayingChildModel(
288+
final displayingChildIndex = displayingChild.index;
289+
final displayingChildModel = GridViewObserveDisplayingChildModel(
272290
sliverGrid: _obj,
273291
viewport: viewport,
274-
index: displayingChild.index,
292+
index: displayingChildIndex,
275293
renderObject: displayingChild,
276-
));
294+
);
295+
showingChildModelList.add(displayingChildModel);
296+
displayingChildModelMap[displayingChildIndex] = displayingChildModel;
277297
}
278298
displayingChild = _obj.childAfter(displayingChild);
279299
}
@@ -284,6 +304,7 @@ class ObserverCore {
284304
visible: true,
285305
firstGroupChildList: firstGroupChildModelList,
286306
displayingChildModelList: showingChildModelList,
307+
displayingChildModelMap: displayingChildModelMap,
287308
);
288309
}
289310
}

0 commit comments

Comments
 (0)