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

755 lines
25 KiB

import 'package:flutter/cupertino.dart';
import 'package:new_recook/constants/styles.dart';
import 'package:new_recook/gen/assets.gen.dart';
import 'package:new_recook/models/goods/goods_item_grind_widget.dart';
import 'package:new_recook/models/goods/goods_item_widget.dart';
import 'package:new_recook/models/goods/goods_model.dart';
import 'package:new_recook/utils/headers.dart';
import 'package:new_recook/utils/hive_store.dart';
import 'package:new_recook/utils/text_utils.dart';
import 'package:new_recook/widget/button/text_button.dart';
import 'package:new_recook/widget/custom_floating_action_button_location.dart';
import 'package:new_recook/widget/goods_sort_widget.dart';
import 'package:new_recook/widget/no_data_widget.dart';
import 'package:new_recook/widget/recook_back_button.dart';
import 'package:new_recook/widget/refresh_widget.dart';
import 'package:waterfall_flow/waterfall_flow.dart';
class HomeSearchPage extends StatefulWidget {
const HomeSearchPage({Key? key}) : super(key: key);
@override
_HomeSearchPageState createState() => _HomeSearchPageState();
}
class _HomeSearchPageState extends State<HomeSearchPage> {
String _searchText = "";
FocusNode _contentFocusNode = FocusNode();
ScrollController _scrollController = ScrollController();
TextEditingController? _textEditController = TextEditingController();
bool _startSearch = false;
bool showFab = false;
List<String> _searchHistory = [];
List<String> _hotSearch = ['行李111箱','收纳222盒','美莲333宝','U33333盘','净333水器','粉底333液','bb霜','小米','123','222','333','4444'];
bool _displayList = false;//默认排列方式改为瀑布流
List _recommendWords = [];//推荐分词
bool _onLoad = true;
List<GoodsModel> goodsList = [
];
GSRefreshController _refreshController =
GSRefreshController(initialRefresh: true);
List<GoodsModel> likeGoodsList = [
GoodsModel(goodsName: '李子园牛奶李子园牛奶李子园牛奶李子园牛奶李子园牛奶',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶12',saleNum: 2200,shopName: '蒙牛旗舰店',price: '200.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶22',saleNum: 9900,shopName: '蒙牛旗舰店',price: '300.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶33',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶44',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
];
@override
void initState() {
super.initState();
getSearchListFromSharedPreferences();
}
@override
void dispose() {
super.dispose();
_refreshController.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.frenchColor,
floatingActionButton: !TextUtils.isEmpty(_textEditController!.text) &&
_startSearch? showFab? _customer():SizedBox():SizedBox(),
floatingActionButtonLocation:CustomFloatingActionButtonLocation(FloatingActionButtonLocation.endDocked, 0, -140.w),
appBar: AppBar(
title: _buildTitle(),
titleSpacing: 0,
backgroundColor: Color(0xFFFBFBFB),
leading: RecookBackButton(),
actions: _rightActions(),
//centerTitle: true,
),
body: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
FocusScope.of(context).requestFocus(FocusNode());
},
child: Stack(
children: <Widget>[
Positioned(child: Column(
children: [
GoodsSortWidget(onTap: (OrderType type) { },trialing: _displayIcon(),),
Offstage(
offstage: !(goodsList.length==0),
child: Container(
color: Colors.white,
child: Container(
padding: EdgeInsets.only(top: 10.w),
child: Column(
children: <Widget>[
_recommendWidget(),
],
)),
)),
Expanded(child: _searchList()),
],
)),
Positioned(
child: Offstage(
offstage: !TextUtils.isEmpty(_textEditController!.text) &&
_startSearch,
child: Container(
color: Colors.white,
child: Container(
child: ListView(
children: <Widget>[
_searchHistory.isNotEmpty?
_searchHistoryWidget():SizedBox(),
10.hb,
_hotSearchWidget(),
_hotGoods(),
],
)),
))),
],
),
),
);
}
_searchList(){
return RefreshWidget(
controller: _refreshController,
color: AppColor.themeColor,
onRefresh: () async {
_refreshController.refreshCompleted();
goodsList = [
GoodsModel(goodsName: '李子园牛奶李子园牛奶李子园牛奶李子园牛奶李子园牛奶',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶12',saleNum: 2200,shopName: '蒙牛旗舰店',price: '200.5',imgPath: '',inventory: 0),
GoodsModel(goodsName: '李子园牛奶22',saleNum: 9900,shopName: '蒙牛旗舰店',price: '300.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶33',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
GoodsModel(goodsName: '李子园牛奶44',saleNum: 100,shopName: '蒙牛旗舰店',price: '100.5',imgPath: '',inventory: 200),
];
_onLoad = false;
setState(() {});
},
onLoadMore: () async {
_refreshController.loadComplete();
},
body: _onLoad?SizedBox():Padding(padding: EdgeInsets.only(top: 10.w,left: 16.w,right: 16.w),child:_buildList() ,)
);
}
_buildList(){
return CustomScrollView(
controller: _scrollController,
slivers: [
goodsList.isNotEmpty?SliverWaterfallFlow(
delegate: SliverChildBuilderDelegate(
(context, index) {
return GestureDetector(
onTap: () {
///前往商品详情页面
},
child: _displayList
? GoodsItemWidget(goodsModel: goodsList[index],)
: GoodsItemGrindWidget(goodsModel: goodsList[index],));
},
childCount: goodsList.length,
),
gridDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
crossAxisCount: _displayList ? 1 : 2,
crossAxisSpacing: _displayList ? 5 : 10,
mainAxisSpacing: _displayList ? 5 : 10,
),
// ItemTagWidget.getSliverGridDelegate(_displayList, context),
):SliverToBoxAdapter(child: NoDataWidget(text: '换个关键词搜索一下吧~',height: 800.w,)),
// SliverToBoxAdapter(
// child: goodsList.isEmpty
// ? Padding(
// padding: EdgeInsets.only(top: 80.w, bottom: 20.w),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Container(
// height: 4.w,
// color: Color(0xFFB8B8B8),
// width: 80.w,
// ),
// 20.hb,
// Text(
// '猜你喜欢',
// style: TextStyle(
// fontSize:30.sp,
// fontWeight: FontWeight.bold,
// color: Colors.black87,
// ),
// ),
// 20.hb,
// Container(
// height:4.w,
// color: Color(0xFFB8B8B8),
// width: 80.w,
// ),
// ],
// ),
// )
// : SizedBox(),
// ),
// SliverToBoxAdapter(
// child: goodsList.isEmpty&&likeGoodsList.isNotEmpty
// ? ListView.builder(
// shrinkWrap: true,
// physics: NeverScrollableScrollPhysics(),
// itemBuilder: (context, index) {
// return Container(
// padding: EdgeInsets.only(bottom: 5),
// color: AppColor.frenchColor,
// child: GoodsItemWidget(goodsModel: likeGoodsList[index],)
//
// );
// },
// itemCount: likeGoodsList.length,
// )
// : SizedBox()),
],
);
}
_displayIcon() {
return Container(
margin: EdgeInsets.symmetric(horizontal: 16.w),
color: Colors.transparent,
child: GestureDetector(
onTap: () {
setState(() {
_displayList = !_displayList;
});
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: 1.w,
height: 45.w,
margin: EdgeInsets.only(right: 15.w),
color: Color(0xFF333333),
),
Text(
"排列",
style:TextStyle(
fontSize: 28.sp,color: Color(0xFF333333),
)
),
Padding(
padding: EdgeInsets.only(left: 10.w,top: 5.w),
child: Image.asset( _displayList
?Assets.icons.iconChangeList.path
: Assets.icons.iconChangeGrid.path,width: 25.w,height: 25.w,)
),
],
),
),
);
}
_keyWordsTitle(){
return Container(
child: Container(
margin: EdgeInsets.only(left: 20.w, top: 10.w,right: 20.w),
child:
Text(
'没找到相关宝贝,试试',
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 14 * 2.sp,
),
),
));
}
_recommendWidget() {
List<Widget> keyWordList = [];
if (_recommendWords.length > 0) {
for (int i=0;i<_recommendWords.length;i++) {
keyWordList.add(Padding(
padding: EdgeInsets.only(right: 10, bottom: 5),
child: ChoiceChip(
backgroundColor: AppColor.frenchColor,
// disabledColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15 * 2.sp, color: Colors.black),
labelPadding: EdgeInsets.only(left: 20, right: 20),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onSelected: (bool value) async {
_searchText = _recommendWords[i].token??'';
_textEditController!.text = _recommendWords[i].token!;
FocusManager.instance.primaryFocus!.unfocus();
//_callRefresh();
setState(() {});
},
label: Text(_recommendWords[i].token!),
selected: false,
),
));
}
keyWordList.insert(0, _keyWordsTitle());
}
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.only(left: 10, right: 10),
child: Wrap(
children: keyWordList,
),
),
// Spacer()
],
),
);
}
_hotGoods(){
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(left: 20.w,top: 20.w),
child: Text(
'热门商品',
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 16 * 2.sp,
),
),
),
20.hb,
GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
padding: EdgeInsets.symmetric(horizontal: 20.w),
itemCount: 6,
//SliverGridDelegateWithFixedCrossAxisCount 构建一个横轴固定数量Widget
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
//横轴元素个数
crossAxisCount: 2,
//纵轴间距
mainAxisSpacing: 6,
//横轴间距
crossAxisSpacing: 6,
//子组件宽高长度比例
childAspectRatio: 165 /48 ),
itemBuilder: (BuildContext context, int index) {
return Row(
children: [
Container(color: Colors.red,width: 96.w,height: 96.w,),
10.wb,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'雪仑尔长绒棉浴巾',
style: TextStyle(
color: Color(0xFF111111),
fontSize: 20.sp,
),
),
Spacer(),
Text.rich( TextSpan(
text: '¥',
style: TextStyle(
color: Color(0xFFC92219),
fontSize: 20.sp,
),
children: [
TextSpan(
text:
'299',
style: TextStyle(
color: Color(0xFFC92219),
fontSize: 28.sp,
),
),
]
),)
],
)
],
);
}
),
],
);
}
_hotSearchWidget() {
List<Widget> choiceChipList = [];
if (_hotSearch.isNotEmpty && _hotSearch.length > 0) {
for (var text in _hotSearch) {
if(choiceChipList.length==10){
choiceChipList.removeAt(9);
choiceChipList.insert(0,
Padding(
padding: EdgeInsets.only(right: 15.w, bottom: 10.w,left: 15.w),
child: ChoiceChip(
backgroundColor:Color(0xFFF6F6F6),
// disabledColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15 * 2.sp, color: Colors.black),
labelPadding: EdgeInsets.only(left: 16.w, right: 16.w),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onSelected: (bool value) async {
_searchText = text;
_textEditController!.text = text;
FocusManager.instance.primaryFocus!.unfocus();
setState(() {});
},
label: Text(text,style: TextStyle(color: Color(0xD9111111),fontSize: 20.sp),),
selected: false,
),
));
}else{
choiceChipList.insert(0,
Padding(
padding: EdgeInsets.only(right: 15.w, bottom: 10.w,left: 15.w),
child: ChoiceChip(
backgroundColor:Color(0xFFF6F6F6),
// disabledColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15 * 2.sp, color: Colors.black),
labelPadding: EdgeInsets.only(left: 16.w, right: 16.w),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onSelected: (bool value) async {
_searchText = text;
_textEditController!.text = text;
FocusManager.instance.primaryFocus!.unfocus();
setState(() {});
},
label: Text(text,style: TextStyle(color: Color(0xD9111111),fontSize: 20.sp),),
selected: false,
),
));
}
}
}
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
child: Container(
margin: EdgeInsets.only(left: 20.w, top: 10.w, bottom: 20.w),
child: Row(
children: <Widget>[
Text(
'热门搜索',
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 16 * 2.sp,
),
),
Spacer()
],
)),
),
Container(
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.only(left: 10.w, right: 10.w),
child: Wrap(
children: choiceChipList,
),
),
// Spacer()
],
),
);
}
_searchHistoryWidget() {
List<Widget> choiceChipList = [];
if (_searchHistory.isNotEmpty && _searchHistory.length > 0) {
for (var text in _searchHistory) {
if(choiceChipList.length==10){
choiceChipList.insert(0,Padding(
padding: EdgeInsets.only(right: 15.w, bottom: 10.w,left: 15.w),
child: ChoiceChip(
backgroundColor:Color(0xFFF6F6F6),
// disabledColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15 * 2.sp, color: Colors.black),
labelPadding: EdgeInsets.only(left: 16.w, right: 16.w),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onSelected: (bool value) async {
_searchText = text;
_textEditController!.text = text;
FocusManager.instance.primaryFocus!.unfocus();
setState(() {});
},
label: Text(text,style: TextStyle(color: Color(0xD9111111),fontSize: 20.sp),),
selected: false,
),
));
}else{
choiceChipList.insert(0,Padding(
padding: EdgeInsets.only(right: 15.w, bottom: 10.w,left: 15.w),
child: ChoiceChip(
backgroundColor:Color(0xFFF6F6F6),
// disabledColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15 * 2.sp, color: Colors.black),
labelPadding: EdgeInsets.only(left: 16.w, right: 16.w),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onSelected: (bool value) async {
_searchText = text;
_textEditController!.text = text;
FocusManager.instance.primaryFocus!.unfocus();
setState(() {});
},
label: Text(text,style: TextStyle(color: Color(0xD9111111),fontSize: 20.sp),),
selected: false,
),
));
}
}
}
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
child: Container(
margin: EdgeInsets.only(left: 20.w, top: 10.w, bottom: 20.w),
child: Row(
children: <Widget>[
Text(
'历史搜索',
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 16 * 2.sp,
),
),
Spacer(),
(_searchHistory.length > 0)
? GestureDetector(
onTap: () {
_searchHistory = [];
saveSearchListToSharedPreferences(
_searchHistory);
setState(() {});
},
child: Image.asset(
Assets.icons.delete.path,
width: 40.w,
height: 40.w,
),
)
: Container(),
36.wb,
],
)),
),
Container(
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.only(left: 10.w, right: 10.w),
child: Wrap(
children: choiceChipList,
),
),
// Spacer()
],
),
);
}
_customer(){
return GestureDetector(
onTap: () async{
// if(_listViewController!.getData().length>4)
_scrollController.jumpTo(0);
},
child: Container(
width: 92.w,
height: 92.w,
decoration: BoxDecoration(
color: Color(0xFF000000).withOpacity(0.7),
borderRadius: BorderRadius.all(Radius.circular(46.w)),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(Assets.icons.totop.path,width: 60.w,height: 60.w,color: Colors.white,),
],
),
),
);
}
Widget _buildTitle() {
return Container(
height: 80.w,
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(40.w),
boxShadow: [
BoxShadow(
color: Color(0xFFDBDBDB),
blurRadius: 2,
offset: Offset(0, 1),
),
]
),
child: Row(
// mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Icon(
Icons.search,
size: 40.w,
color: Colors.grey,
),
),
Expanded(
child: CupertinoTextField(
autofocus: true,
keyboardType: TextInputType.text,
controller: _textEditController,
textInputAction: TextInputAction.search,
onSubmitted: (_submitted) async {
if (TextUtils.isEmpty(_searchText)) return;
_startSearch = true;
_contentFocusNode.unfocus();
_searchText = _searchText.trimLeft();
_searchText = _searchText.trimRight();
remember();
saveSearchListToSharedPreferences(_searchHistory);
setState(() {});
},
focusNode: _contentFocusNode,
onChanged: (text) {
_startSearch = false;
_searchText = text;
setState(() {
});
},
placeholder: "请输入想要搜索的内容...",
placeholderStyle: TextStyle(
color: Colors.grey.shade500,
fontSize: 28.sp,
fontWeight: FontWeight.w300),
decoration: BoxDecoration(color: Colors.white.withAlpha(0)),
style: TextStyle(
color: Colors.black,
textBaseline: TextBaseline.ideographic),
),
)
],
));
}
///保存搜索记录
remember() {
print(_searchText);
if (_searchHistory.contains(_searchText)) {
_searchHistory.remove(_searchText);
List<String> list = [_searchText];
list.addAll(_searchHistory);
_searchHistory = list;
} else {
List<String> list = [_searchText];
list.addAll(_searchHistory);
_searchHistory = list;
while (_searchHistory.length > 15) {
_searchHistory.removeLast();
}
}
saveSearchListToSharedPreferences(_searchHistory);
setState(() {});
}
getSearchListFromSharedPreferences() async {
var history = HiveStore.appBox.get(
"userSearhHistory");
if (history != null) {
_searchHistory = (history as List).cast<String>().toList();
}
setState(() {});
}
///保存搜索记录
saveSearchListToSharedPreferences(List<String> value) async {
HiveStore.appBox.put(
"userSearhHistory",
value);
}
List<Widget> _rightActions() {
return <Widget>[
Container(
padding: EdgeInsets.symmetric(horizontal: 20.w),
child: TextReButton(
onPressed: () {
if (TextUtils.isEmpty(_searchText)) return;
_startSearch = true;
_contentFocusNode.unfocus();
_searchText = _searchText.trimLeft();
_searchText = _searchText.trimRight();
remember();
saveSearchListToSharedPreferences(_searchHistory);
setState(() {});
},
text: "搜索",
style: TextStyle(
color: TextUtils.isEmpty(_searchText)
? Colors.grey
: Colors.black,
fontSize: 30.sp),
))
];
}
}