@@ -5,7 +5,6 @@ import 'package:zhiying_base_widget/pages/wallet_page/wallet_page.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/home_banner_creater.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/home_banner_widget.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_creater.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/home_quick_entry_creater.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_slide_banner/home_slide_banner_creater.dart'; | |||
import 'package:zhiying_base_widget/widgets/mine/mine_data/mine_data.dart'; | |||
import 'package:zhiying_base_widget/widgets/mine/mine_header/mine_header.dart'; | |||
@@ -19,6 +18,9 @@ import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income.d | |||
import 'package:zhiying_comm/util/defalut_widget_creater.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'widgets/home/home_quick_entry/home_quick_entry.dart'; | |||
class BaseWidgetRegister { | |||
/// 初始化方法 | |||
static void init() { | |||
@@ -55,12 +57,8 @@ class BaseWidgetRegister { | |||
// /// 可滚动banner | |||
WidgetFactory.regist('index_carousel', HomeSlideBannerCreater()); | |||
WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | |||
/// 首页快速入口 | |||
WidgetFactory.regist('home_quick_entry', HomeQuickEntryCreater()); | |||
// | |||
// /// 首页快速入口 | |||
WidgetFactory.regist('multi_nav', HomeQuickEntryCreater()); | |||
WidgetFactory.regist('multi_nav', DefaultWidgetCreater((model) => HomeQuickEntry(model))); | |||
// | |||
// /// 不可以滚动banner | |||
WidgetFactory.regist('index_banner_one', HomeBannerCreater()); | |||
@@ -68,26 +66,17 @@ class BaseWidgetRegister { | |||
// ==================== 个人中心 | |||
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_carousel', | |||
DefaultWidgetCreater((model) => HomeBannerWidget(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( | |||
'wallet_data', DefaultWidgetCreater((model) => WalletData())); | |||
WidgetFactory.regist( | |||
'wallet_detail', DefaultWidgetCreater((model) => WalletDetail())); | |||
WidgetFactory.regist('wallet_data', DefaultWidgetCreater((model) => WalletData())); | |||
WidgetFactory.regist('wallet_detail', DefaultWidgetCreater((model) => WalletDetail())); | |||
WidgetFactory.regist( | |||
'wallet_income', DefaultWidgetCreater((model) => WalletIncome())); | |||
WidgetFactory.regist('wallet_income', DefaultWidgetCreater((model) => WalletIncome())); | |||
} | |||
} |
@@ -26,13 +26,17 @@ class HomeBannerBloc extends Bloc<HomeBannerEvent, HomeBannerState> { | |||
} | |||
/// 初始化 | |||
Stream<HomeBannerState> _mapHomeBannerInitEventToState( | |||
HomeBannerInitEvent event) async* { | |||
var cache = await repository.fetchCacheData(modId: event.model['mod_id']); | |||
if (!EmptyUtil.isEmpty(cache)) yield HomeBannerCacheState(); | |||
var result = await repository.fetchNetData(modId: event.model['mod_id']); | |||
Stream<HomeBannerState> _mapHomeBannerInitEventToState(HomeBannerInitEvent event) async* { | |||
var parentData = await repository.fetchParentData(model: event.model); | |||
if(!EmptyUtil.isEmpty(parentData)){ | |||
yield HomeBannerLoadedState(model: parentData); | |||
return; | |||
} | |||
var cache = await repository.fetchCacheData(model: event.model); | |||
if (!EmptyUtil.isEmpty(cache)) yield HomeBannerCacheState(model: cache); | |||
var result = await repository.fetchNetData(model: event.model); | |||
if (!EmptyUtil.isEmpty(result)) | |||
yield HomeBannerLoadedState(); | |||
yield HomeBannerLoadedState(model: result); | |||
else | |||
yield HomeBannerErrorState(); | |||
} | |||
@@ -1,3 +1,5 @@ | |||
import 'dart:convert'; | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/model/HomeBannerModel.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
@@ -5,21 +7,37 @@ import 'package:zhiying_comm/util/net_util.dart'; | |||
class HomeBannerRepository { | |||
/// 读取缓存数据 | |||
Future<HomeBannerModel> fetchCacheData({@required int modId}) async { | |||
Future<HomeBannerModel> fetchCacheData({@required Map<String, dynamic> model}) async { | |||
var result = await NetUtil.getRequestCachedData('/api/v1/mod', params: { | |||
'ids': [modId] | |||
'ids': [model['mod_id']] | |||
}); | |||
if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])){ | |||
return HomeBannerModel(); | |||
return HomeBannerModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | |||
} | |||
return null; | |||
} | |||
/// 获取父类传进来的数据 | |||
Future<HomeBannerModel> fetchParentData({@required Map<String, dynamic> model}) async{ | |||
try { | |||
String jsonInfo = model['data']; | |||
if (!EmptyUtil.isEmpty(jsonInfo)) { | |||
return HomeBannerModel.fromJson(jsonDecode(jsonInfo)); | |||
} | |||
}catch(e){ | |||
Logger.log(e); | |||
} | |||
return null; | |||
} | |||
/// 获取网路数据 | |||
Future<HomeBannerModel> fetchNetData({@required int modId}) async { | |||
var result = await NetUtil.post('/api/v1/mod', params: {'ids': [modId]}, cache: true); | |||
Future<HomeBannerModel> fetchNetData({@required Map<String, dynamic> model}) async { | |||
// print('请求 modId = $model['mod_id']'); | |||
var result = await NetUtil.post('/api/v1/mod', params: {'ids': [model['mod_id']]}, cache: true); | |||
if (NetUtil.isSuccess(result)) { | |||
return HomeBannerModel(); | |||
return HomeBannerModel.fromJson(result); | |||
} | |||
return null; | |||
} | |||
@@ -1,4 +1,5 @@ | |||
import 'package:equatable/equatable.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/model/HomeBannerModel.dart'; | |||
abstract class HomeBannerState extends Equatable { | |||
const HomeBannerState(); | |||
@@ -12,14 +13,22 @@ class InitialHomeBannerState extends HomeBannerState { | |||
/// 数据加载完毕状态 | |||
class HomeBannerLoadedState extends HomeBannerState { | |||
final HomeBannerModel model; | |||
const HomeBannerLoadedState({this.model}); | |||
@override | |||
List<Object> get props => []; | |||
List<Object> get props => [this.model]; | |||
} | |||
/// 缓存数据加载完毕 | |||
class HomeBannerCacheState extends HomeBannerState { | |||
final HomeBannerModel model; | |||
const HomeBannerCacheState({this.model}); | |||
@override | |||
List<Object> get props => []; | |||
List<Object> get props => [this.model]; | |||
} | |||
/// 数据加载失败 | |||
@@ -11,6 +11,7 @@ class HomeBannerSkeleton extends StatelessWidget { | |||
Widget build(BuildContext context) { | |||
return Container( | |||
height: 60, | |||
margin: const EdgeInsets.symmetric(vertical: 12.5), | |||
width: double.infinity, | |||
color: Colors.white, | |||
child: _styleWidget(EmptyUtil.isEmpty(model) ? 1 : model.containsKey('mod_name') ? _getCount(model['mod_name']) : 1), | |||
@@ -48,18 +49,7 @@ class HomeBannerSkeleton extends StatelessWidget { | |||
return Row( | |||
children: data.map((index){ | |||
var margin; | |||
// if(index == 0 && size !=1){ | |||
// margin = const EdgeInsets.only(right: 10,); | |||
// }else if(index == size -1 && size != 2 && size != 1){ | |||
// margin = const EdgeInsets.only(left: 10); | |||
// }else{ | |||
// margin = const EdgeInsets.only(left: 10, right: 10); | |||
// } | |||
margin = const EdgeInsets.only(left: 10, right: 10); | |||
return Flexible( | |||
flex: 1, | |||
child: Shimmer.fromColors( | |||
@@ -3,6 +3,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/bloc/bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/bloc/home_banner_repository.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/home_banner_sk.dart'; | |||
import 'package:cached_network_image/cached_network_image.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_banner/model/HomeBannerModel.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
/// | |||
@@ -21,8 +23,7 @@ class _HomeBannerWidgetState extends State<HomeBannerWidget> { | |||
@override | |||
Widget build(BuildContext context) { | |||
return BlocProvider<HomeBannerBloc>( | |||
create: (_) => HomeBannerBloc(repository: HomeBannerRepository()) | |||
..add(HomeBannerInitEvent(widget.model)), | |||
create: (_) => HomeBannerBloc(repository: HomeBannerRepository())..add(HomeBannerInitEvent(widget.model)), | |||
child: HomeBannerContainer( | |||
model: widget.model, | |||
), | |||
@@ -40,6 +41,12 @@ class HomeBannerContainer extends StatefulWidget { | |||
} | |||
class _HomeBannerContainerState extends State<HomeBannerContainer> { | |||
/// 点击事件 | |||
void _itemOnClick(HomeBannerListItemModel model){ | |||
print('${model?.skip_identifier}'); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
return BlocConsumer<HomeBannerBloc, HomeBannerState>( | |||
@@ -53,45 +60,57 @@ class _HomeBannerContainerState extends State<HomeBannerContainer> { | |||
builder: (context, state) { | |||
print(state); | |||
if (state is HomeBannerLoadedState) { | |||
return ItemWidget( | |||
data: [1, 2, 3], | |||
); | |||
int lenght = state?.model?.list?.length ?? 0; | |||
if(lenght > 0) | |||
return _getMainWidget(data: state?.model?.list); | |||
else | |||
return HomeBannerSkeleton(widget?.model); | |||
} | |||
if (state is HomeBannerCacheState) { | |||
return ItemWidget( | |||
data: [1, 2], | |||
); | |||
int lenght = state?.model?.list?.length ?? 0; | |||
if(lenght > 0) | |||
return _getMainWidget(data: state?.model?.list); | |||
else | |||
return HomeBannerSkeleton(widget?.model); | |||
} | |||
return HomeBannerSkeleton(widget.model); | |||
}, | |||
); | |||
} | |||
} | |||
class ItemWidget extends StatelessWidget { | |||
final List data; | |||
ItemWidget({this.data}); | |||
@override | |||
Widget build(BuildContext context) { | |||
/// 获取主要视图 | |||
Widget _getMainWidget({List<HomeBannerListItemModel> data}){ | |||
return Container( | |||
height: 180.h, | |||
width: double.infinity, | |||
margin: EdgeInsets.only(top: 7.5, left: 2.5, right: 2.5), | |||
child: Row( | |||
children: data.map((index) { | |||
children: data.map((model) { | |||
return Flexible( | |||
flex: 1, | |||
child: Container( | |||
margin: EdgeInsets.only(left: 5, right: 5), | |||
decoration: BoxDecoration( | |||
color: Colors.lightBlue, | |||
borderRadius: BorderRadius.circular(7.5)), | |||
child: GestureDetector( | |||
behavior: HitTestBehavior.opaque, | |||
onTap: ()=> _itemOnClick(model), | |||
child: Container( | |||
margin: EdgeInsets.only(left: 5, right: 5), | |||
// decoration: BoxDecoration(color: Colors.lightBlue, borderRadius: BorderRadius.circular(7.5)), | |||
child: CachedNetworkImage(imageUrl: model?.img), | |||
), | |||
), | |||
); | |||
}).toList(), | |||
), | |||
); | |||
} | |||
} | |||
// | |||
// class ItemWidget extends StatelessWidget { | |||
// final List<HomeBannerListItemModel> data; | |||
// | |||
// ItemWidget({this.data}); | |||
// | |||
// @override | |||
// Widget build(BuildContext context) { | |||
// | |||
// } | |||
// } |
@@ -1,4 +1,40 @@ | |||
class HomeBannerModel { | |||
List<HomeBannerListItemModel> list; | |||
class HomeBannerModel{ | |||
HomeBannerModel({this.list}); | |||
} | |||
factory HomeBannerModel.fromJson(Map<String, dynamic> json) { | |||
return HomeBannerModel( | |||
list: json['list'] != null ? (json['list'] as List).map((i) => HomeBannerListItemModel.fromJson(i)).toList() : null, | |||
); | |||
} | |||
Map<String, dynamic> toJson() { | |||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
if (this.list != null) { | |||
data['list'] = this.list.map((v) => v.toJson()).toList(); | |||
} | |||
return data; | |||
} | |||
} | |||
class HomeBannerListItemModel { | |||
String img; | |||
String skip_identifier; | |||
HomeBannerListItemModel({this.img, this.skip_identifier}); | |||
factory HomeBannerListItemModel.fromJson(Map<String, dynamic> json) { | |||
return HomeBannerListItemModel( | |||
img: json['img']?.toString(), | |||
skip_identifier: json['skip_identifier']?.toString(), | |||
); | |||
} | |||
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; | |||
} | |||
} |
@@ -26,14 +26,22 @@ class HomeQuickEntryBloc extends Bloc<HomeQuickEntryEvent, HomeQuickEntryState> | |||
/// 初始化 | |||
Stream<HomeQuickEntryState> _mapHomeQuickEntryInitToState(HomeQuickEntryInitEvent event) async* { | |||
/// 获取缓存数据 | |||
/// 获取父页面传进来的数据 | |||
var parentData = await repository.fetchPreantData(event: event); | |||
if(!EmptyUtil.isEmpty(parentData)){ | |||
yield HomeQuickEntryLoadedState(model: parentData); | |||
return; | |||
} | |||
/// 获取本地缓存数据 | |||
var cached = await repository.fetchCachedData(event: event); | |||
if (!EmptyUtil.isEmpty(cached)) { | |||
yield HomeQuickEntryCachedState(); | |||
yield HomeQuickEntryCachedState(model: cached); | |||
} | |||
/// 获取网络的数据 | |||
var result = await repository.fetchData(event: event); | |||
if (!EmptyUtil.isEmpty(result)) { | |||
yield HomeQuickEntryLoadedState(); | |||
yield HomeQuickEntryLoadedState(model: result); | |||
} else { | |||
yield HomeQuickEntryErrorState(); | |||
} | |||
@@ -1,27 +1,58 @@ | |||
import 'dart:convert'; | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/model/home_quick_entry_model.dart'; | |||
import 'package:zhiying_comm/util/net_util.dart'; | |||
import 'package:zhiying_comm/util/empty_util.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'home_quick_entry_event.dart'; | |||
class HomeQuickEntryRepository { | |||
/// 获取数据 | |||
Future<dynamic> fetchData({@required HomeQuickEntryInitEvent event}) async { | |||
var result = await NetUtil.post('/api/v1/mod', params: {'ids':[event.model['mod_id']]}, cache: true); | |||
if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])){ | |||
Future<HomeQuickEntryModel> fetchData({@required HomeQuickEntryInitEvent event}) async { | |||
var result = await NetUtil.post('/api/v1/mod/${event.model['mod_id']}', params: { 'ids': [event.model['mod_id']]}, cache: true, method: NetMethod.GET); | |||
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | |||
Map<String, dynamic> data = result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]; | |||
return _getHomeQuickEntryModel(data); | |||
} | |||
return null; | |||
} | |||
/// 获取父页面传进来的数据 | |||
Future<HomeQuickEntryModel> fetchPreantData({@required HomeQuickEntryInitEvent event}) async{ | |||
try{ | |||
String jsonStr = event.model['data']; | |||
return HomeQuickEntryModel.fromJson(json.decode(jsonStr)); | |||
}catch(e){ | |||
Logger.log(e); | |||
} | |||
return null; | |||
} | |||
/// 获取缓存数据 | |||
Future<dynamic> fetchCachedData({@required HomeQuickEntryInitEvent event}) async{ | |||
var result = await NetUtil.getRequestCachedData('/api/v1/mod', params: {'ids':[event.model['mod_id']]}); | |||
if(!EmptyUtil.isEmpty(result)){ | |||
return result; | |||
Future<HomeQuickEntryModel> fetchCachedData({@required HomeQuickEntryInitEvent event}) async { | |||
var result = await NetUtil.getRequestCachedData('/api/v1/mod/${event.model['mod_id']}', params: {'ids': [event.model['mod_id']]}); | |||
if (!EmptyUtil.isEmpty(result)) { | |||
return _getHomeQuickEntryModel(result); | |||
} | |||
return null; | |||
} | |||
HomeQuickEntryModel _getHomeQuickEntryModel(var data) { | |||
try { | |||
if (!EmptyUtil.isEmpty(data) && !EmptyUtil.isEmpty(data['data'])) { | |||
var jsonData = jsonDecode(data['data']); | |||
if (!EmptyUtil.isEmpty(jsonData)) { | |||
HomeQuickEntryModel model = HomeQuickEntryModel.fromJson(jsonData); | |||
if (null != model) { | |||
return model; | |||
} | |||
} | |||
} | |||
} catch (e) { | |||
Logger.log(e); | |||
} | |||
return null; | |||
} | |||
} |
@@ -1,4 +1,6 @@ | |||
import 'package:equatable/equatable.dart'; | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/model/home_quick_entry_model.dart'; | |||
abstract class HomeQuickEntryState extends Equatable { | |||
const HomeQuickEntryState(); | |||
@@ -14,10 +16,24 @@ class InitialHomeQuickEntryState extends HomeQuickEntryState { | |||
} | |||
/// 加载数据完毕 | |||
class HomeQuickEntryLoadedState extends HomeQuickEntryState {} | |||
class HomeQuickEntryLoadedState extends HomeQuickEntryState { | |||
final HomeQuickEntryModel model; | |||
const HomeQuickEntryLoadedState({@required this.model}); | |||
@override | |||
List<Object> get props => [this.model]; | |||
} | |||
/// 加载缓存数据 | |||
class HomeQuickEntryCachedState extends HomeQuickEntryState {} | |||
class HomeQuickEntryCachedState extends HomeQuickEntryState { | |||
final HomeQuickEntryModel model; | |||
const HomeQuickEntryCachedState({@required this.model}); | |||
@override | |||
List<Object> get props => [this.model]; | |||
} | |||
/// 加载数据出错 | |||
class HomeQuickEntryErrorState extends HomeQuickEntryState {} |
@@ -0,0 +1,309 @@ | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:flutter/material.dart'; | |||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||
import 'package:flutter_swiper/flutter_swiper.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/bloc/bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/bloc/home_quick_entry_repository.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'package:cached_network_image/cached_network_image.dart'; | |||
import 'home_quick_entry_sk.dart'; | |||
import 'model/home_quick_entry_model.dart'; | |||
class HomeQuickEntry extends StatelessWidget { | |||
final Map<String, dynamic> model; | |||
const HomeQuickEntry(this.model); | |||
@override | |||
Widget build(BuildContext context) { | |||
return BlocProvider<HomeQuickEntryBloc>( | |||
create: (_) => HomeQuickEntryBloc(repository: HomeQuickEntryRepository())..add(HomeQuickEntryInitEvent(model: model)), | |||
child: HomeQuickEntryContianer(), | |||
); | |||
} | |||
} | |||
class HomeQuickEntryContianer extends StatefulWidget { | |||
@override | |||
_HomeQuickEntryContianerState createState() => _HomeQuickEntryContianerState(); | |||
} | |||
class _HomeQuickEntryContianerState extends State<HomeQuickEntryContianer> { | |||
/// Icon点击事件 | |||
void _itemIconClick(TypeNormal item){ | |||
print("item type = ${item.skip_identifier}"); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
return BlocConsumer<HomeQuickEntryBloc, HomeQuickEntryState>( | |||
listener: (context, state) { | |||
Logger.log('数据加载出错'); | |||
}, | |||
buildWhen: (prev, current) { | |||
if (current is HomeQuickEntryErrorState) { | |||
return false; | |||
} | |||
return true; | |||
}, | |||
builder: (context, state) { | |||
if (state is HomeQuickEntryCachedState) { | |||
return _getMainWidget(state.model); | |||
} | |||
if (state is HomeQuickEntryLoadedState) { | |||
return _getMainWidget(state.model); | |||
} | |||
return HomeQuickEntrySkeleton(); | |||
}, | |||
); | |||
} | |||
Widget _getMainWidget(HomeQuickEntryModel model) { | |||
// 数据总数 | |||
int totalDataSize = model?.type_normal?.length ?? 0; | |||
// 展示的总行数 | |||
int totalRowSize = int.parse(model?.row_size ?? '1'); | |||
// 展示的列数 | |||
int columSize = int.parse(model?.colum_size ?? '5'); | |||
// 图标的高度 | |||
double iconHeight = 40.0; | |||
// 标题的高度 | |||
double titleHeight = 20.0; | |||
// 子元素的高度 | |||
double itemHeight = iconHeight; | |||
// 如果有一级标题 | |||
if (!EmptyUtil.isEmpty(model?.title_1_open) && model.title_1_open == '1') { | |||
itemHeight = iconHeight + titleHeight; | |||
} | |||
//如果有二级标题 | |||
if (!EmptyUtil.isEmpty(model?.title_2_open) && model.title_2_open == '1') { | |||
itemHeight = iconHeight + titleHeight * 2; | |||
} | |||
// 进度条的边距 | |||
double barMargin = 15.0; | |||
// 总页数 | |||
int totalPage = totalDataSize % (totalRowSize * columSize) == 0 ? totalDataSize ~/ (totalRowSize * columSize) : (totalDataSize ~/ (totalRowSize * columSize)) + 1; | |||
// 总体高度 = 行数 * (子元素高度 + 边距高度) + 进度条的高度 | |||
double totalHeight = totalRowSize * (itemHeight + barMargin) + 4; | |||
if(!EmptyUtil.isEmpty(model?.pagination_open) && model.pagination_open == '0') { | |||
totalHeight = totalRowSize * (itemHeight + barMargin); | |||
} | |||
return Container( | |||
color: Colors.white, | |||
child: Container( | |||
margin: const EdgeInsets.only(top: 15, bottom: 15 ), | |||
height: totalHeight, // 总体高度 | |||
width: double.infinity, | |||
color: Colors.white, | |||
child: Swiper( | |||
itemCount: totalPage, | |||
loop: false, | |||
itemBuilder: (context, index) { | |||
return Container( | |||
height: double.infinity, | |||
width: double.infinity, | |||
padding: const EdgeInsets.symmetric(horizontal: 12.5), | |||
child: _getPageWidget( | |||
iconHeight: iconHeight, | |||
titleHeight: titleHeight, | |||
totalDataSize: totalDataSize, | |||
totalPage: totalPage, | |||
currentPage: index, | |||
totalRowSize: totalRowSize, | |||
columSize: columSize, | |||
model: model, | |||
itemHeight: itemHeight, | |||
), | |||
); | |||
}, | |||
pagination: _getSwiperPaginationContorl(model, totalPage), | |||
), | |||
), | |||
); | |||
} | |||
/// 页的数据 | |||
Widget _getPageWidget({double titleHeight, double iconHeight, int totalPage, int currentPage, int columSize, int totalRowSize, int totalDataSize, HomeQuickEntryModel model,double itemHeight}){ | |||
List rowList = []; | |||
for(int i = 0 ; i < totalRowSize; i ++){ | |||
rowList.add(i); | |||
} | |||
return Column( | |||
crossAxisAlignment: CrossAxisAlignment.start, | |||
mainAxisAlignment: MainAxisAlignment.start, | |||
children: rowList.map((currentRow){ | |||
return Container( | |||
padding: EdgeInsets.only(bottom: 15), | |||
width: double.infinity, | |||
child: _getRowWidget(titleHeight: titleHeight, iconHeight: iconHeight, totalPage: totalPage, currentPage: currentPage, columSize: columSize, totalRowSize: totalRowSize, totalDataSize: totalDataSize, model: model, currentRow: currentRow, itemHeight: itemHeight), | |||
); | |||
}).toList(), | |||
); | |||
} | |||
/// 行的数据 | |||
Widget _getRowWidget({double titleHeight, double iconHeight, int totalPage, int currentPage, int columSize, int totalRowSize, int totalDataSize, HomeQuickEntryModel model, int currentRow, double itemHeight}) { | |||
List itemList = []; | |||
for(int i = 0; i < columSize; i++){ | |||
itemList.add(i); | |||
} | |||
return Row( | |||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
children: itemList.map((currentIndex){ | |||
return _getColumWidget(titleHeight: titleHeight, iconHeight: iconHeight, totalPage: totalPage, currentPage: currentPage, totalDataSize: totalDataSize, columSize: columSize, totalRowSize: totalRowSize, model: model, currentRow: currentRow, currentColum: currentIndex, itemHeight: itemHeight,); | |||
}).toList(), | |||
); | |||
} | |||
/// item 的数据 | |||
Widget _getColumWidget({double titleHeight, double iconHeight, int totalPage, int currentPage, int columSize, int totalRowSize, int totalDataSize, HomeQuickEntryModel model, int currentRow,int currentColum, double itemHeight}){ | |||
// 当前index = 当前的页数+1 * 当前的行数 + 当前的列数 | |||
// int currentIndex = (currentPage + 1) * currentRow + currentColum + currentRow*columSize; | |||
// int currentIndex = currentPage != 0 ? currentPage * (columSize * totalRowSize) + columSize + currentRow * columSize : | |||
// currentColum + currentRow * columSize; | |||
// 当前元素的下表 = 当前的列数 + 当前的行数 * 列数 + 当前的页数 * 当前的行数 + 当前的列数 | |||
int currentIndex = currentColum + currentRow * columSize + currentPage * totalRowSize * columSize; | |||
// print('current Index sss = $currentIndex'); | |||
if(currentIndex >= totalDataSize){ | |||
return Container( height: itemHeight, width: 60,); | |||
} | |||
TypeNormal item = model?.type_normal[currentIndex]; | |||
return GestureDetector( | |||
behavior: HitTestBehavior.opaque, | |||
onTap: ()=> _itemIconClick(item), | |||
child: Container( | |||
height: itemHeight, | |||
width: 60, | |||
// color: Colors.red, | |||
child: Column( | |||
children: <Widget>[ | |||
/// 图标 | |||
MyNetWorkImage(item.img), | |||
/// 一级标题 | |||
Visibility( | |||
visible: !EmptyUtil.isEmpty(model?.title_1_open) && model.title_1_open == '1', | |||
child: Padding( | |||
padding: const EdgeInsets.only(top: 5), | |||
child: Text(item?.title_1 ?? '', style: TextStyle( fontSize: 10, color: HexColor.fromHex(model?.title_1_text_color)),), | |||
), | |||
), | |||
/// 二级标题 | |||
Visibility( | |||
visible: !EmptyUtil.isEmpty(model?.title_2_open) && model.title_2_open == '1', | |||
child: Padding( | |||
padding: const EdgeInsets.only(top: 5), | |||
child: Text(item?.title_2 ?? '', style: TextStyle( fontSize: 10, color: HexColor.fromHex(model?.title_2_text_color)),), | |||
), | |||
) | |||
], | |||
), | |||
), | |||
); | |||
} | |||
/// 进度条 | |||
SwiperPagination _getSwiperPaginationContorl(HomeQuickEntryModel model, int pageCount){ | |||
if(EmptyUtil.isEmpty(model?.pagination_open) || model.pagination_open == '0'){ | |||
return null; | |||
} | |||
if(model.pagination == 'type_point'){ | |||
// 点点点进度条 | |||
return _swiperPaginationDot(model); | |||
}else{ | |||
// 自定义进度条 | |||
return _swiperCustomPagination(pageCount); | |||
} | |||
} | |||
// 进度条 圆形 | |||
SwiperPagination _swiperPaginationDot(HomeQuickEntryModel model){ | |||
return SwiperPagination(margin: const EdgeInsets.only(), builder: DotSwiperPaginationBuilder( color: HexColor.fromHex(model?.pagination_unselect_color), activeColor: HexColor.fromHex(model?.pagination_select_color), size: 8, activeSize: 8)); | |||
} | |||
// 自定义进度条 条形 | |||
SwiperPlugin _swiperCustomPagination(int pageCount) { | |||
List list = []; | |||
for (int i = 0; i < pageCount; i++) { | |||
list.add(i); | |||
} | |||
return SwiperCustomPagination(builder: (BuildContext context, SwiperPluginConfig config) { | |||
return Align( | |||
alignment: Alignment(0.0, 1), | |||
child: Row( | |||
mainAxisAlignment: MainAxisAlignment.center, | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
children: list.map((index) { | |||
var borderRadius; | |||
if (index == 0) { | |||
borderRadius = BorderRadius.only(topLeft: Radius.circular(2), bottomLeft: Radius.circular(2)); | |||
} | |||
if (index == list.length - 1) { | |||
borderRadius = BorderRadius.only(topRight: Radius.circular(2), bottomRight: Radius.circular(2)); | |||
} | |||
if (index == config.activeIndex) { | |||
borderRadius = BorderRadius.all(Radius.circular(2)); | |||
} | |||
return Container( | |||
height: 4, | |||
width: 25, | |||
decoration: BoxDecoration(borderRadius: borderRadius, color: index == config.activeIndex ? HexColor.fromHex('#FF4242') : HexColor.fromHex('#FFFFFF')), | |||
); | |||
}).toList(), | |||
), | |||
); | |||
}); | |||
} | |||
} | |||
/// | |||
/// 图片build 优化 | |||
/// | |||
class MyNetWorkImage extends StatelessWidget { | |||
final String imgUrl; | |||
final double width; | |||
const MyNetWorkImage(this.imgUrl, {this.width = 40}); | |||
@override | |||
Widget build(BuildContext context) { | |||
return RepaintBoundary( | |||
child: CachedNetworkImage( | |||
width: width, | |||
imageUrl: imgUrl, | |||
), | |||
); | |||
} | |||
} |
@@ -1,5 +1,6 @@ | |||
import 'package:flutter/src/widgets/framework.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'home_quick_entry.dart'; | |||
import 'home_quick_entry_sk.dart'; | |||
import 'home_quick_entry_widget.dart'; | |||
@@ -14,6 +15,6 @@ class HomeQuickEntryCreater extends WidgetCreater { | |||
@override | |||
List<Widget> createWidgets(Map<String, dynamic> model) { | |||
return [HomeQuickEntryWidget(model)]; | |||
return [HomeQuickEntry(model)]; | |||
} | |||
} |
@@ -1,67 +1,118 @@ | |||
import 'package:flutter/material.dart'; | |||
import 'package:cached_network_image/cached_network_image.dart'; | |||
import 'package:flutter_swiper/flutter_swiper.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/bloc/bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/bloc/home_quick_entry_repository.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/home_quick_entry_sk.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/model/home_quick_entry_model.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||
/// | |||
/// 首页的快速入口widget | |||
/// | |||
class HomeQuickEntryWidget extends StatelessWidget { | |||
final Map<String, dynamic> model; | |||
HomeQuickEntryWidget(this.model); | |||
var data = []; | |||
@override | |||
Widget build(BuildContext context) { | |||
return BlocProvider<HomeQuickEntryBloc>( | |||
create: (_) => HomeQuickEntryBloc(repository: HomeQuickEntryRepository())..add(HomeQuickEntryInitEvent(model: model)), | |||
child: HomeQuickEntryWidgetContianer(), | |||
); | |||
} | |||
} | |||
class HomeQuickEntryWidgetContianer extends StatefulWidget { | |||
@override | |||
_HomeQuickEntryWidgetContianerState createState() => _HomeQuickEntryWidgetContianerState(); | |||
} | |||
class _HomeQuickEntryWidgetContianerState extends State<HomeQuickEntryWidgetContianer> { | |||
@override | |||
Widget build(BuildContext context) { | |||
int dataSize = 26; // 总数 | |||
int columSize = 5; // 列数 | |||
int rowSize = 2; // 行数 | |||
return BlocConsumer<HomeQuickEntryBloc, HomeQuickEntryState>( | |||
listener: (context, state) { | |||
Logger.log('数据加载出错'); | |||
}, | |||
buildWhen: (prev, current) { | |||
if (current is HomeQuickEntryErrorState) { | |||
return false; | |||
} | |||
return true; | |||
}, | |||
builder: (context, state) { | |||
if (state is HomeQuickEntryCachedState) { | |||
return _getMainWidget(state.model); | |||
} | |||
if (state is HomeQuickEntryLoadedState) { | |||
return _getMainWidget(state.model); | |||
} | |||
return HomeQuickEntrySkeleton(); | |||
}, | |||
); | |||
} | |||
for(int i = 0; i < dataSize; i ++ ){ | |||
data.add('$i'); | |||
} | |||
// 页数 | |||
int pageCount = data.length % (rowSize * columSize) == 0 | |||
? data.length ~/ (rowSize * columSize) | |||
: (data.length ~/ (rowSize * columSize)) + 1; | |||
Widget _getMainWidget(HomeQuickEntryModel model) { | |||
int dataSize = 15;//model?.type_normal?.length ?? 0; // 总数 | |||
int columSize = 5;//int.parse(model?.colum_size ?? '5'); // 列数 | |||
int rowSize = 2;//int.parse(model?.row_size ?? '2'); // 行数 | |||
rowSize = columSize * rowSize <= dataSize ? rowSize : dataSize % columSize == 0 ? dataSize ~/ columSize : (dataSize ~/ columSize) +1; | |||
// 页数 总数 % (columSize * rowSize) | |||
int pageCount = dataSize % (rowSize * columSize) == 0 ? dataSize ~/ (rowSize * columSize) : (dataSize ~/ (rowSize * columSize)) + 1; | |||
// 进度条底部距离 | |||
const double bottomSize = 15.0; | |||
// 子元素之间的下边距 | |||
const double itemPadding = 15.0; | |||
// 图片的高度 | |||
const double iconHeight = 40.0; | |||
// 一个标题➕边距的高度 | |||
const double titleHeight = 20; | |||
// 总体的高度 == 行数 * (图片高度 + 标题高度 + 元素之间的边距) + 上下内边距 | |||
double containerHeight = rowSize * (iconHeight + titleHeight + itemPadding*2) + (bottomSize*2); | |||
double containerHeight = 145.h * ( data.length >= rowSize * columSize ? rowSize : (data.length / columSize).ceil()) + (rowSize == 1 ? 0 : 25.h); | |||
// double headHeight = 50.h ; | |||
return Container( | |||
margin: EdgeInsets.only(bottom: 25.h), | |||
height: containerHeight ,//+ headHeight, | |||
// padding: const EdgeInsets.only(bottom: bottomSize, top: bottomSize), | |||
// padding: const EdgeInsets.only(top: bottomSize), | |||
color: Colors.green, | |||
height: containerHeight, | |||
width: double.infinity, | |||
child: Column( | |||
children: <Widget>[ | |||
// Container( | |||
// margin: EdgeInsets.symmetric(horizontal: 25.w), | |||
// height: headHeight, | |||
// color: Colors.green, | |||
// ), | |||
Expanded( | |||
child: Swiper( | |||
itemHeight: 145.h, | |||
containerHeight: double.infinity, | |||
duration: 100, | |||
scrollDirection: Axis.horizontal, | |||
loop: false, | |||
index: 0, | |||
autoplay: false, | |||
itemCount: pageCount, // 页数 | |||
itemBuilder: (BuildContext context, int index) { | |||
return HomeQuickEntrySwiperItem( | |||
data: data, | |||
showDataSize: columSize * rowSize, | |||
page: index, | |||
columSize: columSize, | |||
rowSize: rowSize, | |||
); | |||
}, | |||
pagination: _SwiperCustomPagination(pageCount), | |||
child: Container( | |||
// color: Colors.yellowAccent, | |||
child: Swiper( | |||
itemHeight: double.infinity, | |||
itemWidth: double.infinity, | |||
duration: 100, | |||
scrollDirection: Axis.horizontal, | |||
loop: false, | |||
containerWidth: double.infinity, | |||
containerHeight: 250, | |||
index: 0, | |||
itemCount: pageCount, | |||
// 页数 | |||
itemBuilder: (BuildContext context, int index) { | |||
return HomeQuickEntrySwiperItem( | |||
data: model?.type_normal, | |||
dataSize: dataSize, | |||
showDataSize: columSize * rowSize, | |||
page: index, | |||
columSize: columSize, | |||
rowSize: rowSize, | |||
itemPadding: itemPadding, | |||
); | |||
}, | |||
pagination: _SwiperCustomPagination(pageCount), | |||
), | |||
), | |||
) | |||
], | |||
@@ -70,51 +121,40 @@ class HomeQuickEntryWidget extends StatelessWidget { | |||
} | |||
// 自定义进度条 | |||
SwiperPlugin _SwiperCustomPagination(int pageCount){ | |||
SwiperPlugin _SwiperCustomPagination(int pageCount) { | |||
List list = []; | |||
for(int i = 0; i < pageCount; i ++){ | |||
for (int i = 0; i < pageCount; i++) { | |||
list.add(i); | |||
} | |||
return SwiperCustomPagination( | |||
builder: (BuildContext context, SwiperPluginConfig config){ | |||
return Align( | |||
alignment: Alignment(0.0, 1), | |||
child: Row( | |||
mainAxisAlignment: MainAxisAlignment.center, | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
children: list.map((index) { | |||
var borderRadius; | |||
if (index == 0) { | |||
borderRadius = BorderRadius.only( | |||
topLeft: Radius.circular(2), | |||
bottomLeft: Radius.circular(2)); | |||
} | |||
if (index == list.length - 1) { | |||
borderRadius = BorderRadius.only( | |||
topRight: Radius.circular(2), | |||
bottomRight: Radius.circular(2)); | |||
} | |||
if (index == config.activeIndex) { | |||
borderRadius = BorderRadius.all(Radius.circular(2)); | |||
} | |||
return Container( | |||
height: 4, | |||
width: 25, | |||
decoration: BoxDecoration( | |||
borderRadius: borderRadius, | |||
color: index == config.activeIndex | |||
? HexColor.fromHex('#FF4242') | |||
: HexColor.fromHex('#FFFFFF')), | |||
); | |||
}).toList(), | |||
), | |||
); | |||
} | |||
); | |||
return SwiperCustomPagination(builder: (BuildContext context, SwiperPluginConfig config) { | |||
return Align( | |||
alignment: Alignment(0.0, 1), | |||
child: Row( | |||
mainAxisAlignment: MainAxisAlignment.center, | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
children: list.map((index) { | |||
var borderRadius; | |||
if (index == 0) { | |||
borderRadius = BorderRadius.only(topLeft: Radius.circular(2), bottomLeft: Radius.circular(2)); | |||
} | |||
if (index == list.length - 1) { | |||
borderRadius = BorderRadius.only(topRight: Radius.circular(2), bottomRight: Radius.circular(2)); | |||
} | |||
if (index == config.activeIndex) { | |||
borderRadius = BorderRadius.all(Radius.circular(2)); | |||
} | |||
return Container( | |||
height: 4, | |||
width: 25, | |||
decoration: BoxDecoration(borderRadius: borderRadius, color: index == config.activeIndex ? HexColor.fromHex('#FF4242') : HexColor.fromHex('#FFFFFF')), | |||
); | |||
}).toList(), | |||
), | |||
); | |||
}); | |||
} | |||
} | |||
@@ -127,39 +167,46 @@ class HomeQuickEntrySwiperItem extends StatelessWidget { | |||
final int showDataSize; // 显示的数据 | |||
final int columSize; // 列数 | |||
final int rowSize; // 行数 | |||
final int dataSize; | |||
final double itemPadding; | |||
const HomeQuickEntrySwiperItem( | |||
{this.page, | |||
this.data, | |||
this.showDataSize, | |||
this.columSize, | |||
this.rowSize}); | |||
const HomeQuickEntrySwiperItem({this.page, this.data, this.showDataSize, this.columSize, this.rowSize, this.itemPadding, this.dataSize}); | |||
@override | |||
Widget build(BuildContext context) { | |||
// 当前显示的个数 | |||
int itemCount = (data.length - page * showDataSize) >= showDataSize ? showDataSize : (data.length - page * showDataSize); | |||
return GridView.builder( | |||
cacheExtent: double.infinity, | |||
scrollDirection: Axis.vertical, | |||
shrinkWrap: true, | |||
padding: const EdgeInsets.all(0), | |||
reverse: false, | |||
physics: NeverScrollableScrollPhysics(), | |||
itemCount: itemCount, | |||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( | |||
crossAxisCount: columSize, | |||
childAspectRatio: 1, | |||
crossAxisSpacing: 0, | |||
mainAxisSpacing: 25.h, | |||
), | |||
itemBuilder: (context, i) { | |||
return HomeQuickEntryItem( | |||
data: data[ itemCount == showDataSize ? page * showDataSize + i : page == 0 ? page + i : page * showDataSize + i ] | |||
); | |||
}); | |||
// int itemCount = (data.length - page * showDataSize) >= showDataSize ? showDataSize : (data.length - page * showDataSize); | |||
int itemCount = (dataSize - page * showDataSize) >= showDataSize ? showDataSize : (dataSize - page * showDataSize); | |||
print('${itemCount}'); | |||
return Container( | |||
// color: Colors.cyan, | |||
height: double.infinity, | |||
width: double.infinity, | |||
// margin: const EdgeInsets.only(bottom: 15), | |||
child: GridView.builder( | |||
cacheExtent: double.infinity, | |||
scrollDirection: Axis.vertical, | |||
shrinkWrap: true, | |||
primary: false, | |||
padding: const EdgeInsets.only(top: 15), | |||
reverse: false, | |||
addAutomaticKeepAlives: false, | |||
addRepaintBoundaries: false, | |||
physics: NeverScrollableScrollPhysics(), | |||
itemCount: itemCount, | |||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( | |||
crossAxisCount: columSize, | |||
childAspectRatio: 1, | |||
crossAxisSpacing: 0, | |||
mainAxisSpacing: 0, | |||
), | |||
itemBuilder: (context, i) { | |||
// return HomeQuickEntryItem(data: data[itemCount == showDataSize ? page * showDataSize + i : page == 0 ? page + i : page * showDataSize + i], itemPaddding: itemPadding,); | |||
// 最后一行 | |||
bool isLast = i >= (rowSize -1) * columSize; | |||
return HomeQuickEntryItem(data: null, itemPaddding: itemPadding, isLastRow: isLast,); | |||
}), | |||
); | |||
} | |||
} | |||
@@ -167,37 +214,49 @@ class HomeQuickEntrySwiperItem extends StatelessWidget { | |||
/// 快速入口的样式 | |||
/// | |||
class HomeQuickEntryItem extends StatelessWidget { | |||
var data; | |||
final TypeNormal data; | |||
final double itemPaddding; | |||
final bool isLastRow; | |||
HomeQuickEntryItem({this.data}); | |||
HomeQuickEntryItem({this.data, this.itemPaddding, this.isLastRow}); | |||
/// 子图标的点击 | |||
_itemOnClick(context){ | |||
Navigator.push(context, MaterialPageRoute( | |||
builder: (context){ | |||
return PageFactory.create('login', null); | |||
} | |||
)); | |||
_itemOnClick(context) { | |||
Navigator.push(context, MaterialPageRoute(builder: (context) { | |||
return PageFactory.create('login', null); | |||
})); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
return GestureDetector( | |||
onTap: () => _itemOnClick(context), | |||
child: Column( | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
mainAxisAlignment: MainAxisAlignment.center, | |||
children: <Widget>[ | |||
// 图片 | |||
MyNetWorkImage(), | |||
SizedBox(height: 10.h), | |||
Text( | |||
'京东爆款$data', | |||
style: | |||
TextStyle(color: HexColor.fromHex('#666666'), fontSize: 20.sp), | |||
), | |||
child: Container( | |||
margin: EdgeInsets.only(bottom: isLastRow ? 0 :0), | |||
color: Colors.red, | |||
child: Column( | |||
crossAxisAlignment: CrossAxisAlignment.center, | |||
mainAxisAlignment: MainAxisAlignment.start, | |||
children: <Widget>[ | |||
// 图片 | |||
MyNetWorkImage(data?.img?? 'https://profile.csdnimg.cn/3/3/0/3_canhuashu'), | |||
Padding( | |||
padding: const EdgeInsets.only(top: 5), | |||
child: Text( | |||
data?.title_1 ?? '京东', | |||
style: TextStyle(color: HexColor.fromHex('#666666'), fontSize: 20.sp), | |||
)), | |||
Padding( | |||
padding: const EdgeInsets.only(top: 5), | |||
child: Text( | |||
data?.title_1 ?? '京东', | |||
style: TextStyle(color: HexColor.fromHex('#666666'), fontSize: 20.sp), | |||
)), | |||
// SizedBox(height: 25.h,) | |||
], | |||
], | |||
), | |||
), | |||
); | |||
} | |||
@@ -207,13 +266,16 @@ class HomeQuickEntryItem extends StatelessWidget { | |||
/// 图片build 优化 | |||
/// | |||
class MyNetWorkImage extends StatelessWidget { | |||
final String imgUrl; | |||
const MyNetWorkImage(this.imgUrl); | |||
@override | |||
Widget build(BuildContext context) { | |||
return RepaintBoundary( | |||
child: CachedNetworkImage( | |||
height: 80.h, | |||
width: 80.h, | |||
imageUrl: 'https://upload.jianshu.io/users/upload_avatars/665534/aff6ec240f60?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96/format/webp', | |||
width: 40, | |||
imageUrl: imgUrl, | |||
), | |||
); | |||
} | |||
@@ -0,0 +1,98 @@ | |||
class HomeQuickEntryDataModel { | |||
String data; | |||
String aspect_ratio; | |||
String badge; | |||
String bg_color; | |||
String bg_color_t; | |||
String bg_img; | |||
String font_color; | |||
String icon; | |||
String img; | |||
int is_global; | |||
String margin; | |||
int mod_id; | |||
String mod_name; | |||
int mod_pid; | |||
String path; | |||
String position; | |||
String skip_identifier; | |||
int sort; | |||
String subtitle; | |||
String title; | |||
String url; | |||
HomeQuickEntryDataModel( | |||
{this.data, | |||
this.aspect_ratio, | |||
this.badge, | |||
this.bg_color, | |||
this.bg_color_t, | |||
this.bg_img, | |||
this.font_color, | |||
this.icon, | |||
this.img, | |||
this.is_global, | |||
this.margin, | |||
this.mod_id, | |||
this.mod_name, | |||
this.mod_pid, | |||
this.path, | |||
this.position, | |||
this.skip_identifier, | |||
this.sort, | |||
this.subtitle, | |||
this.title, | |||
this.url}); | |||
factory HomeQuickEntryDataModel.fromJson(Map<String, dynamic> json) { | |||
return HomeQuickEntryDataModel( | |||
data: json['data'], | |||
aspect_ratio: json['aspect_ratio'], | |||
badge: json['badge'], | |||
bg_color: json['bg_color'], | |||
bg_color_t: json['bg_color_t'], | |||
bg_img: json['bg_img'], | |||
font_color: json['font_color'], | |||
icon: json['icon'], | |||
img: json['img'], | |||
is_global: json['is_global'], | |||
margin: json['margin'], | |||
mod_id: json['mod_id'], | |||
mod_name: json['mod_name'], | |||
mod_pid: json['mod_pid'], | |||
path: json['path'], | |||
position: json['position'], | |||
skip_identifier: json['skip_identifier'], | |||
sort: json['sort'], | |||
subtitle: json['subtitle'], | |||
title: json['title'], | |||
url: json['url'], | |||
); | |||
} | |||
Map<String, dynamic> toJson() { | |||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
data['data'] = this.data; | |||
data['aspect_ratio'] = this.aspect_ratio; | |||
data['badge'] = this.badge; | |||
data['bg_color'] = this.bg_color; | |||
data['bg_color_t'] = this.bg_color_t; | |||
data['bg_img'] = this.bg_img; | |||
data['font_color'] = this.font_color; | |||
data['icon'] = this.icon; | |||
data['img'] = this.img; | |||
data['is_global'] = this.is_global; | |||
data['margin'] = this.margin; | |||
data['mod_id'] = this.mod_id; | |||
data['mod_name'] = this.mod_name; | |||
data['mod_pid'] = this.mod_pid; | |||
data['path'] = this.path; | |||
data['position'] = this.position; | |||
data['skip_identifier'] = this.skip_identifier; | |||
data['sort'] = this.sort; | |||
data['subtitle'] = this.subtitle; | |||
data['title'] = this.title; | |||
data['url'] = this.url; | |||
return data; | |||
} | |||
} |
@@ -1,4 +1,100 @@ | |||
class HomeQuickEntryModel { | |||
String colum_size; | |||
String data_type; | |||
String pagination; | |||
String pagination_select_color; | |||
String pagination_unselect_color; | |||
String row_size; | |||
String title_1_text_color; | |||
String title_2_text_color; | |||
List<TypeNormal> type_normal; | |||
String title_1_open; | |||
String title_2_open; | |||
String pagination_open; | |||
class HomeQuickEntryModel{ | |||
HomeQuickEntryModel( | |||
{this.colum_size, | |||
this.data_type, | |||
this.pagination, | |||
this.pagination_select_color, | |||
this.pagination_unselect_color, | |||
this.row_size, | |||
this.title_1_text_color, | |||
this.title_2_text_color, | |||
this.title_1_open, | |||
this.title_2_open, | |||
this.pagination_open, | |||
this.type_normal}); | |||
} | |||
factory HomeQuickEntryModel.fromJson(Map<String, dynamic> json) { | |||
return HomeQuickEntryModel( | |||
colum_size: json['colum_size']?.toString(), | |||
data_type: json['data_type']?.toString(), | |||
pagination: json['pagination']?.toString(), | |||
pagination_select_color: json['pagination_select_color']?.toString(), | |||
pagination_unselect_color: json['pagination_unselect_color']?.toString(), | |||
row_size: json['row_size']?.toString(), | |||
title_1_text_color: json['title_1_text_color']?.toString(), | |||
title_2_text_color: json['title_2_text_color']?.toString(), | |||
title_1_open: json['title_1_open']?.toString(), | |||
title_2_open: json['title_2_open']?.toString(), | |||
pagination_open: json['pagination_open']?.toString(), | |||
type_normal: json['type_normal'] != null ? (json['type_normal'] as List).map((i) => TypeNormal.fromJson(i)).toList() : null, | |||
); | |||
} | |||
Map<String, dynamic> toJson() { | |||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
data['colum_size'] = this.colum_size; | |||
data['data_type'] = this.data_type; | |||
data['pagination'] = this.pagination; | |||
data['pagination_select_color'] = this.pagination_select_color; | |||
data['pagination_unselect_color'] = this.pagination_unselect_color; | |||
data['row_size'] = this.row_size; | |||
data['title_1_text_color'] = this.title_1_text_color; | |||
data['title_2_text_color'] = this.title_2_text_color; | |||
data['pagination_open'] = this.pagination_open; | |||
data['title_1_open'] = this.title_1_open; | |||
data['title_2_open'] = this.title_2_open; | |||
if (this.type_normal != null) { | |||
data['type_normal'] = this.type_normal.map((v) => v.toJson()).toList(); | |||
} | |||
return data; | |||
} | |||
} | |||
class TypeNormal { | |||
String img; | |||
String required_login; | |||
String required_taobao_auth; | |||
String skip_identifier; | |||
String title_1; | |||
String title_2; | |||
String 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(), | |||
); | |||
} | |||
Map<String, dynamic> toJson() { | |||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
data['img'] = this.img; | |||
data['required_login'] = this.required_login; | |||
data['required_taobao_auth'] = this.required_taobao_auth; | |||
data['skip_identifier'] = this.skip_identifier; | |||
data['title_1'] = this.title_1; | |||
data['title_2'] = this.title_2; | |||
data['type'] = this.type; | |||
return data; | |||
} | |||
} |
@@ -19,6 +19,9 @@ class HomeSlideBannerRepository { | |||
return null; | |||
} | |||
/// 获取父页面传进来的数据 | |||
/// 获取数据 | |||
Future<List<HomeSlideBannerModelItems>> fetchData({@required int id}) async { | |||
var params = await NetUtil.post('/api/v1/mod', | |||