@@ -61,6 +61,10 @@ class _MyAppState extends State<MyApp> { | |||||
ChangeNotifierProvider.value(value: UserInfoNotifier()), | ChangeNotifierProvider.value(value: UserInfoNotifier()), | ||||
], | ], | ||||
child: MaterialApp( | child: MaterialApp( | ||||
theme: ThemeData( | |||||
primaryColor: HexColor.fromHex('#FF4242'), | |||||
accentColor: HexColor.fromHex('#FF4242'), | |||||
), | |||||
routes: <String, WidgetBuilder>{ | routes: <String, WidgetBuilder>{ | ||||
'/homePage': (BuildContext context) => HomePage() , | '/homePage': (BuildContext context) => HomePage() , | ||||
}, | }, | ||||
@@ -0,0 +1,84 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'activity_dialog_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | |||||
/// 活动弹窗接口 | |||||
/// | |||||
class ActivityDialog extends StatelessWidget { | |||||
final ActivityDialogModel model; | |||||
const ActivityDialog(this.model, {Key key}) : super(key: key); | |||||
static Future show(BuildContext context) async { | |||||
try { | |||||
Map result = await NetUtil.post('/api/v1/mod/pub.flutter.current_activity_dialog', method: NetMethod.GET); | |||||
if (!EmptyUtil.isEmpty(result)) { | |||||
var modListData = result['data']['mod_list'][0]['data']; | |||||
if (!EmptyUtil.isEmpty(modListData)) { | |||||
Map<String, dynamic> da = Map<String, dynamic>.from(jsonDecode(modListData)); | |||||
ActivityDialogModel model = ActivityDialogModel.fromJson(Map<String, dynamic>.from(da)); | |||||
if(!EmptyUtil.isEmpty(model) && model.isOpen == '1' ) { | |||||
return await showCupertinoDialog(context: context, builder: (_) => ActivityDialog(model)); | |||||
} | |||||
} | |||||
} | |||||
} catch (e, s) { | |||||
Logger.error(e, s); | |||||
} | |||||
} | |||||
/// 跳转 | |||||
void _jumpTo(BuildContext context){ | |||||
Navigator.maybePop(context); | |||||
if(!EmptyUtil.isEmpty(model)){ | |||||
RouterUtil.route(model, model.toJson(), context); | |||||
} | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Scaffold( | |||||
backgroundColor: Colors.transparent, | |||||
body: Container( | |||||
width: double.infinity, | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.center, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | |||||
/// 图片 | |||||
GestureDetector( | |||||
onTap: ()=> _jumpTo(context), | |||||
behavior: HitTestBehavior.opaque, | |||||
child: Container( | |||||
// margin: const EdgeInsets.symmetric(horizontal: 40), | |||||
width: MediaQuery.of(context).size.width * 0.7, | |||||
child: CachedNetworkImage( | |||||
imageUrl: model?.img ?? '', | |||||
), | |||||
), | |||||
), | |||||
/// 关闭按钮 | |||||
GestureDetector( | |||||
child: Container( | |||||
width: 30, | |||||
height: 30, | |||||
margin: EdgeInsets.only(top: 10), | |||||
child: CachedNetworkImage(imageUrl: model?.btnImg ?? '',), | |||||
), | |||||
onTap: () { | |||||
Navigator.pop(context); | |||||
}, | |||||
) | |||||
], | |||||
), | |||||
), | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,43 @@ | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class ActivityDialogModel extends SkipModel { | |||||
String isOpen; | |||||
String name; | |||||
String img; | |||||
String btnImg; | |||||
String skipType; | |||||
String url; | |||||
String skipIdentifier; | |||||
ActivityDialogModel( | |||||
{this.isOpen, | |||||
this.name, | |||||
this.img, | |||||
this.btnImg, | |||||
this.skipType, | |||||
this.url, | |||||
this.skipIdentifier}); | |||||
ActivityDialogModel.fromJson(Map<String, dynamic> json) { | |||||
super.fromJson(json); | |||||
isOpen = json['is_open']; | |||||
name = json['name']; | |||||
img = json['img']; | |||||
btnImg = json['btn_img']; | |||||
skipType = json['skip_type']; | |||||
url = json['url']; | |||||
skipIdentifier = json['skip_identifier']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = super.toJson(); | |||||
data['is_open'] = this.isOpen; | |||||
data['name'] = this.name; | |||||
data['img'] = this.img; | |||||
data['btn_img'] = this.btnImg; | |||||
data['skip_type'] = this.skipType; | |||||
data['url'] = this.url; | |||||
data['skip_identifier'] = this.skipIdentifier; | |||||
return data; | |||||
} | |||||
} |
@@ -10,6 +10,7 @@ class CustomPageRepository { | |||||
try { | try { | ||||
String skipIdentifier = | String skipIdentifier = | ||||
!EmptyUtil.isEmpty(data) && data.containsKey(GlobalConfig.SKIP_IDENTIFIER) && !EmptyUtil.isEmpty(data[GlobalConfig.SKIP_IDENTIFIER]) ? data[GlobalConfig.SKIP_IDENTIFIER] : null; | !EmptyUtil.isEmpty(data) && data.containsKey(GlobalConfig.SKIP_IDENTIFIER) && !EmptyUtil.isEmpty(data[GlobalConfig.SKIP_IDENTIFIER]) ? data[GlobalConfig.SKIP_IDENTIFIER] : null; | ||||
// String skipIdentifier = 'pub.flutter.index.84'; | |||||
if (!EmptyUtil.isEmpty(skipIdentifier)) { | if (!EmptyUtil.isEmpty(skipIdentifier)) { | ||||
var result = await NetUtil.post('/api/v1/mod/$skipIdentifier', method: NetMethod.GET, cache: true); | var result = await NetUtil.post('/api/v1/mod/$skipIdentifier', method: NetMethod.GET, cache: true); | ||||
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | ||||
@@ -30,6 +31,7 @@ class CustomPageRepository { | |||||
try { | try { | ||||
String skipIdentifier = | String skipIdentifier = | ||||
!EmptyUtil.isEmpty(data) && data.containsKey(GlobalConfig.SKIP_IDENTIFIER) && !EmptyUtil.isEmpty(data[GlobalConfig.SKIP_IDENTIFIER]) ? data[GlobalConfig.SKIP_IDENTIFIER] : null; | !EmptyUtil.isEmpty(data) && data.containsKey(GlobalConfig.SKIP_IDENTIFIER) && !EmptyUtil.isEmpty(data[GlobalConfig.SKIP_IDENTIFIER]) ? data[GlobalConfig.SKIP_IDENTIFIER] : null; | ||||
// String skipIdentifier = 'pub.flutter.index.84'; | |||||
if (!EmptyUtil.isEmpty(skipIdentifier)) { | if (!EmptyUtil.isEmpty(skipIdentifier)) { | ||||
var result = await NetUtil.getRequestCachedData('/api/v1/mod/$skipIdentifier'); | var result = await NetUtil.getRequestCachedData('/api/v1/mod/$skipIdentifier'); | ||||
if (!EmptyUtil.isEmpty(result)) { | if (!EmptyUtil.isEmpty(result)) { | ||||
@@ -11,6 +11,8 @@ import 'bloc/custom_item_page_bloc.dart'; | |||||
import 'bloc/custom_item_page_state.dart'; | import 'bloc/custom_item_page_state.dart'; | ||||
import 'bloc/custom_item_page_event.dart'; | import 'bloc/custom_item_page_event.dart'; | ||||
import 'bloc/custom_item_page_repository.dart'; | import 'bloc/custom_item_page_repository.dart'; | ||||
import 'dart:ui'; | |||||
import 'package:zhiying_comm/util/custom_sliver_persistent_header_delegate.dart'; | |||||
/// | /// | ||||
/// 通用模块的分类导航下的子模块 | /// 通用模块的分类导航下的子模块 | ||||
@@ -21,8 +23,9 @@ class CustomItemPage extends StatelessWidget { | |||||
final int tabIndex; | final int tabIndex; | ||||
final String modPid; | final String modPid; | ||||
final String modId; | final String modId; | ||||
final bool needBuildStatus; | |||||
CustomItemPage(this.data, this.tabIndex, this.modId, this.modPid); | |||||
CustomItemPage(this.data, this.tabIndex, this.modId, this.modPid, this.needBuildStatus); | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
@@ -32,13 +35,7 @@ class CustomItemPage extends StatelessWidget { | |||||
], | ], | ||||
child: BlocProvider<CustomItemPageBloc>( | child: BlocProvider<CustomItemPageBloc>( | ||||
create: (_) => CustomItemPageBloc(CustomItemPageRepository(this.data, this.tabIndex, this.modId, this.modPid)), | create: (_) => CustomItemPageBloc(CustomItemPageRepository(this.data, this.tabIndex, this.modId, this.modPid)), | ||||
child: _CustomItemPageContainer( | |||||
this.data, | |||||
this.tabIndex, | |||||
this.modId, | |||||
this.modPid, | |||||
key: UniqueKey(), | |||||
), | |||||
child: _CustomItemPageContainer(this.data, this.tabIndex, this.modId, this.modPid, this.needBuildStatus), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -49,8 +46,9 @@ class _CustomItemPageContainer extends StatefulWidget { | |||||
final int tabIndex; | final int tabIndex; | ||||
final String modPid; | final String modPid; | ||||
final String modId; | final String modId; | ||||
final bool needBuildStatus; | |||||
const _CustomItemPageContainer(this.data, this.tabIndex, this.modId, this.modPid, {Key key}) : super(key: key); | |||||
const _CustomItemPageContainer(this.data, this.tabIndex, this.modId, this.modPid, this.needBuildStatus, {Key key}) : super(key: key); | |||||
@override | @override | ||||
__CustomItemPageContainerState createState() => __CustomItemPageContainerState(); | __CustomItemPageContainerState createState() => __CustomItemPageContainerState(); | ||||
@@ -83,7 +81,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit | |||||
void _loadEvent() { | void _loadEvent() { | ||||
// BlocProvider.of<CustomItemPageBloc>(context).add(CustomItemPageLoadEvent()); | // BlocProvider.of<CustomItemPageBloc>(context).add(CustomItemPageLoadEvent()); | ||||
Provider.of<MainPageNotifier>(context, listen: false).loadMore(); | Provider.of<MainPageNotifier>(context, listen: false).loadMore(); | ||||
Future.delayed(Duration(seconds: 1),()=> _refreshController?.loadComplete()); | |||||
Future.delayed(Duration(milliseconds: 500), () => _refreshController?.loadComplete()); | |||||
} | } | ||||
@override | @override | ||||
@@ -146,7 +144,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit | |||||
Widget _buildMainWidget(final List<Map<String, dynamic>> model) { | Widget _buildMainWidget(final List<Map<String, dynamic>> model) { | ||||
return MediaQuery.removePadding( | return MediaQuery.removePadding( | ||||
context: context, | context: context, | ||||
removeTop: true, | |||||
removeTop: false, | |||||
child: SmartRefresher( | child: SmartRefresher( | ||||
controller: _refreshController, | controller: _refreshController, | ||||
enablePullDown: true, | enablePullDown: true, | ||||
@@ -154,7 +152,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit | |||||
onRefresh: _refreshEvent, | onRefresh: _refreshEvent, | ||||
onLoading: _loadEvent, | onLoading: _loadEvent, | ||||
header: RefreshHeader(), | header: RefreshHeader(), | ||||
footer: RefreshFooter(), | |||||
// footer: RefreshFooter(), | |||||
child: CustomScrollView( | child: CustomScrollView( | ||||
controller: _controller, | controller: _controller, | ||||
slivers: _buildContentWidgets(model), | slivers: _buildContentWidgets(model), | ||||
@@ -174,13 +172,34 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit | |||||
model: datas[i], | model: datas[i], | ||||
)); | )); | ||||
} | } | ||||
if (widget.needBuildStatus) { | |||||
double top = MediaQueryData.fromWindow(window).padding.top; | |||||
result.insert( | |||||
0, | |||||
SliverPersistentHeader( | |||||
pinned: true, | |||||
floating: false, | |||||
delegate: CustomSliverPersistentHeaderDelegate(max: top, min: top, child: Container( | |||||
// color: Colors.yellow, | |||||
color: HexColor.fromHex('#FFFF4242'), | |||||
)), | |||||
)); | |||||
} | |||||
return result; | return result; | ||||
} | } | ||||
/// 空数据 | /// 空数据 | ||||
Widget _buildEmptyWidget() { | Widget _buildEmptyWidget() { | ||||
return Container( | |||||
child: EmptyWidget(), | |||||
return SmartRefresher( | |||||
controller: _refreshController, | |||||
onRefresh: _refreshEvent, | |||||
enablePullDown: true, | |||||
child: Container( | |||||
child: EmptyWidget(), | |||||
), | |||||
); | ); | ||||
} | } | ||||
@@ -7,6 +7,7 @@ import 'package:zhiying_base_widget/pages/custom_page/custom_item_page.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/widgets/custom/search/custom_search_widget.dart'; | import 'package:zhiying_base_widget/widgets/custom/search/custom_search_widget.dart'; | ||||
import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart'; | import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart'; | ||||
import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
@@ -21,21 +22,25 @@ import 'package:fluttertoast/fluttertoast.dart'; | |||||
/// | /// | ||||
/// 通用模块页面 | /// 通用模块页面 | ||||
/// | /// | ||||
class CustomPage extends StatelessWidget { | |||||
class CustomPage extends StatefulWidget { | |||||
final Map<String, dynamic> data; | final Map<String, dynamic> data; | ||||
CustomPage(this.data, {Key key}) : super(key: key); | CustomPage(this.data, {Key key}) : super(key: key); | ||||
@override | |||||
_CustomPageState createState() => _CustomPageState(); | |||||
} | |||||
class _CustomPageState extends State<CustomPage> { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
// return NestedScrollDemoPage(); | |||||
return MultiProvider( | return MultiProvider( | ||||
providers: [ | providers: [ | ||||
ChangeNotifierProvider.value(value: MainPageBgNotifier()), | ChangeNotifierProvider.value(value: MainPageBgNotifier()), | ||||
], | ], | ||||
child: BlocProvider<CustomPageBloc>( | child: BlocProvider<CustomPageBloc>( | ||||
create: (_) => CustomPageBloc(CustomPageRepository(data: data))..add(CustomPageInitEvent()), | |||||
child: _CommonPageContainer(data), | |||||
create: (_) => CustomPageBloc(CustomPageRepository(data: widget?.data))..add(CustomPageInitEvent()), | |||||
child: _CommonPageContainer(widget?.data), | |||||
// ), | // ), | ||||
), | ), | ||||
); | ); | ||||
@@ -54,6 +59,12 @@ class _CommonPageContainer extends StatefulWidget { | |||||
class __CommonPageContainerState extends State<_CommonPageContainer> with SingleTickerProviderStateMixin { | class __CommonPageContainerState extends State<_CommonPageContainer> with SingleTickerProviderStateMixin { | ||||
TabController _tabController; | TabController _tabController; | ||||
// 是否有AppBar | |||||
bool _isHasAppbar = false; | |||||
// 是否有TabBar | |||||
bool _isHasTabBar = false; | |||||
/// 刷新 | /// 刷新 | ||||
void _onRefreshEvent() async { | void _onRefreshEvent() async { | ||||
BlocProvider.of<CustomPageBloc>(context).add(CustomPageRefreshEvent()); | BlocProvider.of<CustomPageBloc>(context).add(CustomPageRefreshEvent()); | ||||
@@ -106,14 +117,36 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
/// 有数据 | /// 有数据 | ||||
Widget _buildMainWidget(List<Map<String, dynamic>> model) { | Widget _buildMainWidget(List<Map<String, dynamic>> model) { | ||||
return Scaffold( | |||||
appBar: _buildAppbar(model?.first), | |||||
backgroundColor: HexColor.fromHex('#F9F9F9'), | |||||
// floatingActionButton: _buildFloatWidget(), | |||||
floatingActionButtonLocation: _CustomFloatingActionButtonLocation(FloatingActionButtonLocation.endFloat, 0, -100), | |||||
body: Column( | |||||
children: _buildFirstWidget(model), | |||||
), | |||||
return Stack( | |||||
children: <Widget>[ | |||||
// 背景 | |||||
Column( | |||||
children: <Widget>[ | |||||
// Container( | |||||
// width: double.infinity, | |||||
// height: 190, | |||||
// color: HexColor.fromHex('#FF4242'), | |||||
// ), | |||||
Expanded( | |||||
child: Container( | |||||
height: double.infinity, | |||||
width: double.infinity, | |||||
color: HexColor.fromHex('#F9F9F9'), | |||||
), | |||||
) | |||||
], | |||||
), | |||||
// MineHeaderBgWidget(controller: null), | |||||
Scaffold( | |||||
appBar: _buildAppbar(model?.first), | |||||
backgroundColor: Colors.transparent, | |||||
// floatingActionButton: _buildFloatWidget(), | |||||
floatingActionButtonLocation: _CustomFloatingActionButtonLocation(FloatingActionButtonLocation.endFloat, 0, -100), | |||||
body: Column(children: _buildFirstWidget(model)), | |||||
), | |||||
], | |||||
); | ); | ||||
} | } | ||||
@@ -177,7 +210,7 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
List<Widget> result = []; | List<Widget> result = []; | ||||
// 分类导航的key ⚠️ 这里先写成Test 后续要改 | // 分类导航的key ⚠️ 这里先写成Test 后续要改 | ||||
const String CATEGORY_KEY = 'category_test'; | |||||
const String CATEGORY_KEY = 'category'; | |||||
// 判断是否有分类导航 | // 判断是否有分类导航 | ||||
// 判断最后一个是否属于分类导航,如果属于,则有分类导航,如果不是,则无分类导航 | // 判断最后一个是否属于分类导航,如果属于,则有分类导航,如果不是,则无分类导航 | ||||
bool haveCategory = !EmptyUtil.isEmpty(model?.last) && model.last.containsKey('mod_name') && model.last['mod_name'] == CATEGORY_KEY; | bool haveCategory = !EmptyUtil.isEmpty(model?.last) && model.last.containsKey('mod_name') && model.last['mod_name'] == CATEGORY_KEY; | ||||
@@ -197,7 +230,7 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(model[i])); | WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(model[i])); | ||||
// last model | // last model | ||||
if (i == endIndexLength - 1) { | if (i == endIndexLength - 1) { | ||||
result.addAll(_buildTabBar(model[i])); | |||||
result.addAll(_buildTabBar(model[i], i)); | |||||
break; | break; | ||||
} | } | ||||
@@ -205,12 +238,12 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
if (item.modName.contains('appbar')) { | if (item.modName.contains('appbar')) { | ||||
continue; | continue; | ||||
} | } | ||||
result.addAll(WidgetFactory.create(item.modName, isSliver: false, model: model[i])); | |||||
} | |||||
result.addAll(WidgetFactory.create( | |||||
item.modName, | |||||
isSliver: false, | |||||
model: model[i], | |||||
)); | |||||
// 没有appbar并且有tabbar,则给第一个元素加边距 | |||||
if (!_isHasAppbar && _isHasTabBar) { | |||||
result.insert(0, SizedBox(height: MediaQueryData.fromWindow(window).padding.top)); | |||||
} | } | ||||
return result; | return result; | ||||
@@ -227,9 +260,8 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
} catch (e, s) { | } catch (e, s) { | ||||
Logger.warn(e, s); | Logger.warn(e, s); | ||||
} | } | ||||
String parentTitle = !EmptyUtil.isEmpty(widget?.data) ? widget?.data['title_1'] ?? '' : ''; | String parentTitle = !EmptyUtil.isEmpty(widget?.data) ? widget?.data['title_1'] ?? '' : ''; | ||||
_isHasAppbar = true; | |||||
return AppBar( | return AppBar( | ||||
backgroundColor: HexColor.fromHex(null != data ? data['app_bar_bg_color'] ?? '#FFFFFF' : '#FFFFFF'), | backgroundColor: HexColor.fromHex(null != data ? data['app_bar_bg_color'] ?? '#FFFFFF' : '#FFFFFF'), | ||||
brightness: Brightness.light, | brightness: Brightness.light, | ||||
@@ -255,7 +287,7 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
} | } | ||||
/// tabBar | /// tabBar | ||||
List<Widget> _buildTabBar(final Map<String, dynamic> model) { | |||||
List<Widget> _buildTabBar(final Map<String, dynamic> model, final int index) { | |||||
Map<String, dynamic> data = Map<String, dynamic>(); | Map<String, dynamic> data = Map<String, dynamic>(); | ||||
List<Map<String, dynamic>> listStyle = []; | List<Map<String, dynamic>> listStyle = []; | ||||
List<Widget> result = []; | List<Widget> result = []; | ||||
@@ -269,7 +301,7 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
// 1、导航栏没开启的情况 传null进去进行获取没开启导航栏的widget集合 | // 1、导航栏没开启的情况 传null进去进行获取没开启导航栏的widget集合 | ||||
if (EmptyUtil.isEmpty(listStyle)) { | if (EmptyUtil.isEmpty(listStyle)) { | ||||
result.add(Expanded( | result.add(Expanded( | ||||
child: CustomItemPage(null, 0, model['mod_id']?.toString() ?? null, model['mod_pid']?.toString() ?? null), | |||||
child: CustomItemPage(null, 0, model['mod_id']?.toString() ?? null, model['mod_pid']?.toString() ?? null, (!_isHasAppbar && index == 0 )), | |||||
)); | )); | ||||
return result; | return result; | ||||
} | } | ||||
@@ -280,10 +312,11 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
if (null == _tabController || _tabController.length != listStyle.length) { | if (null == _tabController || _tabController.length != listStyle.length) { | ||||
_tabController = new TabController(length: listStyle.length, vsync: this); | _tabController = new TabController(length: listStyle.length, vsync: this); | ||||
} | } | ||||
result.add(Container( | result.add(Container( | ||||
height: 40, | height: 40, | ||||
width: double.infinity, | width: double.infinity, | ||||
color: HexColor.fromHex('#FFFFFF'), | |||||
// color: HexColor.fromHex('#FFFFFF'), | |||||
child: TabBar( | child: TabBar( | ||||
controller: _tabController, | controller: _tabController, | ||||
isScrollable: /*listStyle.length <= 5 ? false : */ true, | isScrollable: /*listStyle.length <= 5 ? false : */ true, | ||||
@@ -305,11 +338,12 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
), | ), | ||||
)); | )); | ||||
_isHasTabBar = true; | |||||
// 最后添加TabBarView | // 最后添加TabBarView | ||||
result.add(Expanded( | result.add(Expanded( | ||||
child: TabBarView( | child: TabBarView( | ||||
controller: _tabController, | controller: _tabController, | ||||
children: _buildTabBarViewChildren(listStyle, model['mod_id']?.toString(), model['mod_pid']?.toString()), | |||||
children: _buildTabBarViewChildren(listStyle, model['mod_id']?.toString(), model['mod_pid']?.toString(), index), | |||||
), | ), | ||||
)); | )); | ||||
} | } | ||||
@@ -317,10 +351,10 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single | |||||
} | } | ||||
/// 返回TabBarView的视图 | /// 返回TabBarView的视图 | ||||
List<Widget> _buildTabBarViewChildren(final List<Map<String, dynamic>> listStyle, final String modId, final String modPid) { | |||||
List<Widget> _buildTabBarViewChildren(final List<Map<String, dynamic>> listStyle, final String modId, final String modPid, final int index) { | |||||
List<Widget> result = []; | List<Widget> result = []; | ||||
for (int i = 0; i < listStyle.length; i++) { | for (int i = 0; i < listStyle.length; i++) { | ||||
result.add(CustomItemPage(listStyle[i], i, modId, modPid)); | |||||
result.add(CustomItemPage(listStyle[i], i, modId, modPid, (!_isHasAppbar && !_isHasTabBar && index == 0 ))); | |||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
@@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; | |||||
import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
import 'package:moblink/moblink.dart'; | import 'package:moblink/moblink.dart'; | ||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:zhiying_base_widget/dialog/global_dialog/activity_dialog/activity_dialog.dart'; | |||||
import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/intellect_create.dart'; | import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/intellect_create.dart'; | ||||
import 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart'; | import 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart'; | ||||
import 'package:zhiying_base_widget/dialog/global_dialog/policy_dialog/policy_dialog.dart'; | import 'package:zhiying_base_widget/dialog/global_dialog/policy_dialog/policy_dialog.dart'; | ||||
@@ -15,6 +16,7 @@ import 'package:zhiying_base_widget/utils/contants.dart'; | |||||
import 'package:zhiying_comm/models/base/base_tab_model.dart'; | import 'package:zhiying_comm/models/base/base_tab_model.dart'; | ||||
import 'package:zhiying_comm/util/image_util.dart'; | import 'package:zhiying_comm/util/image_util.dart'; | ||||
import 'package:zhiying_comm/util/mob_util/mob_util.dart'; | import 'package:zhiying_comm/util/mob_util/mob_util.dart'; | ||||
import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | |||||
import 'package:zhiying_comm/util/shared_prefe_util.dart'; | import 'package:zhiying_comm/util/shared_prefe_util.dart'; | ||||
import 'package:zhiying_comm/util/update/app_update_util.dart'; | import 'package:zhiying_comm/util/update/app_update_util.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -49,10 +51,11 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver { | |||||
AppUpdateUtil.updateApp(context); | AppUpdateUtil.updateApp(context); | ||||
TaobaoAuth.initAuth(context); | TaobaoAuth.initAuth(context); | ||||
// 弹窗 | |||||
_showPolicy(); | _showPolicy(); | ||||
Moblink.uploadPrivacyPermissionStatus(1, (bool success) {}); | Moblink.uploadPrivacyPermissionStatus(1, (bool success) {}); | ||||
SharesdkPlugin.uploadPrivacyPermissionStatus( 1 , (bool success) {}); | |||||
// 是安卓系统,Android场景还原的实现 | // 是安卓系统,Android场景还原的实现 | ||||
/*if (defaultTargetPlatform == TargetPlatform.android) { | /*if (defaultTargetPlatform == TargetPlatform.android) { | ||||
@@ -179,9 +182,15 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver { | |||||
return true; | return true; | ||||
} | } | ||||
/// | |||||
/// 各种弹窗 | |||||
/// 1、用户协议弹窗 | |||||
/// 2、通知栏开启弹窗 | |||||
/// 3、活动弹窗 | |||||
/// | |||||
Future _showPolicy() async { | Future _showPolicy() async { | ||||
String isShowPolicy = | |||||
await SharedPreferencesUtil.getStringValue(Constants.isShowPolicy); | |||||
// 协议弹窗 | |||||
String isShowPolicy = await SharedPreferencesUtil.getStringValue(Constants.isShowPolicy); | |||||
if (isShowPolicy == null || isShowPolicy != '1') { | if (isShowPolicy == null || isShowPolicy != '1') { | ||||
bool isAccept = await PolicyDialog.show(context); | bool isAccept = await PolicyDialog.show(context); | ||||
if (!isAccept) { | if (!isAccept) { | ||||
@@ -191,14 +200,17 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver { | |||||
} | } | ||||
} | } | ||||
// 通知弹窗 | |||||
String isShowNotiPermission = await SharedPreferencesUtil.getStringValue( | String isShowNotiPermission = await SharedPreferencesUtil.getStringValue( | ||||
Constants.isShowNotiPermission); | Constants.isShowNotiPermission); | ||||
if (isShowNotiPermission == null || isShowNotiPermission != '1') { | if (isShowNotiPermission == null || isShowNotiPermission != '1') { | ||||
await NotificationSettingDialog.show(context); | await NotificationSettingDialog.show(context); | ||||
await SharedPreferencesUtil.setStringValue( | |||||
Constants.isShowNotiPermission, "1"); | |||||
await SharedPreferencesUtil.setStringValue(Constants.isShowNotiPermission, "1"); | |||||
} | } | ||||
// 活动弹窗 | |||||
await ActivityDialog.show(context); | |||||
IntellectCreate.checkAndCreateFirst(context); | IntellectCreate.checkAndCreateFirst(context); | ||||
} | } | ||||
@@ -34,6 +34,8 @@ import 'package:zhiying_base_widget/pages/team_page/team_page.dart'; | |||||
import 'package:zhiying_base_widget/pages/webview/base_webview.dart'; | import 'package:zhiying_base_widget/pages/webview/base_webview.dart'; | ||||
import 'package:zhiying_base_widget/pages/wechat_teacher_page/wechat_teacher_page.dart'; | import 'package:zhiying_base_widget/pages/wechat_teacher_page/wechat_teacher_page.dart'; | ||||
import 'package:zhiying_base_widget/pages/withdraw_page/withdraw_page.dart'; | import 'package:zhiying_base_widget/pages/withdraw_page/withdraw_page.dart'; | ||||
import 'package:zhiying_base_widget/widgets/custom/banner/custom_banner_widget.dart'; | |||||
import 'package:zhiying_base_widget/widgets/custom/goods/custom_goods_widget.dart'; | |||||
import 'package:zhiying_base_widget/widgets/custom/multi_nav/custom_quick_entry.dart'; | import 'package:zhiying_base_widget/widgets/custom/multi_nav/custom_quick_entry.dart'; | ||||
import 'package:zhiying_base_widget/widgets/custom/search/custom_search_widget.dart'; | import 'package:zhiying_base_widget/widgets/custom/search/custom_search_widget.dart'; | ||||
import 'package:zhiying_base_widget/widgets/custom/slide_banner/custom_slide_banner_creater.dart'; | import 'package:zhiying_base_widget/widgets/custom/slide_banner/custom_slide_banner_creater.dart'; | ||||
@@ -107,29 +109,23 @@ class BaseWidgetRegister { | |||||
AppConfigModel config = await AppConfigModel.init(); | AppConfigModel config = await AppConfigModel.init(); | ||||
if (config == null) { | if (config == null) { | ||||
Logger.debug('app 初始化失败'); | Logger.debug('app 初始化失败'); | ||||
return ; | |||||
return; | |||||
} | } | ||||
ShareSDKRegister register = ShareSDKRegister(); | ShareSDKRegister register = ShareSDKRegister(); | ||||
// ================ Weixin | // ================ Weixin | ||||
register.setupWechat(config.keys?.weixin?.appId ?? '', | |||||
config.keys?.weixin?.secret ?? '', config.keys?.weixin?.universalLink ?? ''); | |||||
register.setupWechat(config.keys?.weixin?.appId ?? '', config.keys?.weixin?.secret ?? '', config.keys?.weixin?.universalLink ?? ''); | |||||
register.setupSinaWeibo(config.keys?.weibo?.appkey ?? '', config.keys?.weibo?.secret ?? '', | |||||
config.keys?.weibo?.redirectUrl ?? ''); | |||||
register.setupSinaWeibo(config.keys?.weibo?.appkey ?? '', config.keys?.weibo?.secret ?? '', config.keys?.weibo?.redirectUrl ?? ''); | |||||
register.setupQQ(config.keys?.qq?.appId ?? '', config.keys?.qq?.appkey ?? ''); | register.setupQQ(config.keys?.qq?.appId ?? '', config.keys?.qq?.appkey ?? ''); | ||||
// ================ jd | // ================ jd | ||||
if (Platform.isIOS) { | if (Platform.isIOS) { | ||||
Jdsdk.init( | |||||
appKey: config.keys?.jdIos?.appkey ?? '', | |||||
appSecret: config.keys?.jdIos?.secret ?? ''); | |||||
Jdsdk.init(appKey: config.keys?.jdIos?.appkey ?? '', appSecret: config.keys?.jdIos?.secret ?? ''); | |||||
} else if (Platform.isAndroid) { | } else if (Platform.isAndroid) { | ||||
Jdsdk.init( | |||||
appKey: config.keys?.jdAndroid?.appkey ?? '', | |||||
appSecret: config.keys?.jdAndroid?.secret ?? ''); | |||||
Jdsdk.init(appKey: config.keys?.jdAndroid?.appkey ?? '', appSecret: config.keys?.jdAndroid?.secret ?? ''); | |||||
} | } | ||||
SharesdkPlugin.regist(register); | SharesdkPlugin.regist(register); | ||||
}); | }); | ||||
@@ -153,7 +149,6 @@ class BaseWidgetRegister { | |||||
NetUtil.post('/api/v1/rec/suning?page=1', method: NetMethod.GET, cache: true); | NetUtil.post('/api/v1/rec/suning?page=1', method: NetMethod.GET, cache: true); | ||||
// 考拉 | // 考拉 | ||||
NetUtil.post('/api/v1/rec/kaola?page=1', method: NetMethod.GET, cache: true); | NetUtil.post('/api/v1/rec/kaola?page=1', method: NetMethod.GET, cache: true); | ||||
return null; | return null; | ||||
}); | }); | ||||
@@ -161,70 +156,54 @@ class BaseWidgetRegister { | |||||
Application.addMethod(() async { | Application.addMethod(() async { | ||||
return Future.delayed(Duration(seconds: 1)); | return Future.delayed(Duration(seconds: 1)); | ||||
}); | }); | ||||
} | } | ||||
// 注册页面 | // 注册页面 | ||||
static void registPage() { | static void registPage() { | ||||
PageFactory.regist('LaunchPage', (model) => LaunchPage()); | PageFactory.regist('LaunchPage', (model) => LaunchPage()); | ||||
// PageFactory.regist('homePage', (model) => HomePage()); | // PageFactory.regist('homePage', (model) => HomePage()); | ||||
PageFactory.regist('pub.flutter.index', (model) => MainPage(model)); | |||||
// PageFactory.regist('pub.flutter.index', (model) => MainPage(model)); | |||||
PageFactory.regist('pub.flutter.index', (model) => CustomPage(model)); | |||||
PageFactory.regist('pub.flutter.profile', (model) => MainPage(model)); | PageFactory.regist('pub.flutter.profile', (model) => MainPage(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.hot_rank', (model) => HotRankingPage(model)); | |||||
PageFactory.regist( | |||||
'pub.flutter.my_wallet', (model) => WalletPage(data: model)); | |||||
PageFactory.regist('pub.flutter.hot_rank', (model) => HotRankingPage(model)); | |||||
PageFactory.regist('pub.flutter.my_wallet', (model) => WalletPage(data: model)); | |||||
PageFactory.regist('goods_details', (model) => GoodsDetailsPage(model)); | PageFactory.regist('goods_details', (model) => GoodsDetailsPage(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.search_index', (model) => SearchPage(model)); | |||||
PageFactory.regist('pub.flutter.search_index', (model) => SearchPage(model)); | |||||
PageFactory.regist('search_item_page', (model) => SearchItemPage(model)); | PageFactory.regist('search_item_page', (model) => SearchItemPage(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.search_result', (model) => SearchResultPage(model)); | |||||
PageFactory.regist( | |||||
'search_result_item', (model) => SearchResultItemPage(model)); | |||||
PageFactory.regist('pub.flutter.search_result', (model) => SearchResultPage(model)); | |||||
PageFactory.regist('search_result_item', (model) => SearchResultItemPage(model)); | |||||
PageFactory.regist('pub.flutter.feedback', (model) => FeedbackPage(model)); | PageFactory.regist('pub.flutter.feedback', (model) => FeedbackPage(model)); | ||||
PageFactory.regist('pub.flutter.feedback_list', (model) => FeedbackRecordPage(model)); | PageFactory.regist('pub.flutter.feedback_list', (model) => FeedbackRecordPage(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.wechat_teacher', (model) => WechatTeacherPage(model)); | |||||
PageFactory.regist('pub.flutter.wechat_teacher', (model) => WechatTeacherPage(model)); | |||||
PageFactory.regist('pub.flutter.cash_out', (model) => WithdrawPage(model)); | PageFactory.regist('pub.flutter.cash_out', (model) => WithdrawPage(model)); | ||||
// webview | // webview | ||||
PageFactory.regist('pub.flutter.url', (model) => BaseWebview(model)); | PageFactory.regist('pub.flutter.url', (model) => BaseWebview(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.profile_settings', (model) => MineDetailPage()); | |||||
PageFactory.regist('pub.flutter.profile_settings', (model) => MineDetailPage()); | |||||
PageFactory.regist('pub.flutter.settings', (model) => SettingPage(model)); | PageFactory.regist('pub.flutter.settings', (model) => SettingPage(model)); | ||||
PageFactory.regist('pub.flutter.my_order', (model) => OrdersPage(model)); | PageFactory.regist('pub.flutter.my_order', (model) => OrdersPage(model)); | ||||
PageFactory.regist( | |||||
'pub.flutter.account_security', (model) => SecurityPage(model)); | |||||
PageFactory.regist('pub.flutter.account_security_alipay', | |||||
(model) => SecurityBindAlipayPage(model)); | |||||
PageFactory.regist('pub.flutter.account_security', (model) => SecurityPage(model)); | |||||
PageFactory.regist('pub.flutter.account_security_alipay', (model) => SecurityBindAlipayPage(model)); | |||||
// 登录密码 | // 登录密码 | ||||
PageFactory.regist('pub.flutter.account_security_password', | |||||
(model) => SecurityPassword(model)); | |||||
PageFactory.regist('pub.flutter.account_security_password', (model) => SecurityPassword(model)); | |||||
// 修改手机号 | // 修改手机号 | ||||
PageFactory.regist('pub.flutter.account_security_mobile', | |||||
(model) => SecurityMobile(model)); | |||||
PageFactory.regist('pub.flutter.account_security_mobile', (model) => SecurityMobile(model)); | |||||
// 邀请好友 | // 邀请好友 | ||||
PageFactory.regist( | |||||
'pub.flutter.invite_friends', (model) => InvitedFriendsPage(model)); | |||||
PageFactory.regist('pub.flutter.invite_friends', (model) => InvitedFriendsPage(model)); | |||||
/// 我的团队 | /// 我的团队 | ||||
PageFactory.regist('pub.flutter.my_team', (model) => TeamPage(model)); | PageFactory.regist('pub.flutter.my_team', (model) => TeamPage(model)); | ||||
/// 用户详情 | /// 用户详情 | ||||
PageFactory.regist( | |||||
'pub.flutter.my_fan_detail', (model) => TeamDetailsPage(model)); | |||||
PageFactory.regist('pub.flutter.my_fan_detail', (model) => TeamDetailsPage(model)); | |||||
/// 消息中心 | /// 消息中心 | ||||
PageFactory.regist( | |||||
'pub.flutter.message_center', (model) => MessageNoticePage(model)); | |||||
PageFactory.regist('pub.flutter.message_center', (model) => MessageNoticePage(model)); | |||||
/// TODO 首页的消息中心标识和我的页面不一致,需要改 | /// TODO 首页的消息中心标识和我的页面不一致,需要改 | ||||
PageFactory.regist( | |||||
'pub.flutter.message', (model) => MessageNoticePage(model)); | |||||
PageFactory.regist('pub.flutter.message', (model) => MessageNoticePage(model)); | |||||
/// 我的收藏 | /// 我的收藏 | ||||
PageFactory.regist('pub.flutter.my_fav', (model) => FavoritesPage(model)); | PageFactory.regist('pub.flutter.my_fav', (model) => FavoritesPage(model)); | ||||
@@ -233,16 +212,13 @@ class BaseWidgetRegister { | |||||
PageFactory.regist('pub.flutter.about_us', (model) => AboutUsPage(model)); | PageFactory.regist('pub.flutter.about_us', (model) => AboutUsPage(model)); | ||||
/// 隐私设置 | /// 隐私设置 | ||||
PageFactory.regist( | |||||
'pub.flutter.privacy_settings', (model) => PrivacySettingsPage(model)); | |||||
PageFactory.regist('pub.flutter.privacy_settings', (model) => PrivacySettingsPage(model)); | |||||
/// 消息设置 | /// 消息设置 | ||||
PageFactory.regist( | |||||
'pub.flutter.message_settings', (model) => MessageSettingsPage(model)); | |||||
PageFactory.regist('pub.flutter.message_settings', (model) => MessageSettingsPage(model)); | |||||
/// 钱包明细 | /// 钱包明细 | ||||
PageFactory.regist( | |||||
'pub.flutter.my_wallet_detail', (model) => BilDetailPage(model)); | |||||
PageFactory.regist('pub.flutter.my_wallet_detail', (model) => BilDetailPage(model)); | |||||
/// 通用模块 | /// 通用模块 | ||||
PageFactory.regist('pub.flutter.custom', (model) => CustomPage(model)); | PageFactory.regist('pub.flutter.custom', (model) => CustomPage(model)); | ||||
@@ -263,11 +239,12 @@ class BaseWidgetRegister { | |||||
/// 可滚动banner | /// 可滚动banner | ||||
WidgetFactory.regist('index_carousel', HomeSlideBannerCreater()); | WidgetFactory.regist('index_carousel', HomeSlideBannerCreater()); | ||||
/// 首页商品推荐列表 | /// 首页商品推荐列表 | ||||
WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | ||||
/// 首页快速入口 | /// 首页快速入口 | ||||
WidgetFactory.regist('multi_nav', DefaultWidgetCreater((model) => HomeQuickEntry(model))); | |||||
// WidgetFactory.regist('multi_nav', DefaultWidgetCreater((model) => HomeQuickEntry(model))); | |||||
/// 滚动公告 | /// 滚动公告 | ||||
WidgetFactory.regist('index_placard', DefaultWidgetCreater((model) => HomeNoticeWidget(model))); | WidgetFactory.regist('index_placard', DefaultWidgetCreater((model) => HomeNoticeWidget(model))); | ||||
@@ -278,113 +255,82 @@ class BaseWidgetRegister { | |||||
// WidgetFactory.regist('index_taobao_auth_tip', HomeAuthCreater()); | // WidgetFactory.regist('index_taobao_auth_tip', HomeAuthCreater()); | ||||
/// ==================== 搜索页面 ==================== /// | /// ==================== 搜索页面 ==================== /// | ||||
// 搜索标题 | |||||
// WidgetFactory.regist('search_index_app_bar', DefaultWidgetCreater((model) => SearchAppbarWidget(model))); | |||||
// 搜索输入框 | // 搜索输入框 | ||||
WidgetFactory.regist('search_index_input', | |||||
DefaultWidgetCreater((model) => SearchInputWidget(model))); | |||||
WidgetFactory.regist('search_index_input', DefaultWidgetCreater((model) => SearchInputWidget(model))); | |||||
// // 搜索tabBar | // // 搜索tabBar | ||||
WidgetFactory.regist('search_index_icon_list', SearcchTabCreater()); | WidgetFactory.regist('search_index_icon_list', SearcchTabCreater()); | ||||
// WidgetFactory.regist('search_index_icon_list', DefaultWidgetCreater((model) => SearchTabWidget(model))); | |||||
// // 热门搜索标签 | // // 热门搜索标签 | ||||
WidgetFactory.regist('search_index_host_keyword', | |||||
DefaultWidgetCreater((model) => SearchHotTagWidget(model))); | |||||
WidgetFactory.regist('search_index_hot_keyword', DefaultWidgetCreater((model) => SearchHotTagWidget(model))); | |||||
// // 历史搜索标签 | // // 历史搜索标签 | ||||
WidgetFactory.regist('search_index_history', DefaultWidgetCreater((model) => SearchHistoryTagWidget(model))); | WidgetFactory.regist('search_index_history', DefaultWidgetCreater((model) => SearchHistoryTagWidget(model))); | ||||
/// ==================== 搜索结果页面 ==================== /// | /// ==================== 搜索结果页面 ==================== /// | ||||
// 输入框 | // 输入框 | ||||
WidgetFactory.regist('search_result_input', | |||||
DefaultWidgetCreater((model) => SearchResultInputWidget(model))); | |||||
WidgetFactory.regist('search_result_input', DefaultWidgetCreater((model) => SearchResultInputWidget(model))); | |||||
// tabbar | // tabbar | ||||
WidgetFactory.regist('search_result_icon_list', SearchResultTabCreater()); | WidgetFactory.regist('search_result_icon_list', SearchResultTabCreater()); | ||||
// 搜索筛选Widget | |||||
WidgetFactory.regist('search_conditions', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果页筛选widget 淘宝 | // 搜索结果页筛选widget 淘宝 | ||||
WidgetFactory.regist('search_result_taobao_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_taobao_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 淘宝 | // 搜索结果的商品列表 淘宝 | ||||
WidgetFactory.regist( | |||||
'search_result_taobao_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_taobao_item', SearchResultGoodsListCreater()); | |||||
// 搜索结果页筛选widget 京东 | // 搜索结果页筛选widget 京东 | ||||
WidgetFactory.regist('search_result_jd_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_jd_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 京东 | // 搜索结果的商品列表 京东 | ||||
WidgetFactory.regist( | |||||
'search_result_jd_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_jd_item', SearchResultGoodsListCreater()); | |||||
// 搜索结果页筛选widget 苏宁 | // 搜索结果页筛选widget 苏宁 | ||||
WidgetFactory.regist('search_result_suning_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_suning_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 苏宁 | // 搜索结果的商品列表 苏宁 | ||||
WidgetFactory.regist( | |||||
'search_result_suning_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_suning_item', SearchResultGoodsListCreater()); | |||||
// 搜索结果页筛选widget 拼多多 | // 搜索结果页筛选widget 拼多多 | ||||
WidgetFactory.regist('search_result_pdd_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_pdd_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 拼多多 | // 搜索结果的商品列表 拼多多 | ||||
WidgetFactory.regist( | |||||
'search_result_pdd_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_pdd_item', SearchResultGoodsListCreater()); | |||||
// 搜索结果页筛选widget 唯品会 | // 搜索结果页筛选widget 唯品会 | ||||
WidgetFactory.regist('search_result_vip_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_vip_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 唯品会 | // 搜索结果的商品列表 唯品会 | ||||
WidgetFactory.regist( | |||||
'search_result_vip_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_vip_item', SearchResultGoodsListCreater()); | |||||
// 搜索结果页筛选widget 考拉 | // 搜索结果页筛选widget 考拉 | ||||
WidgetFactory.regist('search_result_kaola_sort', | |||||
DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
WidgetFactory.regist('search_result_kaola_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||||
// 搜索结果的商品列表 考拉 | // 搜索结果的商品列表 考拉 | ||||
WidgetFactory.regist( | |||||
'search_result_kaola_item', SearchResultGoodsListCreater()); | |||||
WidgetFactory.regist('search_result_kaola_item', SearchResultGoodsListCreater()); | |||||
/// ==================== 商品详情 ==================== /// | /// ==================== 商品详情 ==================== /// | ||||
// 商品详情轮播图 | // 商品详情轮播图 | ||||
WidgetFactory.regist('product_detail_carousel', | |||||
DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | |||||
WidgetFactory.regist('product_detail_carousel', DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | |||||
// 商品详情下载APP提示 | // 商品详情下载APP提示 | ||||
WidgetFactory.regist('product_detail_download_tips', | |||||
DefaultWidgetCreater((model) => UpgradeTipWidget(model))); | |||||
WidgetFactory.regist('product_detail_download_tips', DefaultWidgetCreater((model) => UpgradeTipWidget(model))); | |||||
// 商品详情价格显示 | // 商品详情价格显示 | ||||
WidgetFactory.regist('product_detail_price', | |||||
DefaultWidgetCreater((model) => GoodsDetailsPriceWidget(model))); | |||||
WidgetFactory.regist('product_detail_price', DefaultWidgetCreater((model) => GoodsDetailsPriceWidget(model))); | |||||
// 商品详情标题 | // 商品详情标题 | ||||
WidgetFactory.regist('product_detail_title', | |||||
DefaultWidgetCreater((model) => GoodsDetailsTitleWidget(model))); | |||||
WidgetFactory.regist('product_detail_title', DefaultWidgetCreater((model) => GoodsDetailsTitleWidget(model))); | |||||
// 商品详情优惠劵 | // 商品详情优惠劵 | ||||
WidgetFactory.regist('product_detail_coupon', | |||||
DefaultWidgetCreater((model) => CounponWidget(model))); | |||||
WidgetFactory.regist('product_detail_coupon', DefaultWidgetCreater((model) => CounponWidget(model))); | |||||
// 商品详情店铺 | // 商品详情店铺 | ||||
WidgetFactory.regist('product_detail_shop', | |||||
DefaultWidgetCreater((model) => StoreWidget(model))); | |||||
WidgetFactory.regist('product_detail_shop', DefaultWidgetCreater((model) => StoreWidget(model))); | |||||
// 商品详情宝贝评价 | // 商品详情宝贝评价 | ||||
WidgetFactory.regist('product_detail_comment', | |||||
DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | |||||
WidgetFactory.regist('product_detail_comment', DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | |||||
// 商品详情图片 | // 商品详情图片 | ||||
WidgetFactory.regist('product_detail_img_list', | |||||
DefaultWidgetCreater((model) => GoodsDetailsImgWidget(model))); | |||||
WidgetFactory.regist('product_detail_img_list', DefaultWidgetCreater((model) => GoodsDetailsImgWidget(model))); | |||||
// 商品详情底部推荐列表 | // 商品详情底部推荐列表 | ||||
WidgetFactory.regist( | |||||
'product_detail_bottom_rec', GoodsDetailCommendCreater()); | |||||
WidgetFactory.regist('product_detail_bottom_rec', GoodsDetailCommendCreater()); | |||||
// 商品详情底部 | // 商品详情底部 | ||||
WidgetFactory.regist('product_detail_bottom', | |||||
DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | |||||
WidgetFactory.regist('product_detail_bottom', DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | |||||
// ==================== 个人中心 | // ==================== 个人中心 | ||||
WidgetFactory.regist('profile_appbar', MineNavCreater()); | WidgetFactory.regist('profile_appbar', MineNavCreater()); | ||||
WidgetFactory.regist('profile_background', | |||||
DefaultWidgetCreater((model) => MineNavBg(model))); | |||||
WidgetFactory.regist( | |||||
'profile_header', DefaultWidgetCreater((model) => MineHeader(model))); | |||||
WidgetFactory.regist( | |||||
'profile_earning', DefaultWidgetCreater((model) => MineData(model))); | |||||
WidgetFactory.regist('profile_functions', | |||||
DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||||
WidgetFactory.regist('profile_my_functions', | |||||
DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||||
WidgetFactory.regist('profile_background', DefaultWidgetCreater((model) => MineNavBg(model))); | |||||
WidgetFactory.regist('profile_header', DefaultWidgetCreater((model) => MineHeader(model))); | |||||
WidgetFactory.regist('profile_earning', DefaultWidgetCreater((model) => MineData(model))); | |||||
WidgetFactory.regist('profile_functions', DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||||
WidgetFactory.regist('profile_my_functions', DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||||
// WidgetFactory.regist('profile_carousel', DefaultWidgetCreater((model) => HomeBannerWidget(model))); | // WidgetFactory.regist('profile_carousel', DefaultWidgetCreater((model) => HomeBannerWidget(model))); | ||||
// WidgetFactory.regist('profile_carousel', HomeBannerCreater()); | // WidgetFactory.regist('profile_carousel', HomeBannerCreater()); | ||||
@@ -396,18 +342,14 @@ class BaseWidgetRegister { | |||||
// ))); | // ))); | ||||
WidgetFactory.regist('my_wallet_appbar', NormalNavCreater()); | WidgetFactory.regist('my_wallet_appbar', NormalNavCreater()); | ||||
WidgetFactory.regist( | |||||
'my_wallet_header', DefaultWidgetCreater((model) => WalletData(model))); | |||||
WidgetFactory.regist( | |||||
'my_wallet_bil', DefaultWidgetCreater((model) => WalletBil(model))); | |||||
WidgetFactory.regist('my_wallet_header', DefaultWidgetCreater((model) => WalletData(model))); | |||||
WidgetFactory.regist('my_wallet_bil', DefaultWidgetCreater((model) => WalletBil(model))); | |||||
// WidgetFactory.regist( | // WidgetFactory.regist( | ||||
// 'wallet_detail', DefaultWidgetCreater((model) => WalletDetail())); | // 'wallet_detail', DefaultWidgetCreater((model) => WalletDetail())); | ||||
// WidgetFactory.regist('wallet_detail', HomeAuthCreater()); | // WidgetFactory.regist('wallet_detail', HomeAuthCreater()); | ||||
WidgetFactory.regist('my_wallet_providers', | |||||
DefaultWidgetCreater((model) => WalletDetail(model))); | |||||
WidgetFactory.regist('my_wallet_providers', DefaultWidgetCreater((model) => WalletDetail(model))); | |||||
WidgetFactory.regist( | |||||
'wallet_income', DefaultWidgetCreater((model) => WalletIncome())); | |||||
WidgetFactory.regist('wallet_income', DefaultWidgetCreater((model) => WalletIncome())); | |||||
//======================= 账单明细 | //======================= 账单明细 | ||||
WidgetFactory.regist( | WidgetFactory.regist( | ||||
@@ -417,22 +359,20 @@ class BaseWidgetRegister { | |||||
))); | ))); | ||||
//======================== 热榜 | //======================== 热榜 | ||||
WidgetFactory.regist('hot_rank_appbar', | |||||
DefaultWidgetCreater((model) => HotRankingAppBar(model))); | |||||
WidgetFactory.regist('hot_rank_tabs', | |||||
DefaultWidgetCreater((model) => HotRankTableBar(model))); | |||||
WidgetFactory.regist('hot_rank_tab_view', | |||||
DefaultWidgetCreater((model) => HotRankingList(model))); | |||||
WidgetFactory.regist('hot_rank_appbar', DefaultWidgetCreater((model) => HotRankingAppBar(model))); | |||||
WidgetFactory.regist('hot_rank_tabs', DefaultWidgetCreater((model) => HotRankTableBar(model))); | |||||
WidgetFactory.regist('hot_rank_tab_view', DefaultWidgetCreater((model) => HotRankingList(model))); | |||||
/// ==================== 通用模块 ==================== /// | /// ==================== 通用模块 ==================== /// | ||||
// 搜索 | // 搜索 | ||||
WidgetFactory.regist('search_test', DefaultWidgetCreater((model) => CustomSearchWidget(model))); | |||||
WidgetFactory.regist('search', DefaultWidgetCreater((model) => CustomSearchWidget(model))); | |||||
// 轮播广告位, 可滑动 | // 轮播广告位, 可滑动 | ||||
WidgetFactory.regist('carousel_test', CustomSlideBannerCreater()); | |||||
WidgetFactory.regist('carousel', CustomSlideBannerCreater()); | |||||
// 多眼导航,可滑动 | // 多眼导航,可滑动 | ||||
WidgetFactory.regist('multi_nav_test', DefaultWidgetCreater((model) => CustomQuickEntry(model))); | |||||
WidgetFactory.regist('multi_nav', DefaultWidgetCreater((model) => CustomQuickEntry(model))); | |||||
// banner, 不可滑动 | |||||
WidgetFactory.regist('banner', DefaultWidgetCreater((model) => CustomBannerWidget(model))); | |||||
// 商品列表 | // 商品列表 | ||||
WidgetFactory.regist('product_test', GoodsDetailCommendCreater()); | |||||
WidgetFactory.regist('product', CustomGoodsCreater()); | |||||
} | } | ||||
} | } |
@@ -0,0 +1,210 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/custom/banner/model/custom_banner_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | |||||
/// 通用的BannerWidget | |||||
/// | |||||
class CustomBannerWidget extends StatelessWidget { | |||||
final Map<String, dynamic> data; | |||||
CustomBannerModel _model; | |||||
CustomBannerWidget(this.data, {Key key}) : super(key: key) { | |||||
try { | |||||
_model = CustomBannerModel.fromJson(jsonDecode(data['data'])); | |||||
} catch (e, s) { | |||||
Logger.warn(e, s); | |||||
} | |||||
} | |||||
/// 点击事件 | |||||
void _itemOnClick(BuildContext context, CustomBannerListStyle model) { | |||||
print('${model?.skipIdentifier}'); | |||||
RouterUtil.route(model, model.toJson(), context); | |||||
} | |||||
double _convert(String val) { | |||||
double result = 0.0; | |||||
try { | |||||
result = double.parse(val); | |||||
} catch (e) { | |||||
result = 0; | |||||
} | |||||
return result; | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
/// 空视图 | |||||
if (EmptyUtil.isEmpty(_model)) { | |||||
return Container(); | |||||
} | |||||
return Container( | |||||
width: double.infinity, | |||||
height: 90, | |||||
// color: Colors.red, | |||||
padding: EdgeInsets.only(top: _convert(_model?.topMargin), left: 12.5, right: 12.5), | |||||
child: _buildMainWidget(context, _model?.moduleType, _model?.listStyle), | |||||
); | |||||
} | |||||
/// 主视图 | |||||
Widget _buildMainWidget(BuildContext context, String moduleType, List<CustomBannerListStyle> listStyle) { | |||||
if (EmptyUtil.isEmpty(listStyle)) return Container(); | |||||
Widget rlt; | |||||
switch (moduleType) { | |||||
case 'banner1': | |||||
rlt = _buildStyle1(context, listStyle); | |||||
break; | |||||
case 'banner2': | |||||
rlt = _buildStyle2(context, listStyle); | |||||
break; | |||||
case 'banner3': | |||||
rlt = _buildStyle3(context, listStyle); | |||||
break; | |||||
case 'banner4': | |||||
rlt = _buildStyle4(context, listStyle); | |||||
break; | |||||
case 'banner5': | |||||
rlt = _buildStyle5(context, listStyle); | |||||
break; | |||||
case 'banner6': | |||||
rlt = _buildStyle6(context, listStyle); | |||||
break; | |||||
case 'banner7': | |||||
rlt = _buildStyle7(context, listStyle); | |||||
break; | |||||
case 'banner8': | |||||
rlt = _buildStyle8(context, listStyle); | |||||
break; | |||||
default: | |||||
rlt = Container(); | |||||
break; | |||||
} | |||||
return rlt; | |||||
} | |||||
/// 1张图 | |||||
Widget _buildStyle1(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return _buildColumnWidget(context, listStyle); | |||||
} | |||||
/// 左1右1 | |||||
Widget _buildStyle2(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return _buildColumnWidget(context, listStyle); | |||||
} | |||||
/// 左1右2 | |||||
Widget _buildStyle3(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1'); | |||||
CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1'); | |||||
CustomBannerListStyle right2 = listStyle.firstWhere((element) => element.locationType == 'right2'); | |||||
if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(right2)) return Container(); | |||||
return Row( | |||||
children: <Widget>[ | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))), | |||||
Flexible( | |||||
flex: 1, | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))), | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right2), child: CachedNetworkImage(imageUrl: right2?.img ?? ''))), | |||||
], | |||||
), | |||||
), | |||||
], | |||||
); | |||||
} | |||||
/// 左2右1 | |||||
Widget _buildStyle4(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1'); | |||||
CustomBannerListStyle left2 = listStyle.firstWhere((element) => element.locationType == 'left2'); | |||||
CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1'); | |||||
if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(left2)) return Container(); | |||||
return Row( | |||||
children: <Widget>[ | |||||
Flexible( | |||||
flex: 1, | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))), | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left2), child: CachedNetworkImage(imageUrl: left2?.img ?? ''))), | |||||
], | |||||
), | |||||
), | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))), | |||||
], | |||||
); | |||||
} | |||||
/// 左1右3 | |||||
Widget _buildStyle5(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1'); | |||||
CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1'); | |||||
CustomBannerListStyle right2 = listStyle.firstWhere((element) => element.locationType == 'right2'); | |||||
CustomBannerListStyle right3 = listStyle.firstWhere((element) => element.locationType == 'right3'); | |||||
if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(right2) || EmptyUtil.isEmpty(right3)) return Container(); | |||||
return Row( | |||||
children: <Widget>[ | |||||
Flexible(flex: 4, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))), | |||||
Flexible( | |||||
flex: 6, | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))), | |||||
Row( | |||||
children: <Widget>[ | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right2), child: CachedNetworkImage(imageUrl: right2?.img ?? ''))), | |||||
Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right3), child: CachedNetworkImage(imageUrl: right3?.img ?? ''))), | |||||
], | |||||
) | |||||
], | |||||
), | |||||
) | |||||
], | |||||
); | |||||
} | |||||
/// 3列 | |||||
Widget _buildStyle6(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return _buildColumnWidget(context, listStyle); | |||||
} | |||||
/// 4列 | |||||
Widget _buildStyle7(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return _buildColumnWidget(context, listStyle); | |||||
} | |||||
/// 5列 | |||||
Widget _buildStyle8(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return _buildColumnWidget(context, listStyle); | |||||
} | |||||
/// 列的通用 | |||||
Widget _buildColumnWidget(BuildContext context, List<CustomBannerListStyle> listStyle) { | |||||
return Row( | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
children: listStyle | |||||
.map((e) => Flexible( | |||||
flex: 1, | |||||
child: GestureDetector( | |||||
behavior: HitTestBehavior.opaque, | |||||
onTap: () => _itemOnClick(context, e), | |||||
child: Container( | |||||
height: double.infinity, | |||||
width: double.infinity, | |||||
child: CachedNetworkImage( | |||||
imageUrl: e?.img ?? '', | |||||
fit: BoxFit.fitWidth, | |||||
)), | |||||
), | |||||
)) | |||||
.toList(), | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,92 @@ | |||||
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'; | |||||
class CustomBannerModel { | |||||
String name; | |||||
String desc; | |||||
String moduleType; | |||||
String moduleKey; | |||||
String isTopMargin; | |||||
String isLeftRightMargin; | |||||
String isShow; | |||||
String topMargin; | |||||
String leftRightMargin; | |||||
List<CustomBannerListStyle> listStyle; | |||||
int moduleKeyId; | |||||
CustomBannerModel( | |||||
{this.name, this.desc, this.moduleType, this.moduleKey, this.isTopMargin, this.isLeftRightMargin, this.isShow, this.topMargin, this.leftRightMargin, this.listStyle, this.moduleKeyId}); | |||||
CustomBannerModel.fromJson(Map<String, dynamic> json) { | |||||
name = json['name']; | |||||
desc = json['desc']; | |||||
moduleType = json['module_type']; | |||||
moduleKey = json['module_key']; | |||||
isTopMargin = json['is_top_margin']; | |||||
isLeftRightMargin = json['is_left_right_margin']; | |||||
isShow = json['is_show']; | |||||
topMargin = json['top_margin']; | |||||
leftRightMargin = json['left_right_margin']; | |||||
if (json['list_style'] != null) { | |||||
listStyle = new List<CustomBannerListStyle>(); | |||||
json['list_style'].forEach((v) { | |||||
listStyle.add(new CustomBannerListStyle.fromJson(v)); | |||||
}); | |||||
} | |||||
moduleKeyId = json['module_key_id']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['name'] = this.name; | |||||
data['desc'] = this.desc; | |||||
data['module_type'] = this.moduleType; | |||||
data['module_key'] = this.moduleKey; | |||||
data['is_top_margin'] = this.isTopMargin; | |||||
data['is_left_right_margin'] = this.isLeftRightMargin; | |||||
data['is_show'] = this.isShow; | |||||
data['top_margin'] = this.topMargin; | |||||
data['left_right_margin'] = this.leftRightMargin; | |||||
if (this.listStyle != null) { | |||||
data['list_style'] = this.listStyle.map((v) => v.toJson()).toList(); | |||||
} | |||||
data['module_key_id'] = this.moduleKeyId; | |||||
return data; | |||||
} | |||||
} | |||||
class CustomBannerListStyle extends SkipModel{ | |||||
String name; | |||||
String img; | |||||
String locationType; | |||||
String locationName; | |||||
String requiredLogin; | |||||
String requiredTaobaoAuth; | |||||
String skipIdentifier; | |||||
CustomBannerListStyle({this.name, this.img, this.locationType, this.locationName, this.requiredLogin, this.requiredTaobaoAuth, this.skipIdentifier}); | |||||
CustomBannerListStyle.fromJson(Map<String, dynamic> json) { | |||||
super.fromJson(json); | |||||
name = json['name']; | |||||
img = json['img']; | |||||
locationType = json['location_type']; | |||||
locationName = json['location_name']; | |||||
requiredLogin = json['required_login']; | |||||
requiredTaobaoAuth = json['required_taobao_auth']; | |||||
skipIdentifier = json['skip_identifier']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = super.toJson(); | |||||
data['name'] = this.name; | |||||
data['img'] = this.img; | |||||
data['location_type'] = this.locationType; | |||||
data['location_name'] = this.locationName; | |||||
data['required_login'] = this.requiredLogin; | |||||
data['required_taobao_auth'] = this.requiredTaobaoAuth; | |||||
data['skip_identifier'] = this.skipIdentifier; | |||||
return data; | |||||
} | |||||
} |
@@ -0,0 +1,28 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/recommend/goods_detail_commend_creater.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_creater.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | |||||
/// 通用模块的商品列表 | |||||
/// | |||||
class CustomGoodsCreater extends WidgetCreater { | |||||
WidgetCreater creater; | |||||
@override | |||||
List<Widget> createWidgets(Map<String, dynamic> model) { | |||||
Map<String, dynamic> json = jsonDecode(model['data']); | |||||
if (!EmptyUtil.isEmpty(json['recommend_list'])) { | |||||
creater = GoodsListCreater(); | |||||
} else { | |||||
creater = GoodsDetailCommendCreater(); | |||||
} | |||||
return creater?.createWidgets(model) ?? SliverToBoxAdapter(child: Container()); | |||||
} | |||||
@override | |||||
bool isSliverChild() { | |||||
return creater?.isSliverChild() ?? true; | |||||
} | |||||
} |
@@ -115,6 +115,7 @@ class __CustomQuickEntryContainerState extends State<_CustomQuickEntryContainer> | |||||
return Container( | return Container( | ||||
color: HexColor.fromHex(widget?.model['bg_color']), | color: HexColor.fromHex(widget?.model['bg_color']), | ||||
// color: Colors.yellow, | |||||
child: Container( | child: Container( | ||||
margin: EdgeInsets.only(top: 15, bottom: totalPage > 1 ? 15 : 0), | margin: EdgeInsets.only(top: 15, bottom: totalPage > 1 ? 15 : 0), | ||||
height: totalHeight, | height: totalHeight, | ||||
@@ -21,23 +21,85 @@ class CustomSearchWidget extends StatelessWidget { | |||||
// 点击事件 | // 点击事件 | ||||
void _onClickListener(BuildContext context, SkipModel skipModel) { | void _onClickListener(BuildContext context, SkipModel skipModel) { | ||||
RouterUtil.route(skipModel, skipModel.toJson(), context); | |||||
if (!EmptyUtil.isEmpty(skipModel)) { | |||||
RouterUtil.route(skipModel, skipModel.toJson(), context); | |||||
} | |||||
} | } | ||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return _buildStyle1Widget(context); | |||||
return Container( | |||||
width: double.infinity, | |||||
decoration: BoxDecoration( | |||||
color: HexColor.fromHex(model?.bgColor), | |||||
), | |||||
padding: const EdgeInsets.symmetric(horizontal: 12.5, vertical: 4), | |||||
child: _buildMainWidget(context)); | |||||
} | } | ||||
/// 样式1 | |||||
Widget _buildMainWidget(BuildContext context) { | |||||
if (EmptyUtil.isEmpty(model)) return Container(); | |||||
Widget rlt; | |||||
switch (model.moduleType) { | |||||
case 'search_1': | |||||
rlt = _buildStyle1Widget(context); | |||||
break; | |||||
case 'search_2': | |||||
rlt = _buildStyle2Widget(context); | |||||
break; | |||||
default: | |||||
rlt = Container(); | |||||
break; | |||||
} | |||||
return rlt; | |||||
} | |||||
/// 右1图标 | |||||
Widget _buildStyle1Widget(BuildContext context) { | Widget _buildStyle1Widget(BuildContext context) { | ||||
return Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: GestureDetector( | |||||
onTap: () => _onClickListener(context, model?.listStyle?.searchCss), | |||||
behavior: HitTestBehavior.opaque, | |||||
child: Container( | |||||
// height: 30, | |||||
width: double.infinity, | |||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 9), | |||||
decoration: BoxDecoration(borderRadius: BorderRadius.circular(60 / 2), color: HexColor.fromHex(model?.listStyle?.searchCss?.bgColor)), | |||||
child: Row( | |||||
children: <Widget>[ | |||||
CachedNetworkImage( | |||||
width: 13, | |||||
height: 13, | |||||
imageUrl: model?.listStyle?.searchCss?.image ?? '', | |||||
), | |||||
SizedBox(width: 4), | |||||
Text(model?.listStyle?.searchCss?.text ?? '输入搜索内容,领券省钱', style: TextStyle(fontSize: 13, color: HexColor.fromHex('#FFFFFFFF'))) | |||||
], | |||||
), | |||||
), | |||||
)), | |||||
SizedBox(width: 10), | |||||
GestureDetector( | |||||
onTap: () => _onClickListener(context, model?.listStyle?.rightCss), | |||||
child: CachedNetworkImage( | |||||
width: 30, | |||||
height: 30, | |||||
imageUrl: model?.listStyle?.rightCss?.image ?? '', | |||||
)), | |||||
], | |||||
); | |||||
} | |||||
/// 无图标 | |||||
Widget _buildStyle2Widget(BuildContext context) { | |||||
return GestureDetector( | return GestureDetector( | ||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
onTap: () => _onClickListener(context, model?.listStyle?.searchCss), | onTap: () => _onClickListener(context, model?.listStyle?.searchCss), | ||||
child: Container( | child: Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
decoration: BoxDecoration(color: HexColor.fromHex(model?.bgColor ?? '#FFFFFF')), | |||||
padding: const EdgeInsets.symmetric(horizontal: 12.5, vertical: 4), | |||||
child: Container( | child: Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
@@ -104,6 +104,7 @@ class _CustomSlideBannerContainerState extends State<CustomSlideBannerContainer> | |||||
margin: EdgeInsets.all(10), | margin: EdgeInsets.all(10), | ||||
width: double.infinity, | width: double.infinity, | ||||
height: 140, | height: 140, | ||||
// color: Colors.green, | |||||
child: Swiper( | child: Swiper( | ||||
controller: _swiperController, | controller: _swiperController, | ||||
itemBuilder: (BuildContext context, int index) { | itemBuilder: (BuildContext context, int index) { | ||||
@@ -32,17 +32,18 @@ class GoodsDetailsTitleWidget extends StatelessWidget { | |||||
/// 主widget | /// 主widget | ||||
Widget _getMaiWidget(GoodsDetailsTitleModel model) { | Widget _getMaiWidget(GoodsDetailsTitleModel model) { | ||||
return Column( | return Column( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
RichText( | RichText( | ||||
maxLines: 2, | maxLines: 2, | ||||
overflow: TextOverflow.ellipsis, | overflow: TextOverflow.ellipsis, | ||||
text: TextSpan(children: [ | text: TextSpan(children: [ | ||||
WidgetSpan( | |||||
child: _getGoodsTypeIcon(model), | |||||
), | |||||
WidgetSpan(child: _getGoodsTypeIcon(model)), | |||||
_getGoodsTitle(model), | _getGoodsTitle(model), | ||||
]), | ]), | ||||
), | ), | ||||
/// 优惠卷说明 | /// 优惠卷说明 | ||||
Padding(padding: const EdgeInsets.only(top: 12.5), child: _getCounponDestrWidget(model)), | Padding(padding: const EdgeInsets.only(top: 12.5), child: _getCounponDestrWidget(model)), | ||||
], | ], | ||||
@@ -57,14 +58,14 @@ class GoodsDetailsTitleWidget extends StatelessWidget { | |||||
padding: const EdgeInsets.only(left: 7.5, right: 7.5, bottom: 2, top: 3), | padding: const EdgeInsets.only(left: 7.5, right: 7.5, bottom: 2, top: 3), | ||||
margin: const EdgeInsets.only(right: 4), | margin: const EdgeInsets.only(right: 4), | ||||
decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.5), color: HexColor.fromHex(model?.provider_bg_color)), | decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.5), color: HexColor.fromHex(model?.provider_bg_color)), | ||||
child: Text(model?.provider_name, style: TextStyle(color: HexColor.fromHex(model?.provider_name_color), fontSize: 9)), | |||||
child: Text(model?.provider_name, textAlign: TextAlign.center, style: TextStyle(color: HexColor.fromHex(model?.provider_name_color), fontSize: 9)), | |||||
); | ); | ||||
} | } | ||||
/// 商品标题 | /// 商品标题 | ||||
InlineSpan _getGoodsTitle(GoodsDetailsTitleModel model) { | InlineSpan _getGoodsTitle(GoodsDetailsTitleModel model) { | ||||
return TextSpan( | return TextSpan( | ||||
text: model?.title ?? '品胜(PISEN)苹果数据线1.5米 适用于苹果手机所有机型 MFI认证安全稳定一年换新1.5米2米', | |||||
text: model?.title ?? '', | |||||
style: TextStyle( | style: TextStyle( | ||||
fontWeight: FontWeight.bold, | fontWeight: FontWeight.bold, | ||||
fontSize: 14, | fontSize: 14, | ||||
@@ -78,17 +79,17 @@ class GoodsDetailsTitleWidget extends StatelessWidget { | |||||
mainAxisAlignment: MainAxisAlignment.start, | mainAxisAlignment: MainAxisAlignment.start, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 领券立减100元 widget | /// 领券立减100元 widget | ||||
_getCoumstonButtomWidget(model?.coupon_text, model?.coupon_text_color, model?.coupon_bg_color), | |||||
const SizedBox(width: 5), | |||||
Visibility(visible: !EmptyUtil.isEmpty(model?.couponPrice), child: _getCoumstonButtomWidget(model?.coupon_text, model?.coupon_text_color, model?.coupon_bg_color)), | |||||
/// 收货后返现5.5元 | /// 收货后返现5.5元 | ||||
_getCoumstonButtomWidget(model?.commission_text, model?.commission_text_color, model?.commission_bg_color), | |||||
Visibility(visible: !EmptyUtil.isEmpty(model?.commission), child: _getCoumstonButtomWidget(model?.commission_text, model?.commission_text_color, model?.commission_bg_color)), | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
Widget _getCoumstonButtomWidget(String text, String textColor, String bg) { | Widget _getCoumstonButtomWidget(String text, String textColor, String bg) { | ||||
return Container( | return Container( | ||||
margin: const EdgeInsets.only(right: 5), | |||||
padding: const EdgeInsets.only(left: 13.5, right: 14.5, top: 2.5, bottom: 2.5), | padding: const EdgeInsets.only(left: 13.5, right: 14.5, top: 2.5, bottom: 2.5), | ||||
decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: HexColor.fromHex(bg)), | decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: HexColor.fromHex(bg)), | ||||
child: Text( | child: Text( | ||||
@@ -10,19 +10,24 @@ class GoodsDetailsTitleModel { | |||||
String provider_name; | String provider_name; | ||||
String provider_name_color; | String provider_name_color; | ||||
String title; | String title; | ||||
String commission; | |||||
String couponPrice; | |||||
GoodsDetailsTitleModel( | |||||
{this.commission_bg_color, | |||||
this.commission_text, | |||||
this.commission_text_color, | |||||
this.coupon_bg_color, | |||||
this.coupon_text, | |||||
this.coupon_text_color, | |||||
this.good_title_color, | |||||
this.provider_bg_color, | |||||
this.provider_name, | |||||
this.provider_name_color, | |||||
this.title}); | |||||
GoodsDetailsTitleModel({ | |||||
this.commission_bg_color, | |||||
this.commission_text, | |||||
this.commission_text_color, | |||||
this.coupon_bg_color, | |||||
this.coupon_text, | |||||
this.coupon_text_color, | |||||
this.good_title_color, | |||||
this.provider_bg_color, | |||||
this.provider_name, | |||||
this.provider_name_color, | |||||
this.title, | |||||
this.commission, | |||||
this.couponPrice, | |||||
}); | |||||
factory GoodsDetailsTitleModel.fromJson(Map<String, dynamic> json) { | factory GoodsDetailsTitleModel.fromJson(Map<String, dynamic> json) { | ||||
return GoodsDetailsTitleModel( | return GoodsDetailsTitleModel( | ||||
@@ -37,6 +42,8 @@ class GoodsDetailsTitleModel { | |||||
provider_name: json['provider_name'], | provider_name: json['provider_name'], | ||||
provider_name_color: json['provider_name_color'], | provider_name_color: json['provider_name_color'], | ||||
title: json['title'], | title: json['title'], | ||||
commission: json['commission'], | |||||
couponPrice: json['coupon_price'], | |||||
); | ); | ||||
} | } | ||||
@@ -53,6 +60,8 @@ class GoodsDetailsTitleModel { | |||||
data['provider_name'] = this.provider_name; | data['provider_name'] = this.provider_name; | ||||
data['provider_name_color'] = this.provider_name_color; | data['provider_name_color'] = this.provider_name_color; | ||||
data['title'] = this.title; | data['title'] = this.title; | ||||
data['coupon_price'] = this.couponPrice; | |||||
data['commission'] = this.commission; | |||||
return data; | return data; | ||||
} | } | ||||
} | } |
@@ -1,36 +1,44 @@ | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class UpgradeTipModel { | |||||
String bg_color; | |||||
String go_text; | |||||
String go_text_color; | |||||
String icon; | |||||
String text; | |||||
String text_color; | |||||
String url; | |||||
class UpgradeTipModel extends SkipModel { | |||||
String bg_color; | |||||
String go_text; | |||||
String go_text_color; | |||||
String icon; | |||||
String text; | |||||
String text_color; | |||||
String url; | |||||
UpgradeTipModel({this.bg_color, this.go_text, this.go_text_color, this.icon, this.text, this.text_color, this.url}); | |||||
UpgradeTipModel({ | |||||
this.bg_color, | |||||
this.go_text, | |||||
this.go_text_color, | |||||
this.icon, | |||||
this.text, | |||||
this.text_color, | |||||
this.url, | |||||
}); | |||||
factory UpgradeTipModel.fromJson(Map<String, dynamic> json) { | |||||
return UpgradeTipModel( | |||||
bg_color: json['bg_color'], | |||||
go_text: json['go_text'], | |||||
go_text_color: json['go_text_color'], | |||||
icon: json['icon'], | |||||
text: json['text'], | |||||
text_color: json['text_color'], | |||||
url: json['url'], | |||||
); | |||||
} | |||||
UpgradeTipModel.fromJson(Map<String, dynamic> json) { | |||||
super.fromJson(json); | |||||
bg_color = json['bg_color']; | |||||
go_text = json['go_text']; | |||||
go_text_color = json['go_text_color']; | |||||
icon = json['icon']; | |||||
text = json['text']; | |||||
text_color = json['text_color']; | |||||
url = json['url']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['bg_color'] = this.bg_color; | |||||
data['go_text'] = this.go_text; | |||||
data['go_text_color'] = this.go_text_color; | |||||
data['icon'] = this.icon; | |||||
data['text'] = this.text; | |||||
data['text_color'] = this.text_color; | |||||
data['url'] = this.url; | |||||
return data; | |||||
} | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = super.toJson(); | |||||
data['bg_color'] = this.bg_color; | |||||
data['go_text'] = this.go_text; | |||||
data['go_text_color'] = this.go_text_color; | |||||
data['icon'] = this.icon; | |||||
data['text'] = this.text; | |||||
data['text_color'] = this.text_color; | |||||
data['url'] = this.url; | |||||
return data; | |||||
} | |||||
} |
@@ -11,36 +11,44 @@ import 'package:cached_network_image/cached_network_image.dart'; | |||||
class UpgradeTipWidget extends StatelessWidget { | class UpgradeTipWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
UpgradeTipModel _upgradeTipModel; | UpgradeTipModel _upgradeTipModel; | ||||
UpgradeTipWidget(this.model, {Key key}) : super(key: key){ | |||||
try{ | |||||
UpgradeTipWidget(this.model, {Key key}) : super(key: key) { | |||||
try { | |||||
_upgradeTipModel = UpgradeTipModel.fromJson(jsonDecode(model['data'])); | _upgradeTipModel = UpgradeTipModel.fromJson(jsonDecode(model['data'])); | ||||
}catch(e){ | |||||
} catch (e) { | |||||
Logger.log('UpgradeTipWidget e = $e'); | Logger.log('UpgradeTipWidget e = $e'); | ||||
} | } | ||||
} | } | ||||
void _onClickListener(context) { | |||||
if (!EmptyUtil.isEmpty(_upgradeTipModel)) { | |||||
RouterUtil.route(_upgradeTipModel, _upgradeTipModel.toJson(), context); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12.5), | padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12.5), | ||||
decoration: BoxDecoration( | |||||
color: Colors.white, | |||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(7.5), topRight: Radius.circular(7.5)) | |||||
), | |||||
child: Container( | |||||
decoration: BoxDecoration( | |||||
/// 背景颜色 | |||||
color: HexColor.fromHex(_upgradeTipModel?.bg_color ?? '#FFEFDA'), | |||||
borderRadius: BorderRadius.circular(30), | |||||
), | |||||
padding: const EdgeInsets.only(left: 10, right: 13, top: 10, bottom: 10), | |||||
child: Row( | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
children: <Widget>[ | |||||
_geLeftWidget(_upgradeTipModel), | |||||
_getRightWidget(_upgradeTipModel), | |||||
], | |||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(7.5), topRight: Radius.circular(7.5))), | |||||
child: GestureDetector( | |||||
onTap: () => _onClickListener(context), | |||||
behavior: HitTestBehavior.opaque, | |||||
child: Container( | |||||
decoration: BoxDecoration( | |||||
/// 背景颜色 | |||||
color: HexColor.fromHex(_upgradeTipModel?.bg_color ?? '#FFEFDA'), | |||||
borderRadius: BorderRadius.circular(30), | |||||
), | |||||
padding: const EdgeInsets.only(left: 10, right: 13, top: 10, bottom: 10), | |||||
child: Row( | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
children: <Widget>[ | |||||
_geLeftWidget(_upgradeTipModel), | |||||
_getRightWidget(_upgradeTipModel), | |||||
], | |||||
), | |||||
), | ), | ||||
), | ), | ||||
); | ); | ||||
@@ -52,19 +60,22 @@ class UpgradeTipWidget extends StatelessWidget { | |||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 图标 | /// 图标 | ||||
// Container(width: 15, height: 15, child: ,), | // Container(width: 15, height: 15, child: ,), | ||||
CachedNetworkImage(imageUrl: model?.icon ?? '', width: 15,), | |||||
CachedNetworkImage( | |||||
imageUrl: model?.icon ?? '', | |||||
width: 15, | |||||
), | |||||
const SizedBox(width: 7.5), | const SizedBox(width: 7.5), | ||||
/// 文字 | /// 文字 | ||||
Text(model?.text ?? '下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex( model?.text_color ?? '#C09023'), fontSize: 11)) | |||||
Text(model?.text ?? '下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex(model?.text_color ?? '#C09023'), fontSize: 11)) | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 右边的视图 | /// 右边的视图 | ||||
Widget _getRightWidget(UpgradeTipModel model) { | Widget _getRightWidget(UpgradeTipModel model) { | ||||
return Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex(model?.go_text_color ?? '#C09023'), fontSize: 11)); | |||||
return Text(model?.go_text ?? '前往下载', style: TextStyle(color: HexColor.fromHex(model?.go_text_color ?? '#C09023'), fontSize: 11)); | |||||
// return Row( | // return Row( | ||||
// children: <Widget>[ | // children: <Widget>[ | ||||
// Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)), | // Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)), | ||||
@@ -64,10 +64,10 @@ class _HomeGoodsContainerState extends State<_HomeGoodsContainer> { | |||||
_style = HomeGoodsStyleModel.fromJson(Map<String, dynamic>.from(json)); | _style = HomeGoodsStyleModel.fromJson(Map<String, dynamic>.from(json)); | ||||
widget.eventBus.on<HomeGoodsHeaderEvent>().listen((data) { | widget.eventBus.on<HomeGoodsHeaderEvent>().listen((data) { | ||||
if (!_isFirstLoading) { | |||||
// 老板说打开app的时候,第一次加载不要显示loading | |||||
Loading.show(context); | |||||
} | |||||
// if (!_isFirstLoading) { | |||||
// // 老板说打开app的时候,第一次加载不要显示loading | |||||
// Loading.show(context); | |||||
// } | |||||
_isFirstLoading = false; | _isFirstLoading = false; | ||||
_provider = data.provider; | _provider = data.provider; | ||||
_bloc.loadMore(_provider); | _bloc.loadMore(_provider); | ||||
@@ -97,7 +97,7 @@ class _HomeGoodsContainerState extends State<_HomeGoodsContainer> { | |||||
// child: HomeGoodsSkeleton(), | // child: HomeGoodsSkeleton(), | ||||
// ); | // ); | ||||
// } | // } | ||||
Loading.dismiss(); | |||||
// Loading.dismiss(); | |||||
List<HomeGoodsModel> goods = snapshot.data; | List<HomeGoodsModel> goods = snapshot.data; | ||||
int column = int.tryParse(_style.listColumn ?? '1'); | int column = int.tryParse(_style.listColumn ?? '1'); | ||||
column = column <= 0 ? 1 : column; | column = column <= 0 ? 1 : column; | ||||