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.
 
 
 
 
 
 

848 lines
34 KiB

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/view_widget/icon_text.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/round_button.dart';
class BrandPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _BrandPage();
}
}
class _BrandPage extends State<BrandPage> with SingleTickerProviderStateMixin {
ScrollController tabcontroller;
List<String> tabs = [
S.current.bainianchuanjiao,
S.current.haixiajiemei,
S.current.qianjinmaiwei,
];
Map<String, String> images = {
S.current.bainianchuanjiao: "assets/image/icon_chili.png",
S.current.haixiajiemei: "assets/image/icon_milk_tea.png",
S.current.qianjinmaiwei: "assets/image/icon_bread.png",
};
// GlobalKey contentGlobalKey = GlobalKey();
// GlobalKey tabGlobalKey = GlobalKey();
GlobalKey chiliGlobalKey = GlobalKey();
GlobalKey milkTeaGlobalKey = GlobalKey();
GlobalKey breadGlobalKey = GlobalKey();
// GlobalKey visibleGlobalKey = GlobalKey();
@override
void initState() {
super.initState();
if (tabcontroller == null) tabcontroller = ScrollController();
tabcontroller.addListener(() {
// RenderBox contentRenderBox = contentGlobalKey.currentContext.findRenderObject();
RenderBox chiliRenderBox =
chiliGlobalKey.currentContext.findRenderObject();
RenderBox milkTeaRenderBox =
milkTeaGlobalKey.currentContext.findRenderObject();
RenderBox breadRenderBox =
breadGlobalKey.currentContext.findRenderObject();
// Offset contentOffset = contentRenderBox.localToGlobal(Offset.zero);
Offset chiliOffset = chiliRenderBox.localToGlobal(Offset.zero);
Offset milkTeaOffset = milkTeaRenderBox.localToGlobal(Offset.zero);
Offset breadOffset = breadRenderBox.localToGlobal(Offset.zero);
print("chiliOffset: ${chiliOffset.dy}");
print("milkTeaOffset: ${milkTeaOffset.dy}");
print("breadOffset: ${breadOffset.dy}");
var top = 96.h;
if (chiliOffset.dy <= top) {
if (!isVisible) {
isVisible = true;
}
} else {
isVisible = false;
selectedIndex = "";
}
if (chiliOffset.dy <= top && milkTeaOffset.dy > top) {
selectedIndex = tabs[0];
} else if (milkTeaOffset.dy <= top && breadOffset.dy > top) {
selectedIndex = tabs[1];
} else if (breadOffset.dy <= top) {
selectedIndex = tabs[2];
}
setState(() {});
});
}
String selectedIndex = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
toolbarHeight: 40 - MediaQuery.of(context).padding.top,
backgroundColor: Colors.white,
elevation: 0,
),
body: Container(
// key: contentGlobalKey,
child: Stack(
children: [
Container(
child: SingleChildScrollView(
physics: BouncingScrollPhysics(),
controller: tabcontroller,
child: Container(
color: Color(0xFFF7F7F7),
margin: EdgeInsets.only(top: 16),
child: Column(
children: [
banner(),
buildInfo(),
buildTab(),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.black, width: 0.0)),
color: Colors.black,
),
key: chiliGlobalKey,
child: Image.asset(
"assets/image/brand_store_cj.png",
fit: BoxFit.fill,
width: double.infinity,
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.black, width: 0.0)),
color: Colors.black,
),
padding:
EdgeInsets.only(left: 79, right: 85, bottom: 19),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 7),
child: Text(
"01 百年川椒(汉街店)",
style: TextStyle(
fontSize: 12, color: Color(0xffFFFCF5)),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"地址:",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
Padding(
padding: EdgeInsets.only(bottom: 5),
child: Text(
"武昌区楚河汉街第一街区万达总部\n国际C座对面",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 1,
child: Text(
"时间:09:30-21:30",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Container(
padding: EdgeInsets.only(
left: 7, right: 10, bottom: 2, top: 2),
width: 43,
height: 14,
decoration: new BoxDecoration(
image: new DecorationImage(
image: new AssetImage(
"assets/image/icon_look.png"),
),
),
child: Text(
"去逛逛",
style: TextStyle(
fontSize: 8, color: Colors.white),
),
),
],
)
],
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.black, width: 0.0)),
color: Colors.black,
),
padding:
EdgeInsets.only(left: 79, right: 85, bottom: 34),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 8),
child: Text(
"02 百年川椒(光谷店)",
style: TextStyle(
fontSize: 12, color: Color(0xffFFFCF5)),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"地址:",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
Padding(
padding: EdgeInsets.only(bottom: 5),
child: Text(
"洪山区关山大道哈乐城2楼(保利时\n代)",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 1,
child: Text(
"时间:09:30-21:30",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Container(
padding: EdgeInsets.only(
left: 7, right: 10, bottom: 2, top: 2),
width: 43,
height: 14,
decoration: new BoxDecoration(
image: new DecorationImage(
image: new AssetImage(
"assets/image/icon_look.png"),
),
),
child: Text(
"去逛逛",
style: TextStyle(
fontSize: 8, color: Colors.white),
),
),
],
)
],
),
),
SizedBox(
height: 16,
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.white, width: 0.0)),
color: Colors.white,
),
key: milkTeaGlobalKey,
child: Image.asset(
"assets/image/brand_store_hx.png",
fit: BoxFit.fill,
width: double.infinity,
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.white, width: 0.0)),
color: Colors.white,
),
padding:
EdgeInsets.only(left: 32, right: 33, bottom: 18),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(right: 12),
child: Text(
"",
style: TextStyle(
fontSize: 10,
color: Color(0xffE2BA83)),
),
),
Padding(
padding: EdgeInsets.only(bottom: 8),
child: Text(
"武昌区松竹路汉街总部国际C座正对面(肥肥虾庄旁)",
style: TextStyle(
fontSize: 10,
color: Color(0xff604843)),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(right: 12),
child: Text(
"",
style: TextStyle(
fontSize: 10,
color: Color(0xffE2BA83)),
),
),
Expanded(
flex: 1,
child: Text(
"10:00-21:00",
style: TextStyle(
fontSize: 10,
color: Color(0xff604843)),
),
),
Text(
"去逛逛",
style: TextStyle(
fontSize: 13, color: Color(0xff604843)),
),
Image.asset("assets/image/icon_right_z.png"),
],
)
],
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.white, width: 0.0)),
color: Colors.white,
),
padding:
EdgeInsets.only(left: 32, right: 33, bottom: 18),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RoundButton(
width: 142,
height: 28,
text: "海峡姐妹荟聚A店",
textColor: Colors.white,
fontSize: 14,
padding: EdgeInsets.only(
top: 4, bottom: 4, left: 14, right: 14),
backgroup: Color(0xffE2BA83),
fontWeight: FontWeight.bold,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding:
EdgeInsets.only(right: 12, top: 12),
child: Text(
"",
style: TextStyle(
fontSize: 10,
color: Color(0xffE2BA83)),
),
),
Padding(
padding:
EdgeInsets.only(bottom: 8, top: 12),
child: Text(
"硚口区园博大道1号武汉荟聚购物中心2楼F区\n109-4号商铺",
style: TextStyle(
fontSize: 10,
color: Color(0xff604843)),
),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(right: 12),
child: Text(
"",
style: TextStyle(
fontSize: 10,
color: Color(0xffE2BA83)),
),
),
Expanded(
flex: 1,
child: Text(
"10:00-21:00",
style: TextStyle(
fontSize: 10,
color: Color(0xff604843)),
),
),
Text(
"去逛逛",
style: TextStyle(
fontSize: 13, color: Color(0xff604843)),
),
Image.asset("assets/image/icon_right_z.png"),
],
)
],
),
),
SizedBox(
height: 16,
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color(0xff052C4B), width: 0.0)),
color: Color(0xff052C4B),
),
key: breadGlobalKey,
child: Image.asset(
"assets/image/brand_store_bg.png",
fit: BoxFit.fill,
width: double.infinity,
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color(0xff052C4B), width: 0.0)),
color: Color(0xff052C4B),
),
padding:
EdgeInsets.only(left: 46, right: 44, bottom: 21),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 8),
child: Text(
"01 前进麦味(光谷店)",
style: TextStyle(
fontSize: 12, color: Color(0xffFFFCF5)),
),
),
Padding(
padding: EdgeInsets.only(bottom: 5),
child: Text(
"地址:洪山区关山大道328号附7号",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 1,
child: Text(
"时间:09:00-20:30",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Text(
"去了解",
style: TextStyle(
fontSize: 13, color: Color(0xffFFFDF6)),
),
Image.asset("assets/image/icon_right.png"),
],
)
],
),
),
Container(
decoration: new BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color(0xff052C4B), width: 0.0)),
color: Color(0xff052C4B),
),
padding:
EdgeInsets.only(left: 46, right: 44, bottom: 41),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 8),
child: Text(
"02 前进麦味(哈乐城店)",
style: TextStyle(
fontSize: 12, color: Color(0xffFFFCF5)),
),
),
Padding(
padding: EdgeInsets.only(bottom: 5),
child: Text(
"地址:武昌区凯德1818蓝调步行街(蔡明纬店旁)",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 1,
child: Text(
"时间:09:00-20:30",
style: TextStyle(
fontSize: 10, color: Colors.white),
),
),
Text(
"去了解",
style: TextStyle(
fontSize: 13, color: Color(0xffFFFDF6)),
),
Image.asset("assets/image/icon_right.png"),
],
)
],
),
),
],
),
),
),
),
Positioned(
child: Visibility(
visible: isVisible,
child: Container(
width: MediaQuery.of(context).size.width,
child: Container(
height: 52.h,
color: Colors.white,
padding: EdgeInsets.all(16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: tabs
.map((e) => item(e, selectedIndex == e))
.toList(),
),
),
),
),
top: 0,
),
],
),
),
);
}
bool isVisible = false;
Widget buildTab() {
return Container(
// key: tabGlobalKey,
height: 52.h,
padding: EdgeInsets.all(16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: tabs.map((e) => item(e, selectedIndex == e)).toList(),
),
);
}
Widget item(text, isSelected) {
return GestureDetector(
onTap: () {
FlexParentData parendData;
if (text == S.of(context).bainianchuanjiao) {
parendData =
chiliGlobalKey.currentContext.findRenderObject().parentData;
} else if (text == S.of(context).haixiajiemei) {
parendData =
milkTeaGlobalKey.currentContext.findRenderObject().parentData;
} else if (text == S.of(context).qianjinmaiwei) {
parendData =
breadGlobalKey.currentContext.findRenderObject().parentData;
}
double offset = parendData.offset.dy - 52.h + 20;
tabcontroller.animateTo(offset,
duration: Duration(seconds: 1), curve: Curves.ease);
},
child: tabItem(text, selectedIndex == text),
);
}
Widget tabItem(text, isSelected) {
if (isSelected) {
return IconText(
text,
rightImage: images[text],
iconSize: 16,
iconColor: Colors.red,
textStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: Color(0xFF353535)),
);
} else {
return IconText(
text,
textStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: Color(0xFF353535)),
);
}
}
Widget buildInfo() {
return Container(
margin: EdgeInsets.only(bottom: 20, top: 16),
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
offset: Offset(0, 2),
blurRadius: 14,
spreadRadius: 0)
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
ClipOval(
child: Image.network(
"https://t7.baidu.com/it/u=2841334870,333581502&fm=193&f=GIF",
fit: BoxFit.cover,
width: 60,
height: 60,
),
clipBehavior: Clip.hardEdge,
),
SizedBox(
width: 16,
),
Expanded(
child: Container(
height: 60,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text.rich(
TextSpan(children: [
TextSpan(
text: "李旭清",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
color: Colors.black),
),
TextSpan(
text: " 集团创办人",
style: TextStyle(fontSize: 10, color: Colors.black),
),
]),
textDirection: TextDirection.ltr,
),
Text(
"李旭清女士于1993年创建以「地球公民责任」为企业理念,打造一个与环境共存共荣的永续..",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12,
color: Color(0xFF353535),
),
),
],
),
),
flex: 1,
)
],
),
SizedBox(
height: 40,
),
Text(
"海峡姐妹餐饮集团介绍",
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.bold,
color: Colors.black),
),
SizedBox(
height: 20,
),
Text(
"湖北海峡姐妹餐饮有限公司于2019年08月01日成立。法定代表人李旭清,公司经营范围包括:餐饮服务(凭食品经营许可证在有效期内从事经营活动);餐饮管理;烘焙、冷热饮料制售;预包装食品、散装食品销售;蔬果宅配;超市市场零售;中央厨房经营与管理;物业管理;酒制品生产、销售等。",
textAlign: TextAlign.justify,
style: TextStyle(fontSize: 12.sp, color: Color(0xFF353535)),
),
SizedBox(
height: 40,
),
Text(
"理念",
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.bold,
color: Colors.black),
),
SizedBox(
height: 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [idea(), idea(), idea()],
),
],
),
);
}
banner() {
var images = [
"https://t7.baidu.com/it/u=963301259,1982396977&fm=193&f=GIF",
"https://t7.baidu.com/it/u=1819248061,230866778&fm=193&f=GIF",
"https://t7.baidu.com/it/u=1297102096,3476971300&fm=193&f=GIF",
"https://t7.baidu.com/it/u=91673060,7145840&fm=193&f=GIF",
"https://t7.baidu.com/it/u=3655946603,4193416998&fm=193&f=GIF"
];
return Container(
child: AspectRatio(
aspectRatio: 2.08,
child: Swiper(
viewportFraction: 0.88,
scale: 0.93,
pagination: SwiperPagination(
alignment: Alignment.bottomCenter,
builder: DotSwiperPaginationBuilder(
size: 8,
activeSize: 8,
space: 5,
activeColor: Colors.black,
color: Colors.black.withAlpha(76),
),
),
itemBuilder: (context, position) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8)),
),
child: ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(8),
),
child: Image(
fit: BoxFit.cover,
image: NetworkImage(images.elementAt(position)),
),
));
},
itemCount: images.length),
),
);
}
Widget idea() {
return Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Image.network(
"https://t7.baidu.com/it/u=354366862,33514804&fm=193&f=GIF",
width: 71,
height: 71,
fit: BoxFit.cover,
),
),
Positioned(
bottom: 0,
child: Container(
width: 71,
decoration: BoxDecoration(
color: Colors.black.withAlpha(125),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(4),
bottomLeft: Radius.circular(4),
),
),
padding: EdgeInsets.symmetric(vertical: 2),
alignment: Alignment.center,
child: Text(
"有机原料",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
),
),
),
)
],
);
}
}