You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
8.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import '../../model/ProductModel.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import '../../config/Config.dart';
import 'package:dio/dio.dart';
// import '../../services/SignServices.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
//轮播图类模型
import '../../model/FocusModel.dart';
class HomePage extends StatefulWidget {
HomePage({Key key}) : super(key: key);
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage>
with AutomaticKeepAliveClientMixin {
List _focusData = [];
List _hotProductList = [];
List _bestProductList = [];
@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
_getFocusData();
_getHotProductData();
_getBestProductData();
// SignServices.getSign();
}
//获取轮播图数据
_getFocusData() async {
var api = '${Config.domain}api/focus';
var result = await Dio().get(api);
var focusList = FocusModel.fromJson(result.data);
setState(() {
this._focusData = focusList.result;
});
}
//获取猜你喜欢的数据
_getHotProductData() async {
var api = '${Config.domain}api/plist?is_hot=1';
var result = await Dio().get(api);
var hotProductList = ProductModel.fromJson(result.data);
setState(() {
this._hotProductList = hotProductList.result;
});
}
//获取热门推荐的数据
_getBestProductData() async {
var api = '${Config.domain}api/plist?is_best=1';
var result = await Dio().get(api);
var bestProductList = ProductModel.fromJson(result.data);
setState(() {
this._bestProductList = bestProductList.result;
});
}
//轮播图
Widget _swiperWidget() {
if (this._focusData.length > 0) {
return Container(
child: AspectRatio(
aspectRatio: 2 / 1,
child: Swiper(
itemBuilder: (BuildContext context, int index) {
String pic = this._focusData[index].pic;
pic = Config.domain + pic.replaceAll('\\', '/');
return new Image.network(
"${pic}",
fit: BoxFit.fill,
);
},
itemCount: this._focusData.length,
pagination: new SwiperPagination(),
autoplay: true),
),
);
} else {
return Text('加载中...');
}
}
Widget _titleWidget(value) {
return Container(
height: ScreenUtil().setHeight(60),
margin: EdgeInsets.only(left: ScreenUtil().setWidth(20)),
padding: EdgeInsets.only(left: ScreenUtil().setWidth(20)),
decoration: BoxDecoration(
border: Border(
left: BorderSide(
color: Colors.red,
width: ScreenUtil().setWidth(10),
))),
child: Text(
value,
style: TextStyle(color: Colors.black54),
),
);
}
//热门商品
Widget _hotProductListWidget() {
if (this._hotProductList.length > 0) {
return Container(
height: ScreenUtil().setHeight(234),
padding: EdgeInsets.all(ScreenUtil().setWidth(20)),
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemBuilder: (contxt, index) {
//处理图片
String sPic = this._hotProductList[index].sPic;
sPic = Config.domain + sPic.replaceAll('\\', '/');
return Column(
children: <Widget>[
Container(
height: ScreenUtil().setHeight(140),
width: ScreenUtil().setWidth(140),
margin: EdgeInsets.only(right: ScreenUtil().setWidth(21)),
child: Image.network(sPic, fit: BoxFit.cover),
),
Container(
padding: EdgeInsets.only(top: ScreenUtil().setHeight(10)),
height: ScreenUtil().setHeight(50),
child: Text(
"¥${this._hotProductList[index].price}",
style: TextStyle(color: Colors.red),
),
)
],
);
},
itemCount: this._hotProductList.length,
),
);
} else {
return Text("");
}
}
//推荐商品
Widget _recProductListWidget() {
var itemWidth = (ScreenUtil().screenWidth - 30) / 2;
return Container(
padding: EdgeInsets.all(10),
child: Wrap(
runSpacing: 10,
spacing: 10,
children: this._bestProductList.map((value) {
//图片
String sPic = value.sPic;
sPic = Config.domain + sPic.replaceAll('\\', '/');
return InkWell(
onTap: () {
Navigator.pushNamed(context, '/productContent',
arguments: {"id": value.sId});
},
child: Container(
padding: EdgeInsets.all(10),
width: itemWidth,
decoration: BoxDecoration(
border: Border.all(
color: Color.fromRGBO(233, 233, 233, 0.9), width: 1)),
child: Column(
children: <Widget>[
Container(
width: double.infinity,
child: AspectRatio(
//防止服务器返回的图片大小不一致导致高度不一致问题
aspectRatio: 1 / 1,
child: Image.network(
"${sPic}",
fit: BoxFit.cover,
),
),
),
Padding(
padding: EdgeInsets.only(top: ScreenUtil().setHeight(20)),
child: Text(
"${value.num}",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(color: Colors.black54),
),
),
Padding(
padding: EdgeInsets.only(top: ScreenUtil().setHeight(20)),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Text(
"¥${value.price}",
style: TextStyle(color: Colors.red, fontSize: 16),
),
),
Align(
alignment: Alignment.centerRight,
child: Text("¥${value.oldPrice}",
style: TextStyle(
color: Colors.black54,
fontSize: 14,
decoration: TextDecoration.lineThrough)),
)
],
),
)
],
),
),
);
}).toList(),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.center_focus_weak, size: 28, color: Colors.black87),
onPressed: null,
),
title: InkWell(
child: Container(
height: ScreenUtil().setHeight(68),
decoration: BoxDecoration(
color: Color.fromRGBO(233, 233, 233, 0.8),
borderRadius: BorderRadius.circular(30)),
padding: EdgeInsets.only(left: 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Icon(Icons.search),
Text("笔记本", style: TextStyle(fontSize: ScreenUtil().setSp(28)))
],
),
),
onTap: () {
Navigator.pushNamed(context, '/search');
},
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.message, size: 28, color: Colors.black87),
onPressed: null,
)
],
),
body: ListView(
children: <Widget>[
_swiperWidget(),
SizedBox(height: ScreenUtil().setHeight(20)),
_titleWidget("猜你喜欢"),
SizedBox(height: ScreenUtil().setHeight(20)),
_hotProductListWidget(),
_titleWidget("热门推荐"),
_recProductListWidget()
],
),
);
}
}