1+ import 'dart:math' ;
2+
13import 'package:flutter/cupertino.dart' ;
24import 'package:flutter/material.dart' ;
35import 'package:flutter_bloc/flutter_bloc.dart' ;
4- import 'package:flutter_spinkit/flutter_spinkit.dart' ;
56import 'package:flutter_unit/app/utils/convert.dart' ;
6- import 'package:flutter_unit/app/res/cons.dart' ;
7+
78import 'package:flutter_unit/app/router.dart' ;
89import 'package:flutter_unit/blocs/bloc_exp.dart' ;
910import 'package:flutter_unit/components/permanent/feedback_widget.dart' ;
10- import 'package:flutter_unit/components/permanent/loading/planet_loading.dart' ;
1111import 'package:flutter_unit/components/permanent/overlay_tool_wrapper.dart' ;
12+
1213import 'package:flutter_unit/model/widget_model.dart' ;
1314import 'package:flutter_unit/views/common/empty_page.dart' ;
14- import 'package:flutter_unit/views/common/loading_page.dart' ;
1515import 'package:flutter_unit/views/items/home_item_support.dart' ;
1616import 'package:flutter_unit/views/pages/home/toly_app_bar.dart' ;
1717
@@ -22,16 +22,11 @@ class HomePage extends StatefulWidget {
2222 _HomePageState createState () => _HomePageState ();
2323}
2424
25- class _HomePageState extends State <HomePage >
26- with AutomaticKeepAliveClientMixin {
27- ScrollController _ctrl;
28- double _limitY = 35 ;
29- double _height = kToolbarHeight * 2 - 20 ;
25+ class _HomePageState extends State <HomePage > with AutomaticKeepAliveClientMixin {
3026
3127 @override
3228 void initState () {
3329 super .initState ();
34- _ctrl = ScrollController ()..addListener (_updateAppBarHeight);
3530
3631 WidgetsBinding .instance.addPostFrameCallback ((callback) {
3732 OverlayToolWrapper .of (context).showFloating ();
@@ -43,19 +38,38 @@ class _HomePageState extends State<HomePage>
4338 super .build (context);
4439
4540 return Scaffold (
46- appBar: TolyAppBar (
47- preferredSize: Size .fromHeight (_height),
48- onItemClick: _switchTab,
49- ),
50- body: Stack (
41+ body: BlocBuilder <HomeBloc , HomeState >(builder: (ctx, state) {
42+ return Stack (
5143 children: < Widget > [
5244 BlocBuilder <GlobalBloc , GlobalState >(builder: _buildBackground),
53- BlocBuilder <HomeBloc , HomeState >(builder: _buildContent)
45+ CustomScrollView (
46+ slivers: < Widget > [
47+ _buildPersistentHeader (),
48+ _buildContent (ctx, state),
49+ ],
50+ ),
5451 ],
55- ),
56- );
52+ );
53+ }) );
5754 }
5855
56+ Widget _buildPersistentHeader () => SliverPersistentHeader (
57+ pinned: true ,
58+ delegate: FlexHeaderDelegate (
59+ minHeight: 25 + 56.0 ,
60+ maxHeight: 120.0 ,
61+ childBuilder: (offset, max, min) {
62+ double dy = max - 25 - offset;
63+
64+ if (dy < min - 25 ) {
65+ dy = min - 25 ;
66+ }
67+ return TolyAppBar (
68+ maxHeight: dy,
69+ onItemClick: _switchTab,
70+ );
71+ }));
72+
5973 Widget _buildBackground (BuildContext context, GlobalState state) {
6074 if (state.showBackGround) {
6175 return BackgroundShower ();
@@ -64,24 +78,33 @@ class _HomePageState extends State<HomePage>
6478 }
6579
6680 Widget _buildContent (BuildContext context, HomeState state) {
67-
68- if (state is WidgetsLoading ){
69- return Center (
70- child: PlateLoading (),
81+ if (state is WidgetsLoading ) {
82+ // return SliverToBoxAdapter(
83+ // child: Center(
84+ // child: PlateLoading(),
85+ // ),
86+ // );
87+ //
88+ return SliverToBoxAdapter (
89+ child: Container (),
7190 );
7291 }
7392
7493 if (state is WidgetsLoaded ) {
7594 List <WidgetModel > items = state.widgets;
7695 if (items.isEmpty) return EmptyPage ();
77- return ListView .builder (
78- controller: _ctrl,
79- itemBuilder: (_, index) => _buildHomeItem (items[index]),
80- itemCount: items.length);
96+ return SliverList (
97+ delegate: SliverChildBuilderDelegate (
98+ (_, int index) => _buildHomeItem (items[index]),
99+ childCount: items.length),
100+ );
81101 }
102+
82103 if (state is WidgetsLoadFailed ) {
83- return Container (
84- child: Text ('加载数据异常' ),
104+ return SliverToBoxAdapter (
105+ child: Container (
106+ child: Text ('加载数据异常' ),
107+ ),
85108 );
86109 }
87110 return Container ();
@@ -98,24 +121,48 @@ class _HomePageState extends State<HomePage>
98121 },
99122 );
100123
101- _updateAppBarHeight () {
102- if (_ctrl.offset < _limitY * 4 ) {
103- setState (() {
104- _height = kToolbarHeight * 2 - 20 - _ctrl.offset / 4 ;
105- });
106- }
107- }
108-
109124 _switchTab (int index, Color color) {
110- if (_ctrl.hasClients) _ctrl.jumpTo (0 );
111- BlocProvider .of <HomeBloc >(context).add (EventTabTap (Convert .toFamily (index)));
125+
126+ BlocProvider .of <HomeBloc >(context)
127+ .add (EventTabTap (Convert .toFamily (index)));
112128 }
113129
114- _toDetailPage (WidgetModel model){
130+ _toDetailPage (WidgetModel model) {
115131 BlocProvider .of <DetailBloc >(context).add (FetchWidgetDetail (model));
116132 Navigator .pushNamed (context, UnitRouter .widget_detail, arguments: model);
117133 }
118134
119135 @override
120136 bool get wantKeepAlive => true ;
121137}
138+
139+ class FlexHeaderDelegate extends SliverPersistentHeaderDelegate {
140+ FlexHeaderDelegate ({
141+ @required this .minHeight,
142+ @required this .maxHeight,
143+ @required this .childBuilder,
144+ });
145+
146+ final double minHeight; //最小高度
147+ final double maxHeight; //最大高度
148+ final Widget Function (double offset, double max, double min)
149+ childBuilder; //最大高度
150+
151+ @override
152+ double get minExtent => minHeight;
153+
154+ @override
155+ double get maxExtent => max (maxHeight, minHeight);
156+
157+ @override
158+ Widget build (
159+ BuildContext context, double shrinkOffset, bool overlapsContent) {
160+ return childBuilder (shrinkOffset, maxHeight, minHeight);
161+ }
162+
163+ @override //是否需要重建
164+ bool shouldRebuild (FlexHeaderDelegate oldDelegate) {
165+ return maxHeight != oldDelegate.maxHeight ||
166+ minHeight != oldDelegate.minHeight;
167+ }
168+ }
0 commit comments