2、搜索页面的状态栏文字颜色 3、商品详情优惠券到期时间显示问题 4、首页的banner,多眼导航,公告通知,点击实现 5、热榜的取消加载底部的UItags/0.0.2+1
@@ -6,6 +6,10 @@ import 'package:zhiying_base_widget/pages/home_page/home_page.dart'; | |||||
import 'package:zhiying_base_widget/pages/launch_page/launch_page.dart'; | import 'package:zhiying_base_widget/pages/launch_page/launch_page.dart'; | ||||
import 'package:zhiying_base_widget/register.dart'; | import 'package:zhiying_base_widget/register.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:flutter_localizations/flutter_localizations.dart'; | |||||
import 'package:pull_to_refresh/pull_to_refresh.dart'; | |||||
import 'util/localizations_delegate.dart'; | |||||
void main() { | void main() { | ||||
FlutterError.onError = (FlutterErrorDetails details) { | FlutterError.onError = (FlutterErrorDetails details) { | ||||
@@ -26,8 +30,7 @@ class _MyAppState extends State<MyApp> { | |||||
return Center( | return Center( | ||||
child: Text( | child: Text( | ||||
"走神了~\n${error.exceptionAsString()}", | "走神了~\n${error.exceptionAsString()}", | ||||
style: | |||||
Theme.of(context).textTheme.title.copyWith(color: Colors.redAccent), | |||||
style: Theme.of(context).textTheme.title.copyWith(color: Colors.redAccent), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -53,11 +56,24 @@ class _MyAppState extends State<MyApp> { | |||||
ChangeNotifierProvider.value(value: UserInfoNotifier()), | ChangeNotifierProvider.value(value: UserInfoNotifier()), | ||||
], | ], | ||||
child: MaterialApp( | child: MaterialApp( | ||||
localizationsDelegates: [ | |||||
RefreshLocalizations.delegate, | |||||
GlobalMaterialLocalizations.delegate, | |||||
GlobalWidgetsLocalizations.delegate, | |||||
CommonLocalizationsDelegate(), | |||||
], | |||||
supportedLocales: [ | |||||
const Locale('en'), | |||||
const Locale('zh'), | |||||
], | |||||
localeResolutionCallback: (Locale locale, Iterable<Locale> supportedLocales) { | |||||
print("change language ${locale.toString()}"); | |||||
return locale; | |||||
}, | |||||
home: GestureDetector( | home: GestureDetector( | ||||
onTap: () { | onTap: () { | ||||
FocusScopeNode currentFocus = FocusScope.of(context); | FocusScopeNode currentFocus = FocusScope.of(context); | ||||
if (!currentFocus.hasPrimaryFocus && | |||||
currentFocus.focusedChild != null) { | |||||
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) { | |||||
FocusManager.instance.primaryFocus.unfocus(); | FocusManager.instance.primaryFocus.unfocus(); | ||||
} | } | ||||
}, | }, | ||||
@@ -0,0 +1,148 @@ | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:flutter/foundation.dart'; | |||||
///语言(主要解决cupertino控件不能显示中文的问题) | |||||
class CommonLocalizationsDelegate | |||||
extends LocalizationsDelegate<CupertinoLocalizations> { | |||||
const CommonLocalizationsDelegate(); | |||||
@override | |||||
bool isSupported(Locale locale) => | |||||
<String>['zh', 'CN'].contains(locale.languageCode); | |||||
@override | |||||
SynchronousFuture<_DefaultCupertinoLocalizations> load(Locale locale) { | |||||
return SynchronousFuture<_DefaultCupertinoLocalizations>( | |||||
_DefaultCupertinoLocalizations(locale.languageCode)); | |||||
} | |||||
@override | |||||
bool shouldReload(CommonLocalizationsDelegate old) => false; | |||||
} | |||||
class _DefaultCupertinoLocalizations extends CupertinoLocalizations { | |||||
_DefaultCupertinoLocalizations(this._languageCode) | |||||
: assert(_languageCode != null); | |||||
final String _languageCode; | |||||
static const List<String> _shortWeekdays = <String>[ | |||||
'周一', | |||||
'周二', | |||||
'周三', | |||||
'周四', | |||||
'周五', | |||||
'周六', | |||||
'周日', | |||||
]; | |||||
static const List<String> _shortMonths = <String>[ | |||||
'一月', | |||||
'二月', | |||||
'三月', | |||||
'四月', | |||||
'五月', | |||||
'六月', | |||||
'七月', | |||||
'八月', | |||||
'九月', | |||||
'十月', | |||||
'十一月', | |||||
'十二月', | |||||
]; | |||||
static const List<String> _months = <String>[ | |||||
'一月', | |||||
'二月', | |||||
'三月', | |||||
'四月', | |||||
'五月', | |||||
'六月', | |||||
'七月', | |||||
'八月', | |||||
'九月', | |||||
'十月', | |||||
'十一月', | |||||
'十二月', | |||||
]; | |||||
@override | |||||
String get alertDialogLabel => '提醒'; | |||||
@override | |||||
String get anteMeridiemAbbreviation => "上午"; | |||||
@override | |||||
String get postMeridiemAbbreviation => "下午"; | |||||
@override | |||||
String get copyButtonLabel => "复制"; | |||||
@override | |||||
String get cutButtonLabel => "剪切"; | |||||
@override | |||||
String get pasteButtonLabel => "粘贴"; | |||||
@override | |||||
String get selectAllButtonLabel => "全选"; | |||||
@override | |||||
DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.ymd; | |||||
@override | |||||
DatePickerDateTimeOrder get datePickerDateTimeOrder => | |||||
DatePickerDateTimeOrder.date_time_dayPeriod; | |||||
@override | |||||
String datePickerDayOfMonth(int dayIndex) => dayIndex.toString(); | |||||
@override | |||||
String datePickerHour(int hour) => hour.toString(); | |||||
@override | |||||
String datePickerHourSemanticsLabel(int hour) => hour.toString(); | |||||
@override | |||||
String datePickerMediumDate(DateTime date) { | |||||
return '${_shortWeekdays[date.weekday - DateTime.monday]} ' | |||||
'${_shortMonths[date.month - DateTime.january]} ' | |||||
'${date.day.toString().padRight(2)}'; | |||||
} | |||||
@override | |||||
String datePickerMinute(int minute) => minute.toString().padLeft(2, '0'); | |||||
@override | |||||
String datePickerMinuteSemanticsLabel(int minute) { | |||||
if (minute == 1) return '1 分钟'; | |||||
return minute.toString() + ' 分钟'; | |||||
} | |||||
@override | |||||
String datePickerMonth(int monthIndex) => _months[monthIndex - 1]; | |||||
@override | |||||
String datePickerYear(int yearIndex) => yearIndex.toString(); | |||||
@override | |||||
String timerPickerHour(int hour) => hour.toString(); | |||||
@override | |||||
String timerPickerHourLabel(int hour) => '时'; | |||||
@override | |||||
String timerPickerMinute(int minute) => minute.toString(); | |||||
@override | |||||
String timerPickerMinuteLabel(int minute) => '分'; | |||||
@override | |||||
String timerPickerSecond(int second) => second.toString(); | |||||
@override | |||||
String timerPickerSecondLabel(int second) => '秒'; | |||||
@override | |||||
// TODO: implement todayLabel | |||||
String get todayLabel => null; | |||||
} |
@@ -12,6 +12,8 @@ dependencies: | |||||
# The following adds the Cupertino Icons font to your application. | # The following adds the Cupertino Icons font to your application. | ||||
# Use with the CupertinoIcons class for iOS style icons. | # Use with the CupertinoIcons class for iOS style icons. | ||||
cupertino_icons: ^0.1.2 | cupertino_icons: ^0.1.2 | ||||
flutter_localizations: | |||||
sdk: flutter | |||||
dev_dependencies: | dev_dependencies: | ||||
flutter_test: | flutter_test: | ||||
@@ -5,12 +5,14 @@ import 'package:pull_to_refresh/pull_to_refresh.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_bg_notifier.dart'; | ||||
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; | import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; | ||||
import 'package:zhiying_base_widget/utils/contants.dart'; | import 'package:zhiying_base_widget/utils/contants.dart'; | ||||
import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_header.dart'; | |||||
import 'package:zhiying_base_widget/widgets/wallet/wallet_appbar/wallet_appbar_sk.dart'; | import 'package:zhiying_base_widget/widgets/wallet/wallet_appbar/wallet_appbar_sk.dart'; | ||||
import 'package:zhiying_base_widget/widgets/wallet/wallet_data/wallet_data_sk.dart'; | import 'package:zhiying_base_widget/widgets/wallet/wallet_data/wallet_data_sk.dart'; | ||||
import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail_sk.dart'; | import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail_sk.dart'; | ||||
import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income_sk.dart'; | import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income_sk.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'; | ||||
import 'dart:ui'; | |||||
import 'wallet_page_bloc.dart'; | import 'wallet_page_bloc.dart'; | ||||
@@ -53,14 +55,15 @@ class _WalletPageContainer extends StatefulWidget { | |||||
} | } | ||||
class _WalletPageContainerState extends State<_WalletPageContainer> { | class _WalletPageContainerState extends State<_WalletPageContainer> { | ||||
final ScrollController _controller = ScrollController(); | |||||
final RefreshController _refreshController = | |||||
RefreshController(initialRefresh: false); | |||||
ScrollController _controller; | |||||
RefreshController _refreshController; | |||||
WalletPageBloc _pageBloc; | WalletPageBloc _pageBloc; | ||||
@override | @override | ||||
void initState() { | void initState() { | ||||
_controller = ScrollController(); | |||||
_refreshController = RefreshController(initialRefresh: false); | |||||
_pageBloc = BlocProvider.of<WalletPageBloc>(context); | _pageBloc = BlocProvider.of<WalletPageBloc>(context); | ||||
if (widget.data.containsKey(Constants.SkipIdentifierName)) { | if (widget.data.containsKey(Constants.SkipIdentifierName)) { | ||||
_pageBloc.loadData(widget.data[Constants.SkipIdentifierName]); | _pageBloc.loadData(widget.data[Constants.SkipIdentifierName]); | ||||
@@ -68,48 +71,66 @@ class _WalletPageContainerState extends State<_WalletPageContainer> { | |||||
super.initState(); | super.initState(); | ||||
} | } | ||||
@override | |||||
void dispose() { | |||||
_refreshController?.dispose(); | |||||
super.dispose(); | |||||
} | |||||
void _onLoading() async { | void _onLoading() async { | ||||
// await Future.delayed(Duration(milliseconds: 1000)); | // await Future.delayed(Duration(milliseconds: 1000)); | ||||
// if (mounted) setState(() {}); | // if (mounted) setState(() {}); | ||||
// _refreshController.loadComplete(); | // _refreshController.loadComplete(); | ||||
} | } | ||||
void _onRefresh() async { | |||||
if (widget.data.containsKey(Constants.SkipIdentifierName)) { | |||||
_pageBloc.loadData(widget.data[Constants.SkipIdentifierName]); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
ScreenUtil.init(context, width: 750, height: 1334); | ScreenUtil.init(context, width: 750, height: 1334); | ||||
return SmartRefresher( | |||||
controller: _refreshController, | |||||
enablePullDown: true, | |||||
enablePullUp: true, | |||||
header: WaterDropHeader(), | |||||
onLoading: _onLoading, | |||||
child: Container( | |||||
width: double.infinity, | |||||
child: Stack( | |||||
fit: StackFit.passthrough, | |||||
children: <Widget>[ | |||||
StreamBuilder( | |||||
stream: _pageBloc.outData, | |||||
builder: (context, asyncSnapshot) { | |||||
var model = asyncSnapshot.data; | |||||
return Stack( | |||||
children: <Widget>[ | |||||
Container(height: 362.h, color: _pageBloc.backgroundColor), | |||||
CustomScrollView( | |||||
double top = MediaQueryData.fromWindow(window).padding.top; | |||||
return Container( | |||||
width: double.infinity, | |||||
child: Stack( | |||||
fit: StackFit.passthrough, | |||||
children: <Widget>[ | |||||
StreamBuilder( | |||||
stream: _pageBloc.outData, | |||||
builder: (context, asyncSnapshot) { | |||||
var model = asyncSnapshot.data; | |||||
_refreshController.refreshCompleted(); | |||||
return Stack( | |||||
children: <Widget>[ | |||||
Container(height: 362.h, color: _pageBloc.backgroundColor), | |||||
SmartRefresher( | |||||
controller: _refreshController, | |||||
enablePullDown: true, | |||||
enablePullUp: false, | |||||
header: RefreshHeader( | |||||
offsetY: top, | |||||
), | |||||
onLoading: _onLoading, | |||||
onRefresh: _onRefresh, | |||||
child: CustomScrollView( | |||||
controller: _controller, | |||||
slivers: _createContent(context, model), | slivers: _createContent(context, model), | ||||
) | |||||
], | |||||
); | |||||
}, | |||||
) | |||||
], | |||||
), | |||||
), | |||||
) | |||||
], | |||||
); | |||||
}, | |||||
) | |||||
], | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
List<Widget> _createContent( | |||||
BuildContext context, List<Map<String, dynamic>> model) { | |||||
List<Widget> _createContent(BuildContext context, List<Map<String, dynamic>> model) { | |||||
List<Widget> list = List(); | List<Widget> list = List(); | ||||
if (model == null) { | if (model == null) { | ||||
///骨架图 | ///骨架图 | ||||
@@ -127,10 +148,8 @@ class _WalletPageContainerState extends State<_WalletPageContainer> { | |||||
)); | )); | ||||
} else { | } else { | ||||
for (var item in model) { | for (var item in model) { | ||||
WidgetModel widgetModel = | |||||
WidgetModel.fromJson(Map<String, dynamic>.from(item)); | |||||
list.addAll(WidgetFactory.create(widgetModel.modName, | |||||
isSliver: true, model: item)); | |||||
WidgetModel widgetModel = WidgetModel.fromJson(Map<String, dynamic>.from(item)); | |||||
list.addAll(WidgetFactory.create(widgetModel.modName, isSliver: true, model: item)); | |||||
} | } | ||||
} | } | ||||
return list; | return list; | ||||
@@ -152,8 +171,7 @@ class _SilverAppBarDelegate extends SliverPersistentHeaderDelegate { | |||||
double get maxExtent => MediaQuery.of(context).padding.top + 44; | double get maxExtent => MediaQuery.of(context).padding.top + 44; | ||||
@override | @override | ||||
Widget build( | |||||
BuildContext context, double shrinkOffset, bool overlapsContent) { | |||||
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { | |||||
return child; | return child; | ||||
} | } | ||||
@@ -126,7 +126,9 @@ class _CounponWidgetContainerState extends State<CounponWidgetContainer> { | |||||
Text(model?.coupon_title ?? '优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex(model?.coupon_title_color ?? '#FFFFFF'))), | Text(model?.coupon_title ?? '优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex(model?.coupon_title_color ?? '#FFFFFF'))), | ||||
/// 到期时间 | /// 到期时间 | ||||
Text(model?.coupon_endtime ?? '有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex(model?.coupon_time_color ?? '#FFFFFF'))) | |||||
Visibility( | |||||
visible: !EmptyUtil.isEmpty(model?.coupon_endtime), | |||||
child: Text(model?.coupon_endtime ?? '有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex(model?.coupon_time_color ?? '#FFFFFF')))) | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
@@ -45,8 +45,8 @@ class _HomeNoticeWidgetContianerState extends State<HomeNoticeWidgetContianer> { | |||||
/// 子item跳转 | /// 子item跳转 | ||||
void _itemJump(HomeNoticeNoticesModel model){ | void _itemJump(HomeNoticeNoticesModel model){ | ||||
print('${model?.skip_identifier}'); | |||||
// RouterUtil.route(model, model.toJson(), context); | |||||
print('${model?.notice_text}'); | |||||
RouterUtil.route(model, model.toJson(), context); | |||||
} | } | ||||
@override | @override | ||||
@@ -1,3 +1,4 @@ | |||||
import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/no_goods_dialog_style_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
class HomeNoticeModel { | class HomeNoticeModel { | ||||
@@ -38,21 +39,20 @@ class HomeNoticeModel { | |||||
} | } | ||||
} | } | ||||
class HomeNoticeNoticesModel{ | |||||
class HomeNoticeNoticesModel extends SkipModel{ | |||||
String notice_text; | String notice_text; | ||||
String skip_identifier; | String skip_identifier; | ||||
HomeNoticeNoticesModel({this.notice_text, this.skip_identifier}); | HomeNoticeNoticesModel({this.notice_text, this.skip_identifier}); | ||||
factory HomeNoticeNoticesModel.fromJson(Map<String, dynamic> json) { | |||||
return HomeNoticeNoticesModel( | |||||
notice_text: json['notice_text']?.toString(), | |||||
skip_identifier: json['skip_identifier']?.toString(), | |||||
); | |||||
HomeNoticeNoticesModel.fromJson(Map<String, dynamic> json) { | |||||
super.fromJson(json); | |||||
notice_text = json['notice_text']?.toString(); | |||||
skip_identifier = json['skip_identifier']?.toString(); | |||||
} | } | ||||
Map<String, dynamic> toJson() { | Map<String, dynamic> toJson() { | ||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
Map<String, dynamic> data = super.toJson(); | |||||
data['img'] = this.notice_text; | data['img'] = this.notice_text; | ||||
data['skip_identifier'] = this.skip_identifier; | data['skip_identifier'] = this.skip_identifier; | ||||
return data; | return data; | ||||
@@ -34,7 +34,7 @@ class _HomeQuickEntryContianerState extends State<HomeQuickEntryContianer> { | |||||
/// Icon点击事件 | /// Icon点击事件 | ||||
void _itemIconClick(TypeNormal model){ | void _itemIconClick(TypeNormal model){ | ||||
print("item type = ${model.skip_identifier}"); | print("item type = ${model.skip_identifier}"); | ||||
// RouterUtil.route(model, model.toJson(), context); | |||||
RouterUtil.route(model, model.toJson(), context); | |||||
} | } | ||||
@override | @override | ||||
@@ -104,7 +104,7 @@ class _HomeQuickEntryContianerState extends State<HomeQuickEntryContianer> { | |||||
return Container( | return Container( | ||||
color: Colors.white, | color: Colors.white, | ||||
child: Container( | child: Container( | ||||
margin: const EdgeInsets.only(top: 15, bottom: 15 ), | |||||
margin: EdgeInsets.only(top: 15, bottom: totalPage >1 ? 15 : 0 ), | |||||
height: totalHeight, // 总体高度 | height: totalHeight, // 总体高度 | ||||
width: double.infinity, | width: double.infinity, | ||||
color: Colors.white, | color: Colors.white, | ||||
@@ -129,7 +129,7 @@ class _HomeQuickEntryContianerState extends State<HomeQuickEntryContianer> { | |||||
), | ), | ||||
); | ); | ||||
}, | }, | ||||
pagination: _getSwiperPaginationContorl(model, totalPage), | |||||
pagination: totalPage <= 1 ? null : _getSwiperPaginationContorl(model, totalPage), | |||||
), | ), | ||||
), | ), | ||||
); | ); | ||||
@@ -1,3 +1,5 @@ | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class HomeQuickEntryModel { | class HomeQuickEntryModel { | ||||
String colum_size; | String colum_size; | ||||
String data_type; | String data_type; | ||||
@@ -63,7 +65,7 @@ class HomeQuickEntryModel { | |||||
} | } | ||||
} | } | ||||
class TypeNormal { | |||||
class TypeNormal extends SkipModel { | |||||
String img; | String img; | ||||
String required_login; | String required_login; | ||||
String required_taobao_auth; | String required_taobao_auth; | ||||
@@ -74,20 +76,19 @@ class TypeNormal { | |||||
TypeNormal({this.img, this.required_login, this.required_taobao_auth, this.skip_identifier, this.title_1, this.title_2, this.type}); | TypeNormal({this.img, this.required_login, this.required_taobao_auth, this.skip_identifier, this.title_1, this.title_2, this.type}); | ||||
factory TypeNormal.fromJson(Map<String, dynamic> json) { | |||||
return TypeNormal( | |||||
img: json['img']?.toString(), | |||||
required_login: json['required_login']?.toString(), | |||||
required_taobao_auth: json['required_taobao_auth']?.toString(), | |||||
skip_identifier: json['skip_identifier']?.toString(), | |||||
title_1: json['title_1']?.toString(), | |||||
title_2: json['title_2']?.toString(), | |||||
type: json['type']?.toString(), | |||||
); | |||||
TypeNormal.fromJson(Map<String, dynamic> json) { | |||||
super.fromJson(json); | |||||
img = json['img']?.toString(); | |||||
required_login = json['required_login']?.toString(); | |||||
required_taobao_auth = json['required_taobao_auth']?.toString(); | |||||
skip_identifier = json['skip_identifier']?.toString(); | |||||
title_1 = json['title_1']?.toString(); | |||||
title_2 = json['title_2']?.toString(); | |||||
type = json['type']?.toString(); | |||||
} | } | ||||
Map<String, dynamic> toJson() { | Map<String, dynamic> toJson() { | ||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
final Map<String, dynamic> data = super.toJson(); | |||||
data['img'] = this.img; | data['img'] = this.img; | ||||
data['required_login'] = this.required_login; | data['required_login'] = this.required_login; | ||||
data['required_taobao_auth'] = this.required_taobao_auth; | data['required_taobao_auth'] = this.required_taobao_auth; | ||||
@@ -48,7 +48,7 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
/// 子元素点击事件 | /// 子元素点击事件 | ||||
void _itemOnClick(IndexCarousel model) { | void _itemOnClick(IndexCarousel model) { | ||||
print('点击了 $model'); | print('点击了 $model'); | ||||
// RouterUtil.route(model, model.toJson(), context); | |||||
RouterUtil.route(model, model.toJson(), context); | |||||
// Navigator.push(context, CupertinoPageRoute( | // Navigator.push(context, CupertinoPageRoute( | ||||
// builder: (_) => PageFactory.create('goods_details', null) | // builder: (_) => PageFactory.create('goods_details', null) | ||||
// )); | // )); | ||||
@@ -1,58 +1,58 @@ | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class HomeSlideBannerModel { | class HomeSlideBannerModel { | ||||
List<IndexCarousel> index_carousel_list; | |||||
String pagination; | |||||
String pagination_open; | |||||
List<String> pagination_options; | |||||
String pagination_select_color; | |||||
String pagination_unselect_color; | |||||
HomeSlideBannerModel({this.index_carousel_list, this.pagination, this.pagination_open, this.pagination_options, this.pagination_select_color, this.pagination_unselect_color}); | |||||
factory HomeSlideBannerModel.fromJson(Map<String, dynamic> json) { | |||||
return HomeSlideBannerModel( | |||||
index_carousel_list: json['index_carousel_list'] != null ? (json['index_carousel_list'] as List).map((i) => IndexCarousel.fromJson(i)).toList() : null, | |||||
pagination: json['pagination'], | |||||
pagination_open: json['pagination_open'], | |||||
pagination_options: json['pagination_options'] != null ? new List<String>.from(json['pagination_options']) : null, | |||||
pagination_select_color: json['pagination_select_color'], | |||||
pagination_unselect_color: json['pagination_unselect_color'], | |||||
); | |||||
List<IndexCarousel> index_carousel_list; | |||||
String pagination; | |||||
String pagination_open; | |||||
List<String> pagination_options; | |||||
String pagination_select_color; | |||||
String pagination_unselect_color; | |||||
HomeSlideBannerModel({this.index_carousel_list, this.pagination, this.pagination_open, this.pagination_options, this.pagination_select_color, this.pagination_unselect_color}); | |||||
factory HomeSlideBannerModel.fromJson(Map<String, dynamic> json) { | |||||
return HomeSlideBannerModel( | |||||
index_carousel_list: json['index_carousel_list'] != null ? (json['index_carousel_list'] as List).map((i) => IndexCarousel.fromJson(i)).toList() : null, | |||||
pagination: json['pagination'], | |||||
pagination_open: json['pagination_open'], | |||||
pagination_options: json['pagination_options'] != null ? new List<String>.from(json['pagination_options']) : null, | |||||
pagination_select_color: json['pagination_select_color'], | |||||
pagination_unselect_color: json['pagination_unselect_color'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['pagination'] = this.pagination; | |||||
data['pagination_open'] = this.pagination_open; | |||||
data['pagination_select_color'] = this.pagination_select_color; | |||||
data['pagination_unselect_color'] = this.pagination_unselect_color; | |||||
if (this.index_carousel_list != null) { | |||||
data['index_carousel_list'] = this.index_carousel_list.map((v) => v.toJson()).toList(); | |||||
} | } | ||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['pagination'] = this.pagination; | |||||
data['pagination_open'] = this.pagination_open; | |||||
data['pagination_select_color'] = this.pagination_select_color; | |||||
data['pagination_unselect_color'] = this.pagination_unselect_color; | |||||
if (this.index_carousel_list != null) { | |||||
data['index_carousel_list'] = this.index_carousel_list.map((v) => v.toJson()).toList(); | |||||
} | |||||
if (this.pagination_options != null) { | |||||
data['pagination_options'] = this.pagination_options; | |||||
} | |||||
return data; | |||||
if (this.pagination_options != null) { | |||||
data['pagination_options'] = this.pagination_options; | |||||
} | } | ||||
return data; | |||||
} | |||||
} | } | ||||
class IndexCarousel { | |||||
String img; | |||||
String skip_identifier; | |||||
class IndexCarousel extends SkipModel { | |||||
String img; | |||||
String skip_identifier; | |||||
IndexCarousel({this.img, this.skip_identifier}); | |||||
IndexCarousel({this.img, this.skip_identifier}); | |||||
factory IndexCarousel.fromJson(Map<String, dynamic> json) { | |||||
return IndexCarousel( | |||||
img: json['img'], | |||||
skip_identifier: json['skip_identifier'], | |||||
); | |||||
} | |||||
IndexCarousel.fromJson(Map<String, dynamic> json) { | |||||
super.toJson(); | |||||
img = json['img']; | |||||
skip_identifier = json['skip_identifier']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['img'] = this.img; | |||||
data['skip_identifier'] = this.skip_identifier; | |||||
return data; | |||||
} | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = super.toJson(); | |||||
data['img'] = this.img; | |||||
data['skip_identifier'] = this.skip_identifier; | |||||
return data; | |||||
} | |||||
} |
@@ -6,6 +6,8 @@ import 'package:zhiying_base_widget/pages/hot_ranking_page/hot_ranking_page_bloc | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart'; | import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart'; | ||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart'; | import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_model.dart'; | import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/refresh/refresh_footer/refresh_footer.dart'; | |||||
import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_header.dart'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | import 'package:zhiying_comm/util/base_bloc.dart'; | ||||
import 'hot_ranking_bloc.dart'; | import 'hot_ranking_bloc.dart'; | ||||
@@ -82,6 +84,8 @@ class _HotRankingState extends State<HotRankingList> | |||||
enablePullUp: true, | enablePullUp: true, | ||||
onLoading: _onLoading, | onLoading: _onLoading, | ||||
onRefresh: _onRefresh, | onRefresh: _onRefresh, | ||||
header: RefreshHeader(), | |||||
footer: RefreshFooter(), | |||||
child: CustomScrollView( | child: CustomScrollView( | ||||
controller: _scrollcontroller, | controller: _scrollcontroller, | ||||
slivers: <Widget>[ | slivers: <Widget>[ | ||||
@@ -0,0 +1,18 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:pull_to_refresh/pull_to_refresh.dart'; | |||||
class RefreshFooter extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return CustomFooter( | |||||
height: 1, | |||||
builder: (BuildContext context, LoadStatus model){ | |||||
return Container( | |||||
height: 1, | |||||
width: double.infinity, | |||||
); | |||||
}, | |||||
); | |||||
} | |||||
} |
@@ -37,6 +37,7 @@ class SearchAppbarWidget extends StatelessWidget { | |||||
return AppBar( | return AppBar( | ||||
backgroundColor: Colors.transparent, | backgroundColor: Colors.transparent, | ||||
elevation: 0, | elevation: 0, | ||||
brightness: Brightness.light, | |||||
leading: IconButton( | leading: IconButton( | ||||
icon: Icon( | icon: Icon( | ||||
Icons.arrow_back_ios, | Icons.arrow_back_ios, | ||||