From a8c2ffaa9d7be7e2bad6b6809b5ef33cf8aa21c3 Mon Sep 17 00:00:00 2001 From: Romain Rastel Date: Thu, 10 Jan 2019 19:38:35 +0100 Subject: [PATCH] Better fix for the issue #23 --- CHANGELOG.md | 4 + README.md | 2 +- example/lib/main_issue_21.dart | 199 +++++++++++---------------------- lib/src/widgets/sliver.dart | 14 ++- pubspec.yaml | 2 +- 5 files changed, 87 insertions(+), 134 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ae9a0..ffcb55d 100644 --- a/CHANGELOG.md +++ b/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. diff --git a/README.md b/README.md index 291ad11..3565625 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/example/lib/main_issue_21.dart b/example/lib/main_issue_21.dart index bac4c07..ef87e76 100644 --- a/example/lib/main_issue_21.dart +++ b/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 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 { - int _selectIndex = -1; +class MyScreen extends StatefulWidget { + @override + _MyScreenState createState() => new _MyScreenState(); +} - _DeviceTypeItemState(); +class _MyScreenState extends State { + 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 { -// 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'), + ); + }, + ); + } +} diff --git a/lib/src/widgets/sliver.dart b/lib/src/widgets/sliver.dart index 98621db..6484f50 100644 --- a/lib/src/widgets/sliver.dart +++ b/lib/src/widgets/sliver.dart @@ -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). @@ -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 diff --git a/pubspec.yaml b/pubspec.yaml index 210fad9..28b175d 100644 --- a/pubspec.yaml +++ b/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 homepage: https://github.com/letsar/flutter_staggered_grid_view dependencies: