Skip to content

Commit a8c2ffa

Browse files
committed
Better fix for the issue #23
1 parent 7c1e17e commit a8c2ffa

File tree

5 files changed

+87
-134
lines changed

5 files changed

+87
-134
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.2.7
2+
### Fixed
3+
* Better fix for the bug where items are built only once.
4+
15
## 0.2.6
26
### Fixed
37
* Fix a bug where items are built only once.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ In the `pubspec.yaml` of your flutter project, add the following dependency:
2828
```yaml
2929
dependencies:
3030
...
31-
flutter_staggered_grid_view: "^0.2.6"
31+
flutter_staggered_grid_view: "^0.2.7"
3232
```
3333
3434
In your library add the following import:

example/lib/main_issue_21.dart

Lines changed: 68 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,89 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
33

4-
class DeviceTypeList {
5-
String deviceTypeName = 'test';
6-
}
7-
8-
class DeviceTypeItem extends StatefulWidget {
9-
final List<DeviceTypeList> deviceTypes;
10-
final Function onSelected;
11-
12-
DeviceTypeItem(this.deviceTypes, this.onSelected);
4+
void main() => runApp(MyApp());
135

6+
class MyApp extends StatelessWidget {
147
@override
15-
_DeviceTypeItemState createState() => _DeviceTypeItemState();
8+
Widget build(BuildContext context) {
9+
return MaterialApp(
10+
title: 'StaggeredGridView Demo',
11+
theme: ThemeData(
12+
primarySwatch: Colors.blue,
13+
),
14+
home: MyScreen(),
15+
);
16+
}
1617
}
1718

18-
class _DeviceTypeItemState extends State<DeviceTypeItem> {
19-
int _selectIndex = -1;
19+
class MyScreen extends StatefulWidget {
20+
@override
21+
_MyScreenState createState() => new _MyScreenState();
22+
}
2023

21-
_DeviceTypeItemState();
24+
class _MyScreenState extends State<MyScreen> {
25+
int _count = 0;
2226

23-
_selectDevice(int index) {
24-
setState(() {
25-
_selectIndex = index;
26-
});
27-
// onSelected(deviceTypes[_selectIndex].deviceTypeName);
27+
@override
28+
Widget build(BuildContext context) {
29+
return Scaffold(
30+
body: StaggeredTest(_count, _count),
31+
floatingActionButton: FloatingActionButton(
32+
child: Icon(Icons.add),
33+
onPressed: () {
34+
setState(() {
35+
_count++;
36+
});
37+
},
38+
),
39+
);
2840
}
41+
}
2942

30-
_tmpData() {
31-
return List.generate(
32-
10,
33-
(int index) => GestureDetector(
34-
child: Container(
35-
child: Text(widget.deviceTypes[0].deviceTypeName),
36-
color: _selectIndex == index ? Colors.blue : Colors.brown,
37-
padding: EdgeInsets.only(top: 4, bottom: 4),
38-
alignment: Alignment.center,
39-
),
40-
onTap: () => _selectDevice(index),
41-
));
42-
}
43+
class GridTest extends StatelessWidget {
44+
GridTest(this.count, this.value);
45+
final int count;
46+
final int value;
4347

4448
@override
4549
Widget build(BuildContext context) {
46-
return Container(
47-
padding: EdgeInsets.all(12),
48-
// child: GridView.count(
49-
// crossAxisCount: 3,
50-
// children: _tmpData(),
51-
// shrinkWrap: true,
52-
// ),
53-
54-
child: StaggeredGridView.count(
50+
return GridView.builder(
51+
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
5552
crossAxisCount: 3,
56-
children: _tmpData(),
57-
staggeredTiles: List.generate(10, (int index) => StaggeredTile.fit(1)),
58-
shrinkWrap: true,
53+
crossAxisSpacing: 2,
54+
mainAxisSpacing: 2,
5955
),
56+
itemCount: count,
57+
itemBuilder: (context, index) {
58+
return Container(
59+
color: Colors.blue,
60+
child: Text('$value'),
61+
);
62+
},
6063
);
6164
}
6265
}
6366

64-
// import 'package:flutter/material.dart';
65-
// import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
66-
67-
// void main() => runApp(MyApp());
68-
69-
// class MyApp extends StatelessWidget {
70-
// @override
71-
// Widget build(BuildContext context) {
72-
// return MaterialApp(
73-
// title: 'StaggeredGridView Demo',
74-
// theme: ThemeData(
75-
// primarySwatch: Colors.blue,
76-
// ),
77-
// home: MyScreen(),
78-
// );
79-
// }
80-
// }
81-
82-
// class MyScreen extends StatefulWidget {
83-
// @override
84-
// _MyScreenState createState() => new _MyScreenState();
85-
// }
86-
87-
// class _MyScreenState extends State<MyScreen> {
88-
// int _count = 0;
89-
90-
// @override
91-
// Widget build(BuildContext context) {
92-
// return Scaffold(
93-
// body: GridTest(_count, _count),
94-
// floatingActionButton: FloatingActionButton(
95-
// child: Icon(Icons.add),
96-
// onPressed: () {
97-
// setState(() {
98-
// _count++;
99-
// });
100-
// },
101-
// ),
102-
// );
103-
// }
104-
// }
105-
106-
// class GridTest extends StatelessWidget {
107-
// GridTest(this.count, this.value);
108-
// final int count;
109-
// final int value;
67+
class StaggeredTest extends StatelessWidget {
68+
StaggeredTest(this.count, this.value);
69+
final int count;
70+
final int value;
11071

111-
// @override
112-
// Widget build(BuildContext context) {
113-
// return GridView.builder(
114-
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
115-
// crossAxisCount: 3,
116-
// crossAxisSpacing: 2,
117-
// mainAxisSpacing: 2,
118-
// ),
119-
// itemCount: count,
120-
// itemBuilder: (context, index) {
121-
// return Container(
122-
// color: Colors.blue,
123-
// child: Text('$value'),
124-
// );
125-
// },
126-
// );
127-
// }
128-
// }
129-
130-
// class StaggeredTest extends StatelessWidget {
131-
// StaggeredTest(this.count, this.value);
132-
// final int count;
133-
// final int value;
134-
135-
// @override
136-
// Widget build(BuildContext context) {
137-
// return StaggeredGridView.countBuilder(
138-
// itemCount: count,
139-
// crossAxisCount: 3,
140-
// crossAxisSpacing: 2,
141-
// mainAxisSpacing: 2,
142-
// addAutomaticKeepAlives: false,
143-
// staggeredTileBuilder: (index) => StaggeredTile.extent(1, 30),
144-
// itemBuilder: (context, index) {
145-
// return Container(
146-
// color: Colors.green,
147-
// child: Text('$value'),
148-
// );
149-
// },
150-
// );
151-
// }
152-
// }
72+
@override
73+
Widget build(BuildContext context) {
74+
return StaggeredGridView.countBuilder(
75+
itemCount: count,
76+
crossAxisCount: 3,
77+
crossAxisSpacing: 2,
78+
mainAxisSpacing: 2,
79+
addAutomaticKeepAlives: false,
80+
staggeredTileBuilder: (index) => StaggeredTile.extent(1, 30),
81+
itemBuilder: (context, index) {
82+
return Container(
83+
color: Colors.green,
84+
child: Text('$value'),
85+
);
86+
},
87+
);
88+
}
89+
}

lib/src/widgets/sliver.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ class SliverVariableSizeBoxAdaptorElement extends RenderObjectElement
8888
@override
8989
RenderSliverVariableSizeBoxAdaptor get renderObject => super.renderObject;
9090

91+
@override
92+
void update(covariant SliverVariableSizeBoxAdaptorWidget newWidget) {
93+
final SliverVariableSizeBoxAdaptorWidget oldWidget = widget;
94+
super.update(newWidget);
95+
final SliverChildDelegate newDelegate = newWidget.delegate;
96+
final SliverChildDelegate oldDelegate = oldWidget.delegate;
97+
if (newDelegate != oldDelegate &&
98+
(newDelegate.runtimeType != oldDelegate.runtimeType ||
99+
newDelegate.shouldRebuild(oldDelegate))) performRebuild();
100+
}
101+
91102
// We inflate widgets at two different times:
92103
// 1. When we ourselves are told to rebuild (see performRebuild).
93104
// 2. When our render object needs a new child (see createChild).
@@ -129,7 +140,8 @@ class SliverVariableSizeBoxAdaptorElement extends RenderObjectElement
129140
}
130141

131142
Widget _build(int index) {
132-
return _childWidgets[index] = widget.delegate.build(this, index);
143+
return _childWidgets.putIfAbsent(
144+
index, () => widget.delegate.build(this, index));
133145
}
134146

135147
@override

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_staggered_grid_view
22
description: A Flutter staggered grid view
3-
version: 0.2.6
3+
version: 0.2.7
44
author: Romain Rastel <[email protected]>
55
homepage: https://github.com/letsar/flutter_staggered_grid_view
66
dependencies:

0 commit comments

Comments
 (0)