Skip to content

Commit

Permalink
Better fix for the issue #23
Browse files Browse the repository at this point in the history
  • Loading branch information
letsar committed Jan 10, 2019
1 parent 7c1e17e commit a8c2ffa
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 134 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,7 @@
## 0.2.7
### Fixed
* Better fix for the bug where items are built only once.

## 0.2.6
### Fixed
* Fix a bug where items are built only once.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -28,7 +28,7 @@ In the `pubspec.yaml` of your flutter project, add the following dependency:
```yaml
dependencies:
...
flutter_staggered_grid_view: "^0.2.6"
flutter_staggered_grid_view: "^0.2.7"
```

In your library add the following import:
Expand Down
199 changes: 68 additions & 131 deletions example/lib/main_issue_21.dart
@@ -1,152 +1,89 @@
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';

class DeviceTypeList {
String deviceTypeName = 'test';
}

class DeviceTypeItem extends StatefulWidget {
final List<DeviceTypeList> deviceTypes;
final Function onSelected;

DeviceTypeItem(this.deviceTypes, this.onSelected);
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
_DeviceTypeItemState createState() => _DeviceTypeItemState();
Widget build(BuildContext context) {
return MaterialApp(
title: 'StaggeredGridView Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyScreen(),
);
}
}

class _DeviceTypeItemState extends State<DeviceTypeItem> {
int _selectIndex = -1;
class MyScreen extends StatefulWidget {
@override
_MyScreenState createState() => new _MyScreenState();
}

_DeviceTypeItemState();
class _MyScreenState extends State<MyScreen> {
int _count = 0;

_selectDevice(int index) {
setState(() {
_selectIndex = index;
});
// onSelected(deviceTypes[_selectIndex].deviceTypeName);
@override
Widget build(BuildContext context) {
return Scaffold(
body: StaggeredTest(_count, _count),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
setState(() {
_count++;
});
},
),
);
}
}

_tmpData() {
return List.generate(
10,
(int index) => GestureDetector(
child: Container(
child: Text(widget.deviceTypes[0].deviceTypeName),
color: _selectIndex == index ? Colors.blue : Colors.brown,
padding: EdgeInsets.only(top: 4, bottom: 4),
alignment: Alignment.center,
),
onTap: () => _selectDevice(index),
));
}
class GridTest extends StatelessWidget {
GridTest(this.count, this.value);
final int count;
final int value;

@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(12),
// child: GridView.count(
// crossAxisCount: 3,
// children: _tmpData(),
// shrinkWrap: true,
// ),

child: StaggeredGridView.count(
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
children: _tmpData(),
staggeredTiles: List.generate(10, (int index) => StaggeredTile.fit(1)),
shrinkWrap: true,
crossAxisSpacing: 2,
mainAxisSpacing: 2,
),
itemCount: count,
itemBuilder: (context, index) {
return Container(
color: Colors.blue,
child: Text('$value'),
);
},
);
}
}

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

// void main() => runApp(MyApp());

// class MyApp extends StatelessWidget {
// @override
// Widget build(BuildContext context) {
// return MaterialApp(
// title: 'StaggeredGridView Demo',
// theme: ThemeData(
// primarySwatch: Colors.blue,
// ),
// home: MyScreen(),
// );
// }
// }

// class MyScreen extends StatefulWidget {
// @override
// _MyScreenState createState() => new _MyScreenState();
// }

// class _MyScreenState extends State<MyScreen> {
// int _count = 0;

// @override
// Widget build(BuildContext context) {
// return Scaffold(
// body: GridTest(_count, _count),
// floatingActionButton: FloatingActionButton(
// child: Icon(Icons.add),
// onPressed: () {
// setState(() {
// _count++;
// });
// },
// ),
// );
// }
// }

// class GridTest extends StatelessWidget {
// GridTest(this.count, this.value);
// final int count;
// final int value;
class StaggeredTest extends StatelessWidget {
StaggeredTest(this.count, this.value);
final int count;
final int value;

// @override
// Widget build(BuildContext context) {
// return GridView.builder(
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
// crossAxisCount: 3,
// crossAxisSpacing: 2,
// mainAxisSpacing: 2,
// ),
// itemCount: count,
// itemBuilder: (context, index) {
// return Container(
// color: Colors.blue,
// child: Text('$value'),
// );
// },
// );
// }
// }

// class StaggeredTest extends StatelessWidget {
// StaggeredTest(this.count, this.value);
// final int count;
// final int value;

// @override
// Widget build(BuildContext context) {
// return StaggeredGridView.countBuilder(
// itemCount: count,
// crossAxisCount: 3,
// crossAxisSpacing: 2,
// mainAxisSpacing: 2,
// addAutomaticKeepAlives: false,
// staggeredTileBuilder: (index) => StaggeredTile.extent(1, 30),
// itemBuilder: (context, index) {
// return Container(
// color: Colors.green,
// child: Text('$value'),
// );
// },
// );
// }
// }
@override
Widget build(BuildContext context) {
return StaggeredGridView.countBuilder(
itemCount: count,
crossAxisCount: 3,
crossAxisSpacing: 2,
mainAxisSpacing: 2,
addAutomaticKeepAlives: false,
staggeredTileBuilder: (index) => StaggeredTile.extent(1, 30),
itemBuilder: (context, index) {
return Container(
color: Colors.green,
child: Text('$value'),
);
},
);
}
}
14 changes: 13 additions & 1 deletion lib/src/widgets/sliver.dart
Expand Up @@ -88,6 +88,17 @@ class SliverVariableSizeBoxAdaptorElement extends RenderObjectElement
@override
RenderSliverVariableSizeBoxAdaptor get renderObject => super.renderObject;

@override
void update(covariant SliverVariableSizeBoxAdaptorWidget newWidget) {
final SliverVariableSizeBoxAdaptorWidget oldWidget = widget;
super.update(newWidget);
final SliverChildDelegate newDelegate = newWidget.delegate;
final SliverChildDelegate oldDelegate = oldWidget.delegate;
if (newDelegate != oldDelegate &&
(newDelegate.runtimeType != oldDelegate.runtimeType ||
newDelegate.shouldRebuild(oldDelegate))) performRebuild();
}

// We inflate widgets at two different times:
// 1. When we ourselves are told to rebuild (see performRebuild).
// 2. When our render object needs a new child (see createChild).
Expand Down Expand Up @@ -129,7 +140,8 @@ class SliverVariableSizeBoxAdaptorElement extends RenderObjectElement
}

Widget _build(int index) {
return _childWidgets[index] = widget.delegate.build(this, index);
return _childWidgets.putIfAbsent(
index, () => widget.delegate.build(this, index));
}

@override
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
@@ -1,6 +1,6 @@
name: flutter_staggered_grid_view
description: A Flutter staggered grid view
version: 0.2.6
version: 0.2.7
author: Romain Rastel <lets4r@gmail.com>
homepage: https://github.com/letsar/flutter_staggered_grid_view
dependencies:
Expand Down

0 comments on commit a8c2ffa

Please sign in to comment.