Skip to content

Commit fa8b76f

Browse files
committed
增加详情页动态效果
1 parent 3b957a0 commit fa8b76f

File tree

3 files changed

+325
-179
lines changed

3 files changed

+325
-179
lines changed

lib/page/repostory_detail_info_page.dart

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
4545
AutomaticKeepAliveClientMixin<ReposDetailInfoPage>,
4646
GSYListState<ReposDetailInfoPage>,
4747
TickerProviderStateMixin {
48+
final ScrollController scrollController = new ScrollController();
49+
4850
int selectIndex = 0;
51+
double headerSize = 270;
4952

5053
ReposDetailInfoPageState();
5154

@@ -118,6 +121,9 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
118121
return new Future.value(null);
119122
}).then((result) {
120123
if (result != null && result.result) {
124+
if(!isShow) {
125+
return;
126+
}
121127
setState(() {
122128
widget.titleOptionControl.url = result.data.htmlUrl;
123129
});
@@ -165,6 +171,7 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
165171
handleRefresh,
166172
onLoadMore,
167173
refreshKey: refreshIKey,
174+
scrollController: scrollController,
168175
headerSliverBuilder: (context, _) {
169176
return _sliverBuilder(context, _);
170177
},
@@ -175,25 +182,29 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
175182

176183
List<Widget> _sliverBuilder(BuildContext context, bool innerBoxIsScrolled) {
177184
return <Widget>[
185+
///头部信息
178186
SliverPersistentHeader(
179187
delegate: _InfoHeaderDelegate(
180-
maxHeight: 300,
181-
minHeight: 300,
182-
snapConfig: FloatingHeaderSnapConfiguration(
183-
vsync: this,
184-
curve: Curves.bounceInOut,
185-
duration: const Duration(milliseconds: 10),
186-
),
187-
child: new ReposHeaderItem(
188-
ReposHeaderViewModel.fromHttpMap(
189-
widget.userName,
190-
widget.reposName,
191-
ReposDetailModel.of(context).repository), (index) {
192-
selectIndex = index;
193-
clearData();
194-
showRefreshLoading();
195-
})),
188+
maxHeight: headerSize,
189+
minHeight: headerSize,
190+
snapConfig: FloatingHeaderSnapConfiguration(
191+
vsync: this,
192+
curve: Curves.bounceInOut,
193+
duration: const Duration(milliseconds: 10),
194+
),
195+
child: new ReposHeaderItem(
196+
ReposHeaderViewModel.fromHttpMap(widget.userName, widget.reposName,
197+
ReposDetailModel.of(context).repository),
198+
layoutListener: (size) {
199+
setState(() {
200+
headerSize = size.height;
201+
});
202+
},
203+
),
204+
),
196205
),
206+
207+
///动态放大缩小的选择案件
197208
SliverPersistentHeader(
198209
pinned: true,
199210
delegate: _InfoHeaderDelegate(
@@ -207,6 +218,7 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
207218
),
208219
builder: (BuildContext context, double shrinkOffset,
209220
bool overlapsContent) {
221+
///根据数值计算偏差
210222
var lr = 10 - shrinkOffset / 70 * 10;
211223
var radius = Radius.circular(4 - shrinkOffset / 70 * 4);
212224
return SizedBox.expand(
@@ -218,9 +230,16 @@ class ReposDetailInfoPageState extends State<ReposDetailInfoPage>
218230
CommonUtils.getLocale(context).repos_tab_commits,
219231
],
220232
(index) {
221-
selectIndex = index;
222-
clearData();
223-
showRefreshLoading();
233+
///切换时先滑动
234+
scrollController
235+
.animateTo(0,
236+
duration: Duration(milliseconds: 200),
237+
curve: Curves.bounceInOut)
238+
.then((_) {
239+
selectIndex = index;
240+
clearData();
241+
showRefreshLoading();
242+
});
224243
},
225244
margin: EdgeInsets.zero,
226245
shape: new RoundedRectangleBorder(
@@ -265,9 +284,7 @@ class _InfoHeaderDelegate extends SliverPersistentHeaderDelegate {
265284
if (builder != null) {
266285
return builder(context, shrinkOffset, overlapsContent);
267286
}
268-
return SizedBox.expand(
269-
child: child,
270-
);
287+
return child;
271288
}
272289

273290
@override

lib/widget/nested/gsy_nested_pull_load_widget.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ class GSYNestedPullLoadWidget extends StatefulWidget {
2323
final Key refreshKey;
2424
final NestedScrollViewHeaderSliversBuilder headerSliverBuilder;
2525

26+
final ScrollController scrollController;
27+
2628
GSYNestedPullLoadWidget(
2729
this.control, this.itemBuilder, this.onRefresh, this.onLoadMore,
28-
{this.refreshKey, this.headerSliverBuilder});
30+
{this.refreshKey, this.headerSliverBuilder, this.scrollController});
2931

3032
@override
3133
_GSYNestedPullLoadWidgetState createState() => _GSYNestedPullLoadWidgetState(
@@ -50,8 +52,6 @@ class _GSYNestedPullLoadWidgetState extends State<GSYNestedPullLoadWidget> {
5052
_GSYNestedPullLoadWidgetState(this.control, this.itemBuilder, this.onRefresh,
5153
this.onLoadMore, this.refreshKey);
5254

53-
final ScrollController _scrollController = new ScrollController();
54-
5555
@override
5656
void initState() {
5757
super.initState();
@@ -109,7 +109,7 @@ class _GSYNestedPullLoadWidgetState extends State<GSYNestedPullLoadWidget> {
109109
key: refreshKey,
110110
child: NestedScrollView(
111111
///滑动监听
112-
controller: _scrollController,
112+
controller: widget.scrollController,
113113
physics: const AlwaysScrollableScrollPhysics(),
114114
headerSliverBuilder: widget.headerSliverBuilder,
115115
body: NotificationListener(

0 commit comments

Comments
 (0)