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.
aku_new_community/lib/ui/market/market_page.dart

212 lines
7.5 KiB

3 years ago
import 'package:aku_community/base/base_style.dart';
import 'package:aku_community/constants/api.dart';
import 'package:aku_community/models/market/goods_item.dart';
import 'package:aku_community/ui/market/goods/goods_detail_page.dart';
import 'package:aku_community/utils/network/base_model.dart';
import 'package:aku_community/utils/network/net_util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:aku_community/models/market/display_category_model.dart';
import 'package:aku_community/models/market/market_category_model.dart';
import 'package:aku_community/ui/market/category/category_card.dart';
import 'package:aku_community/ui/market/category/category_page.dart';
import 'package:aku_community/ui/market/search/search_goods_page.dart';
import 'package:aku_community/utils/headers.dart';
import 'package:aku_community/widget/bee_scaffold.dart';
import 'package:aku_community/widget/tab_bar/bee_tab_bar.dart';
class MarketPage extends StatefulWidget {
MarketPage({Key? key}) : super(key: key);
@override
_MarketPageState createState() => _MarketPageState();
}
class _MarketPageState extends State<MarketPage>
with AutomaticKeepAliveClientMixin, TickerProviderStateMixin {
late TabController _tabController;
3 years ago
List<MarketCategoryModel> _marketModels = [];
List<GoodsItem> _hotItems = [];
3 years ago
Future updateMarketInfo() async {
_marketModels = await DisplayCategoryModel.top8;
BaseModel baseModel = await NetUtil().get(API.market.hotTop);
if (baseModel.status == true && baseModel.data != null) {
_hotItems =
(baseModel.data as List).map((e) => GoodsItem.fromJson(e)).toList();
}
3 years ago
}
@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
updateMarketInfo().then((_) {
3 years ago
setState(() {});
});
}
@override
Widget build(BuildContext context) {
super.build(context);
final mediaWidth = MediaQuery.of(context).size.width;
return BeeScaffold(
leading: IconButton(
icon: Icon(CupertinoIcons.search),
onPressed: () {
Get.to(() => SearchGoodsPage());
},
),
title: '商城',
actions: [
MaterialButton(
minWidth: 108.w,
padding: EdgeInsets.zero,
3 years ago
onPressed: () async {
final cancel = BotToast.showLoading();
List<MarketCategoryModel> models =
await DisplayCategoryModel.fetchCategory(0);
cancel();
Get.to(() => CategoryPage(models: models));
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.grid_view,
color: Color(0xFF333333),
size: 48.w,
),
4.hb,
'分类'.text.size(20.sp).black.make(),
],
),
),
],
body: NestedScrollView(
headerSliverBuilder: (context, value) {
3 years ago
var gridItems = Material(
color: Colors.white,
clipBehavior: Clip.antiAlias,
borderRadius: BorderRadius.circular(8.w),
child: GridView(
physics: NeverScrollableScrollPhysics(),
3 years ago
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
childAspectRatio: 1,
),
shrinkWrap: true,
children:
_marketModels.map((e) => CategoryCard(model: e)).toList(),
),
);
return [
SliverAppBar(
//AppBar top Widget height
//bottom height: 48
3 years ago
// flexibleSpace的高为 (设备宽 - 边距)/4*2 + 外边距 + bottom高 + top热搜栏
expandedHeight:
(mediaWidth - 32.w * 2) / 4 * 2 + 16.w * 2 + 48 + 68.w,
backgroundColor: Colors.transparent,
elevation: 0,
flexibleSpace: FlexibleSpaceBar(
background: Container(
color: Color(0xFFF9F9F9),
padding: EdgeInsets.only(
top: 16.w,
left: 32.w,
right: 32.w,
bottom: 16.w + 48, //底部边距需要加上bottom高
),
3 years ago
child: Column(
children: [
SizedBox(
height: 58.w,
child: Row(
children: [
Text(
'热搜:',
style: TextStyle(
fontSize: 20.sp,
),
),
20.wb,
3 years ago
ListView.separated(
scrollDirection: Axis.horizontal,
separatorBuilder: (_, __) => 20.wb,
itemBuilder: (context, index) {
final item = _hotItems[index];
3 years ago
return MaterialButton(
padding:
EdgeInsets.symmetric(horizontal: 40.w),
minWidth: 0,
shape: StadiumBorder(
side: BorderSide(
color: ktextSubColor,
width: 1,
3 years ago
),
),
materialTapTargetSize:
MaterialTapTargetSize.shrinkWrap,
onPressed: () {
Get.to(() => GoodsDetailPage(id: item.id));
},
child: Text(
item.title,
style: TextStyle(
color: ktextSubColor,
),
),
3 years ago
);
},
itemCount: _hotItems.length,
3 years ago
).expand(),
],
),
),
3 years ago
10.hb,
gridItems.expand(),
],
),
),
),
pinned: true,
toolbarHeight: 0,
bottom: PreferredSize(
child: Material(
color: Color(0xFFF9F9F9),
child: Align(
alignment: Alignment.centerLeft,
child: BeeTabBar(
scrollable: true,
controller: _tabController,
tabs: ['社区商城', '二手市场'],
),
),
),
preferredSize: Size.fromHeight(48),
),
),
];
},
body: TabBarView(
children: [
SizedBox(),
SizedBox(),
],
controller: _tabController,
),
),
);
}
@override
bool get wantKeepAlive => true;
}