@@ -3,7 +3,9 @@ import 'package:flutter/material.dart'; | |||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:pull_to_refresh/pull_to_refresh.dart'; | import 'package:pull_to_refresh/pull_to_refresh.dart'; | ||||
import 'package:zhiying_base_widget/pages/main_page/main_page_bloc.dart'; | import 'package:zhiying_base_widget/pages/main_page/main_page_bloc.dart'; | ||||
import 'package:zhiying_base_widget/pages/main_page/main_page_notifier.dart'; | |||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; | |||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; | |||||
import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | import 'package:zhiying_comm/util/base_bloc.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -24,8 +26,18 @@ class _MainPageState extends State<MainPage> { | |||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Scaffold( | return Scaffold( | ||||
backgroundColor: Color(0xfff9f9f9), | backgroundColor: Color(0xfff9f9f9), | ||||
body: ChangeNotifierProvider( | |||||
create: (context) => MainPageNotifier(), | |||||
// body: ChangeNotifierProvider( | |||||
// create: (context) => MainPageNotifier(), | |||||
// child: BlocProvider<MainPageBloc>( | |||||
// bloc: MainPageBloc(), | |||||
// child: _MainPageContainer(widget.data), | |||||
// ), | |||||
// ), | |||||
body: MultiProvider( | |||||
providers: [ | |||||
ChangeNotifierProvider.value(value: MainPageNotifier()), | |||||
ChangeNotifierProvider.value(value: MainPageBgNotifier()), | |||||
], | |||||
child: BlocProvider<MainPageBloc>( | child: BlocProvider<MainPageBloc>( | ||||
bloc: MainPageBloc(), | bloc: MainPageBloc(), | ||||
child: _MainPageContainer(widget.data), | child: _MainPageContainer(widget.data), | ||||
@@ -96,9 +108,20 @@ class _MainPageContainerState extends State<_MainPageContainer> { | |||||
header: WaterDropHeader(), | header: WaterDropHeader(), | ||||
controller: _refreshController, | controller: _refreshController, | ||||
onLoading: _onLoading, | onLoading: _onLoading, | ||||
child: CustomScrollView( | |||||
controller: _controller, | |||||
slivers: _createContent(context), | |||||
child: Container( | |||||
width: double.infinity, | |||||
child: Stack( | |||||
fit: StackFit.passthrough, | |||||
children: <Widget>[ | |||||
MineHeaderBgWidget( | |||||
controller: _controller, | |||||
), | |||||
CustomScrollView( | |||||
controller: _controller, | |||||
slivers: _createContent(context), | |||||
) | |||||
], | |||||
), | |||||
), | ), | ||||
)); | )); | ||||
}, | }, | ||||
@@ -0,0 +1,10 @@ | |||||
import 'package:flutter/material.dart'; | |||||
class MainPageBgNotifier with ChangeNotifier { | |||||
Widget toWidget = Container(); | |||||
void switchBg(Widget toWidget) { | |||||
this.toWidget = toWidget; | |||||
notifyListeners(); | |||||
} | |||||
} |
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; | |||||
class MainPageNotifier with ChangeNotifier { | class MainPageNotifier with ChangeNotifier { | ||||
bool scrollEnd = false; | bool scrollEnd = false; | ||||
// 加载更多数据 | |||||
void loadMore() { | void loadMore() { | ||||
scrollEnd = true; | scrollEnd = true; | ||||
notifyListeners(); | notifyListeners(); |
@@ -5,6 +5,7 @@ import 'package:zhiying_base_widget/widgets/home_banner/home_banner_creater.dart | |||||
import 'package:zhiying_base_widget/widgets/home_goods/home_goods_creater.dart'; | import 'package:zhiying_base_widget/widgets/home_goods/home_goods_creater.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home_quick_entry/home_quick_entry_creater.dart'; | import 'package:zhiying_base_widget/widgets/home_quick_entry/home_quick_entry_creater.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home_slide_banner/home_slide_banner_creater.dart'; | import 'package:zhiying_base_widget/widgets/home_slide_banner/home_slide_banner_creater.dart'; | ||||
import 'package:zhiying_base_widget/widgets/mine_header/mine_header_creater.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
class BaseWidgetRegister { | class BaseWidgetRegister { | ||||
@@ -38,7 +39,7 @@ class BaseWidgetRegister { | |||||
WidgetFactory.regist('index_banner_two', HomeBannerCreater()); | WidgetFactory.regist('index_banner_two', HomeBannerCreater()); | ||||
// ==================== 个人中心 | // ==================== 个人中心 | ||||
// WidgetFactory.regist('index_title', MineHeaderCreater()); | |||||
WidgetFactory.regist('index_title', MineHeaderCreater()); | |||||
// WidgetFactory.regist('index_search', MineHeaderBgCreater()); | // WidgetFactory.regist('index_search', MineHeaderBgCreater()); | ||||
// WidgetFactory.regist('index_search', MineQuickEntryCreater()); | // WidgetFactory.regist('index_search', MineQuickEntryCreater()); | ||||
} | } | ||||
@@ -2,7 +2,7 @@ import 'package:event_bus/event_bus.dart'; | |||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:zhiying_base_widget/pages/main_page/main_page_notifier.dart'; | |||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home_goods/bloc/home_goods_bloc.dart'; | import 'package:zhiying_base_widget/widgets/home_goods/bloc/home_goods_bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home_goods/home_goods_creater.dart'; | import 'package:zhiying_base_widget/widgets/home_goods/home_goods_creater.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home_goods/home_goods_item.dart'; | import 'package:zhiying_base_widget/widgets/home_goods/home_goods_item.dart'; | ||||
@@ -1,9 +1,11 @@ | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
import 'package:flutter_swiper/flutter_swiper.dart'; | import 'package:flutter_swiper/flutter_swiper.dart'; | ||||
import 'bloc/bloc.dart'; | |||||
import 'package:provider/provider.dart'; | |||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'bloc/bloc.dart'; | |||||
import 'bloc/home_slide_banner_repository.dart'; | import 'bloc/home_slide_banner_repository.dart'; | ||||
import 'home_slide_banner_sk.dart'; | import 'home_slide_banner_sk.dart'; | ||||
import 'model/home_slide_banner_model.dart'; | import 'model/home_slide_banner_model.dart'; | ||||
@@ -24,7 +26,9 @@ class _HomeSlideBannerState extends State<HomeSlideBanner> { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return BlocProvider<HomeSlideBannerBloc>( | return BlocProvider<HomeSlideBannerBloc>( | ||||
create: (_) => HomeSlideBannerBloc(repository: HomeSlideBannerRepository())..add(HomeBannerInitEvent(model: widget?.model)), | |||||
create: (_) => | |||||
HomeSlideBannerBloc(repository: HomeSlideBannerRepository()) | |||||
..add(HomeBannerInitEvent(model: widget?.model)), | |||||
child: HomeSlideBannerContainer(), | child: HomeSlideBannerContainer(), | ||||
); | ); | ||||
} | } | ||||
@@ -32,7 +36,8 @@ class _HomeSlideBannerState extends State<HomeSlideBanner> { | |||||
class HomeSlideBannerContainer extends StatefulWidget { | class HomeSlideBannerContainer extends StatefulWidget { | ||||
@override | @override | ||||
_HomeSlideBannerContainerState createState() => _HomeSlideBannerContainerState(); | |||||
_HomeSlideBannerContainerState createState() => | |||||
_HomeSlideBannerContainerState(); | |||||
} | } | ||||
class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | ||||
@@ -77,12 +82,21 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
child: Swiper( | child: Swiper( | ||||
itemBuilder: (BuildContext context, int index) { | itemBuilder: (BuildContext context, int index) { | ||||
return Container( | return Container( | ||||
color: Colors.green, | |||||
color: Colors.primaries[index % Colors.primaries.length], | |||||
); | ); | ||||
}, | }, | ||||
itemCount: datas?.length ?? 0, | itemCount: datas?.length ?? 0, | ||||
onTap: (index) => _itemOnClick(datas[index]), | onTap: (index) => _itemOnClick(datas[index]), | ||||
pagination: _SwiperCustomPagination(datas?.length ?? 0), | pagination: _SwiperCustomPagination(datas?.length ?? 0), | ||||
onIndexChanged: (index) { | |||||
print('切换下一页'); | |||||
Provider.of<MainPageBgNotifier>(context, listen: false) | |||||
.switchBg(Container( | |||||
width: double.infinity, | |||||
height: 200, | |||||
color: Colors.primaries[(index + 2) % Colors.primaries.length], | |||||
)); | |||||
}, | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -94,7 +108,8 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
list.add(i); | list.add(i); | ||||
} | } | ||||
return SwiperCustomPagination(builder: (BuildContext context, SwiperPluginConfig config) { | |||||
return SwiperCustomPagination( | |||||
builder: (BuildContext context, SwiperPluginConfig config) { | |||||
return Align( | return Align( | ||||
alignment: Alignment(0.0, 0.9), | alignment: Alignment(0.0, 0.9), | ||||
child: Row( | child: Row( | ||||
@@ -103,10 +118,13 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
children: list.map((index) { | children: list.map((index) { | ||||
var borderRadius; | var borderRadius; | ||||
if (index == 0) { | if (index == 0) { | ||||
borderRadius = BorderRadius.only(topLeft: Radius.circular(2), bottomLeft: Radius.circular(2)); | |||||
borderRadius = BorderRadius.only( | |||||
topLeft: Radius.circular(2), bottomLeft: Radius.circular(2)); | |||||
} | } | ||||
if (index == list.length - 1) { | if (index == list.length - 1) { | ||||
borderRadius = BorderRadius.only(topRight: Radius.circular(2), bottomRight: Radius.circular(2)); | |||||
borderRadius = BorderRadius.only( | |||||
topRight: Radius.circular(2), | |||||
bottomRight: Radius.circular(2)); | |||||
} | } | ||||
if (index == config.activeIndex) { | if (index == config.activeIndex) { | ||||
@@ -117,7 +135,10 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
height: 4, | height: 4, | ||||
width: 25, | width: 25, | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
borderRadius: borderRadius, color: index == config.activeIndex ? HexColor.fromHex('#FF4242') : HexColor.fromHex('#FFFFFF')), | |||||
borderRadius: borderRadius, | |||||
color: index == config.activeIndex | |||||
? HexColor.fromHex('#FF4242') | |||||
: HexColor.fromHex('#FFFFFF')), | |||||
); | ); | ||||
}).toList(), | }).toList(), | ||||
), | ), | ||||
@@ -1,5 +1,6 @@ | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'home_slide_banner.dart'; | import 'home_slide_banner.dart'; | ||||
import 'home_slide_banner_sk.dart'; | import 'home_slide_banner_sk.dart'; | ||||
@@ -14,6 +15,8 @@ class HomeSlideBannerCreater extends WidgetCreater { | |||||
@override | @override | ||||
List<Widget> createWidgets(Map<String, dynamic> model) { | List<Widget> createWidgets(Map<String, dynamic> model) { | ||||
return [HomeSlideBanner(model)]; | |||||
return [ | |||||
HomeSlideBanner(model), | |||||
]; | |||||
} | } | ||||
} | } |
@@ -13,7 +13,7 @@ class MineHeaderDelegate extends SliverPersistentHeaderDelegate { | |||||
@override | @override | ||||
Widget build( | Widget build( | ||||
BuildContext context, double shrinkOffset, bool overlapsContent) { | BuildContext context, double shrinkOffset, bool overlapsContent) { | ||||
print('${shrinkOffset.toString()}'); | |||||
// print('${shrinkOffset.toString()}'); | |||||
double percent = shrinkOffset / _height; | double percent = shrinkOffset / _height; | ||||
print('${percent.toString()}'); | print('${percent.toString()}'); | ||||
return MineHeader(Colors.red.withOpacity(percent)); | return MineHeader(Colors.red.withOpacity(percent)); | ||||
@@ -1,12 +0,0 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class MineHeaderBgCreater extends WidgetCreater { | |||||
@override | |||||
List<Widget> createWidgets(Map<String, dynamic> model) { | |||||
return [ | |||||
MineHeaderBgWidget(), | |||||
]; | |||||
} | |||||
} |
@@ -1,70 +1,111 @@ | |||||
import 'dart:async'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:provider/provider.dart'; | |||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; | |||||
class MineHeaderBgWidget extends StatefulWidget { | class MineHeaderBgWidget extends StatefulWidget { | ||||
final ScrollController controller; | |||||
const MineHeaderBgWidget({Key key, this.controller}) : super(key: key); | |||||
@override | @override | ||||
_MineHeaderBgWidgetState createState() => _MineHeaderBgWidgetState(); | _MineHeaderBgWidgetState createState() => _MineHeaderBgWidgetState(); | ||||
} | } | ||||
class _MineHeaderBgWidgetState extends State<MineHeaderBgWidget> { | class _MineHeaderBgWidgetState extends State<MineHeaderBgWidget> { | ||||
int zIndex = 0; | int zIndex = 0; | ||||
// List<String> list = ['ff0000', '00ff00', '0000ff', 'ffff00']; | |||||
List<String> imageUrls = [ | |||||
'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599627593136&di=2aa824f43d4945dbeca31d5ccc587567&imgtype=0&src=http%3A%2F%2Ft8.baidu.com%2Fit%2Fu%3D1484500186%2C1503043093%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D853', | |||||
'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599627593136&di=c082ab4b39f0bc45e8cad60447db4ae2&imgtype=0&src=http%3A%2F%2Ft8.baidu.com%2Fit%2Fu%3D2247852322%2C986532796%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D853', | |||||
'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599627593136&di=b7535e61ed661806647bf1070e74f883&imgtype=0&src=http%3A%2F%2Ft7.baidu.com%2Fit%2Fu%3D3204887199%2C3790688592%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D4610%26h%3D2968', | |||||
'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599627593136&di=3b381359676404f5e42f6a663a0139f1&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D3363001160%2C1163944807%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D830', | |||||
]; | |||||
Timer timer; | |||||
//setInterval控制当前动画元素的下标,实现动画轮播 | |||||
autoPlay() { | |||||
var second = const Duration(seconds: 2); | |||||
timer = Timer.periodic(second, (t) { | |||||
setState(() { | |||||
zIndex = (++zIndex) % imageUrls.length; | |||||
}); | |||||
}); | |||||
} | |||||
double _offsetY = 0; | |||||
double _height = 300; | |||||
_MineHeaderBgContainer _content; | |||||
@override | @override | ||||
void initState() { | void initState() { | ||||
super.initState(); | super.initState(); | ||||
timer = Timer(Duration(seconds: 2), autoPlay); | |||||
_content = _MineHeaderBgContainer(); | |||||
if (widget.controller != null) { | |||||
widget.controller.addListener(() { | |||||
if (widget.controller.offset > _height) { | |||||
// 减少重绘 | |||||
return; | |||||
} | |||||
_offsetY = -widget.controller.offset; | |||||
if (_offsetY > 0) { | |||||
_offsetY = 0; | |||||
} | |||||
setState(() {}); | |||||
}); | |||||
} | |||||
} | } | ||||
@override | @override | ||||
void dispose() { | void dispose() { | ||||
if (timer != null) timer.cancel(); | |||||
super.dispose(); | super.dispose(); | ||||
} | } | ||||
@override | |||||
void didChangeDependencies() { | |||||
super.didChangeDependencies(); | |||||
print('didChangeDependencies'); | |||||
// if (isNeedLoadMore && _provider != '') { | |||||
// print('HomeGoods loadmore...'); | |||||
// _bloc.loadMore(_provider); | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
print('mmine_hider_bg_widget build'); | |||||
return Transform.translate( | |||||
offset: Offset(0, _offsetY), | |||||
child: _content, | |||||
); | |||||
} | |||||
// @override | |||||
// Widget build(BuildContext context) { | |||||
// return Container( | |||||
// height: 300, | |||||
// width: double.infinity, | |||||
// child: Stack( | |||||
// children: imageUrls | |||||
// .asMap() | |||||
// .keys | |||||
// .map<Widget>((i) => AnimatedOpacity( | |||||
// curve: Curves.easeIn, | |||||
// duration: Duration(milliseconds: 1600), | |||||
// opacity: i == zIndex ? 1 : 0, | |||||
// child: Container( | |||||
//// color: Color(int.parse(list[i], radix: 16)) | |||||
//// .withAlpha(255), | |||||
// child: CachedNetworkImage( | |||||
// imageUrl: imageUrls[i], | |||||
// fit: BoxFit.fill, | |||||
// ), | |||||
// height: 300, //100% | |||||
// ), | |||||
// )) | |||||
// .toList(), | |||||
// )); | |||||
// } | |||||
} | |||||
class _MineHeaderBgContainer extends StatefulWidget { | |||||
@override | |||||
_MineHeaderBgContainerState createState() => _MineHeaderBgContainerState(); | |||||
} | |||||
class _MineHeaderBgContainerState extends State<_MineHeaderBgContainer> { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | |||||
height: 300, | |||||
width: double.infinity, | |||||
child: Stack( | |||||
children: imageUrls | |||||
.asMap() | |||||
.keys | |||||
.map<Widget>((i) => AnimatedOpacity( | |||||
curve: Curves.easeIn, | |||||
duration: Duration(milliseconds: 1600), | |||||
opacity: i == zIndex ? 1 : 0, | |||||
child: Container( | |||||
// color: Color(int.parse(list[i], radix: 16)) | |||||
// .withAlpha(255), | |||||
child: CachedNetworkImage( | |||||
imageUrl: imageUrls[i], | |||||
), | |||||
height: 300, //100% | |||||
), | |||||
)) | |||||
.toList(), | |||||
)); | |||||
print('_MineHeaderBgContainerState build'); | |||||
return Consumer<MainPageBgNotifier>(builder: (context, model, widget) { | |||||
return Stack( | |||||
fit: StackFit.passthrough, | |||||
overflow: Overflow.clip, | |||||
children: <Widget>[ | |||||
model.toWidget ?? Container(), | |||||
], | |||||
); | |||||
}); | |||||
} | } | ||||
} | } |