首页bar的颜色随轮播图变换

master
张萌 3 years ago
parent 487617616a
commit 77b353735c

@ -1,13 +1,11 @@
// Dart imports: // Dart imports:
import 'package:aku_new_community/const/resource.dart';
import 'package:aku_new_community/constants/api.dart'; import 'package:aku_new_community/constants/api.dart';
import 'package:aku_new_community/constants/application_objects.dart'; import 'package:aku_new_community/constants/application_objects.dart';
import 'package:aku_new_community/model/common/img_model.dart'; import 'package:aku_new_community/model/common/img_model.dart';
import 'package:aku_new_community/model/community/activity_item_model.dart'; import 'package:aku_new_community/model/community/activity_item_model.dart';
import 'package:aku_new_community/model/community/board_model.dart'; import 'package:aku_new_community/model/community/board_model.dart';
import 'package:aku_new_community/model/community/swiper_model.dart'; import 'package:aku_new_community/model/community/swiper_model.dart';
import 'package:aku_new_community/pages/home/widget/animate_app_bar.dart';
import 'package:aku_new_community/pages/message_center_page/message_center_page.dart'; import 'package:aku_new_community/pages/message_center_page/message_center_page.dart';
import 'package:aku_new_community/pages/one_alarm/widget/alarm_page.dart'; import 'package:aku_new_community/pages/one_alarm/widget/alarm_page.dart';
import 'package:aku_new_community/pages/visitor_access_page/visitor_access_page.dart'; import 'package:aku_new_community/pages/visitor_access_page/visitor_access_page.dart';
@ -27,18 +25,16 @@ import 'package:aku_new_community/widget/others/rectIndicator.dart';
import 'package:aku_new_community/widget/others/user_tool.dart'; import 'package:aku_new_community/widget/others/user_tool.dart';
import 'package:badges/badges.dart'; import 'package:badges/badges.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/cupertino.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart'; import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jpush_flutter/jpush_flutter.dart'; import 'package:jpush_flutter/jpush_flutter.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:power_logger/power_logger.dart'; import 'package:power_logger/power_logger.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:velocity_x/velocity_x.dart';
import 'widget/home_search.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
HomePage({Key? key}) : super(key: key); HomePage({Key? key}) : super(key: key);
@ -66,6 +62,9 @@ class _HomePageState extends State<HomePage>
List<ActivityItemModel> _activityItemModels = []; List<ActivityItemModel> _activityItemModels = [];
List<BoardItemModel> _boardItemModels = []; List<BoardItemModel> _boardItemModels = [];
List<SwiperModel> _swiperModels = []; List<SwiperModel> _swiperModels = [];
SwiperController _swiperController = SwiperController();
ValueNotifier<Color> _barColor = ValueNotifier(Colors.transparent);
@override @override
void initState() { void initState() {
@ -81,12 +80,15 @@ class _HomePageState extends State<HomePage>
} }
_scrollController = ScrollController(); _scrollController = ScrollController();
_refreshController = EasyRefreshController(); _refreshController = EasyRefreshController();
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.transparent));
} }
@override @override
void dispose() { void dispose() {
_refreshController.dispose(); _refreshController.dispose();
_scrollController?.dispose(); _scrollController?.dispose();
_swiperController.dispose();
super.dispose(); super.dispose();
} }
@ -97,11 +99,51 @@ class _HomePageState extends State<HomePage>
commentCount = appProvider.messageCenterModel.commentCount ?? 0; commentCount = appProvider.messageCenterModel.commentCount ?? 0;
sysCount = appProvider.messageCenterModel.sysCount ?? 0; sysCount = appProvider.messageCenterModel.sysCount ?? 0;
sum = commentCount + sysCount; sum = commentCount + sysCount;
return Scaffold( var head = ValueListenableBuilder(
extendBodyBehindAppBar: true, valueListenable: _barColor,
appBar: AnimateAppBar( builder: (context, Color color, child) {
scrollController: _scrollController, return Container(
actions: [ padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
decoration: BoxDecoration(
border: Border.all(width: 0, color: color),
color: color,
),
width: double.infinity,
child: child,
);
},
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.w, horizontal: 16.w),
child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
if (appProvider.location != null)
Padding(
padding: const EdgeInsets.only(right: 5),
child: Image.asset(
R.ASSETS_ICONS_ICON_MAIN_LOCATION_PNG,
width: 32.w,
height: 32.w,
),
),
Text(
appProvider.location?['city'] == null
? ''
: appProvider.location?['city'] as String? ?? '',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 24.sp,
color: Color(0xff333333),
),
textAlign: TextAlign.center,
),
Text(
'(${appProvider.weatherType} ${appProvider.weatherTemp}℃)',
style: TextStyle(
fontSize: 24.sp,
color: Color(0xff999999),
),
textAlign: TextAlign.center,
),
Spacer(),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
Get.to(() => BeeSearch()); Get.to(() => BeeSearch());
@ -134,311 +176,303 @@ class _HomePageState extends State<HomePage>
height: 40.w, width: 40.w), height: 40.w, width: 40.w),
)), )),
), ),
], ]),
), ),
// floatingActionButton: FloatingActionButton( );
// return AnnotatedRegion<SystemUiOverlayStyle>(
// child: Container( value: SystemUiOverlayStyle.dark,
// decoration: BoxDecoration( child: Scaffold(
// image: DecorationImage( extendBody: true,
// fit: BoxFit.fill, extendBodyBehindAppBar: true,
// image: body: Stack(
// AssetImage(R.ASSETS_ICONS_ICON_MAIN_OPEN_PNG),) children: [
// ), Column(
// ), children: [
// onPressed: (){ head,
// print('FloatingActionButton'); Flexible(
// }, child: EasyRefresh(
// ), controller: _refreshController,
body: Stack( header: BeeBallPauseHeader(bgColor: _barColor),
children: [ firstRefresh: true,
EasyRefresh( onRefresh: () async {
controller: _refreshController, //_activityItemModel = await CommunityFunc.activity();
header: MaterialHeader(), _activityItemModels = await CommunityFunc.activityList();
firstRefresh: true, _boardItemModels = await CommunityFunc.board();
onRefresh: () async { _swiperModels = await CommunityFunc.swiper();
//_activityItemModel = await CommunityFunc.activity(); appProvider.getMessageCenter();
_activityItemModels = await CommunityFunc.activityList(); setState(() {});
_boardItemModels = await CommunityFunc.board(); },
_swiperModels = await CommunityFunc.swiper(); child: CustomScrollView(
appProvider.getMessageCenter(); controller: _scrollController,
setState(() {}); slivers: [
}, SliverToBoxAdapter(
child: CustomScrollView(
controller: _scrollController,
slivers: [
SliverToBoxAdapter(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
HomeSearch(),
HomeSwiper(), //
// SizedBox(height: 100.w),
Container(
padding: EdgeInsets.only(top: 24.w, bottom: 32.w),
child: getFunction(), //ApplicationView(),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: const <BoxShadow>[
BoxShadow(
color: Color(0x14000000),
blurRadius: 0,
offset: Offset(0.0, 2.0),
spreadRadius: 0.1)
],
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(28),
bottomRight: Radius.circular(28))),
)
//ApplicationBox(child: ApplicationView()),
],
),
),
SliverToBoxAdapter(
child: Container(
height: 40,
margin:
EdgeInsets.only(left: 32.w, right: 32.w, top: 24.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8)),
boxShadow: const <BoxShadow>[
BoxShadow(
color: Color(0x14000000),
blurRadius: 4,
spreadRadius: 0.5)
],
),
child: HomeNotification(items: _boardItemModels)),
),
SliverToBoxAdapter(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 24.w),
padding: EdgeInsets.only(left: 32.w, top: 24.w),
width: 140,
height: 150,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(R.ASSETS_IMAGES_CARD_YELLOW_PNG),
)),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( HomeSwiper(), //
'访客邀请', // SizedBox(height: 100.w),
style: TextStyle( Container(
color: Color(0xD9000000), padding:
fontSize: 26.sp, EdgeInsets.only(top: 24.w, bottom: 32.w),
fontWeight: FontWeight.bold), child: getFunction(), //ApplicationView(),
), decoration: BoxDecoration(
10.hb, color: Colors.white,
Text( boxShadow: const <BoxShadow>[
'一键分享', BoxShadow(
style: TextStyle( color: Color(0x14000000),
color: Color(0x73000000), blurRadius: 0,
fontSize: 20.sp, offset: Offset(0.0, 2.0),
), spreadRadius: 0.1)
), ],
Text( borderRadius: BorderRadius.only(
'让拜访不再是难事', bottomLeft: Radius.circular(28),
style: TextStyle( bottomRight: Radius.circular(28))),
color: Color(0x73000000), )
fontSize: 20.sp, //ApplicationBox(child: ApplicationView()),
),
),
Spacer(),
Image.asset(
R.ASSETS_ICONS_ICON_MAIN_INVITE_PNG,
width: 100.w,
height: 100.w,
),
30.hb,
], ],
), ),
), ),
onTap: () { SliverToBoxAdapter(
Get.to(VisitorAccessPage()); child: Container(
}, height: 40,
), margin: EdgeInsets.only(
25.wb, left: 32.w, right: 32.w, top: 24.w),
Container( decoration: BoxDecoration(
margin: EdgeInsets.only(top: 24.w), color: Colors.white,
child: Column( borderRadius:
children: [ BorderRadius.all(Radius.circular(8)),
GestureDetector( boxShadow: const <BoxShadow>[
child: Container( BoxShadow(
width: 190, color: Color(0x14000000),
height: 69, blurRadius: 4,
decoration: BoxDecoration( spreadRadius: 0.5)
image: DecorationImage( ],
fit: BoxFit.fill, ),
image: child: HomeNotification(items: _boardItemModels)),
AssetImage(R.ASSETS_IMAGES_CARD_PINK_PNG), ),
)), SliverToBoxAdapter(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
20.wb, GestureDetector(
Column( child: Container(
crossAxisAlignment: margin: EdgeInsets.only(top: 24.w),
CrossAxisAlignment.start, padding:
children: [ EdgeInsets.only(left: 32.w, top: 24.w),
20.hb, width: 140,
Text( height: 150,
'一键报警', decoration: BoxDecoration(
style: TextStyle( image: DecorationImage(
color: Color(0xD9000000), fit: BoxFit.fill,
fontSize: 26.sp, image: AssetImage(
fontWeight: FontWeight.bold), R.ASSETS_IMAGES_CARD_YELLOW_PNG),
)),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'访客邀请',
style: TextStyle(
color: Color(0xD9000000),
fontSize: 26.sp,
fontWeight: FontWeight.bold),
),
10.hb,
Text(
'一键分享',
style: TextStyle(
color: Color(0x73000000),
fontSize: 20.sp,
), ),
10.hb, ),
Text( Text(
'提交报警位置给物业', '让拜访不再是难事',
style: TextStyle( style: TextStyle(
color: Color(0x73000000), color: Color(0x73000000),
fontSize: 20.sp, fontSize: 20.sp,
),
), ),
], ),
), Spacer(),
Spacer(), Image.asset(
Image.asset( R.ASSETS_ICONS_ICON_MAIN_INVITE_PNG,
R.ASSETS_ICONS_ICON_MAIN_POLICE_PNG, width: 100.w,
width: 98.w, height: 100.w,
height: 98.w, ),
), 30.hb,
20.wb, ],
], ),
), ),
onTap: () {
Get.to(VisitorAccessPage());
},
), ),
onTap: () { 25.wb,
Get.to(AlarmPage()); Container(
}, margin: EdgeInsets.only(top: 24.w),
), child: Column(
GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 20.w),
width: 190,
height: 69,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image:
AssetImage(R.ASSETS_IMAGES_CARD_BLUE_PNG),
)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
20.wb, GestureDetector(
Column( child: Container(
crossAxisAlignment: width: 190,
CrossAxisAlignment.start, height: 69,
children: [ decoration: BoxDecoration(
20.hb, image: DecorationImage(
Text( fit: BoxFit.fill,
'建议咨询', image: AssetImage(
style: TextStyle( R.ASSETS_IMAGES_CARD_PINK_PNG),
color: Color(0xD9000000), )),
fontSize: 26.sp, child: Row(
fontWeight: FontWeight.bold), mainAxisAlignment:
MainAxisAlignment.start,
children: [
20.wb,
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
20.hb,
Text(
'一键报警',
style: TextStyle(
color: Color(0xD9000000),
fontSize: 26.sp,
fontWeight:
FontWeight.bold),
),
10.hb,
Text(
'提交报警位置给物业',
style: TextStyle(
color: Color(0x73000000),
fontSize: 20.sp,
),
),
],
),
Spacer(),
Image.asset(
R.ASSETS_ICONS_ICON_MAIN_POLICE_PNG,
width: 98.w,
height: 98.w,
),
20.wb,
],
), ),
10.hb, ),
Text( onTap: () {
'欢迎给我们提供服务意见', Get.to(AlarmPage());
style: TextStyle( },
color: Color(0x73000000),
fontSize: 20.sp,
),
),
],
),
Spacer(),
Image.asset(
R.ASSETS_ICONS_ICON_MAIN_CONSULT_PNG,
width: 98.w,
height: 98.w,
), ),
20.wb, GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 20.w),
width: 190,
height: 69,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(
R.ASSETS_IMAGES_CARD_BLUE_PNG),
)),
child: Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
20.wb,
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
20.hb,
Text(
'建议咨询',
style: TextStyle(
color: Color(0xD9000000),
fontSize: 26.sp,
fontWeight:
FontWeight.bold),
),
10.hb,
Text(
'欢迎给我们提供服务意见',
style: TextStyle(
color: Color(0x73000000),
fontSize: 20.sp,
),
),
],
),
Spacer(),
Image.asset(
R.ASSETS_ICONS_ICON_MAIN_CONSULT_PNG,
width: 98.w,
height: 98.w,
),
20.wb,
],
),
),
onTap: () {
Get.to(AdvicePage(
type: AdviceType.SUGGESTION));
},
)
], ],
), ),
), )
onTap: () { ],
Get.to(AdvicePage(type: AdviceType.SUGGESTION)); ),
},
)
],
), ),
) SliverToBoxAdapter(
], child: Column(
children: [
HomeTitle(
title: '社区活动',
suffixTitle: '查看全部',
onTap: () => Get.to(() => ActivityListPage()),
),
_activityItemModels == []
? SizedBox()
: Container(
height: 400.w,
padding: EdgeInsets.only(left: 32.w),
child: ListView.separated(
padding: EdgeInsets.zero,
separatorBuilder: (context, index) {
return SizedBox(
width: 16.w,
);
},
scrollDirection: Axis.horizontal,
itemBuilder: (context, index) {
return Container(
width: 500.w,
child: Builder(
builder: (context) {
return ActivityCard(
model: _activityItemModels[
index]);
},
),
);
},
itemCount: _activityItemModels.length,
),
),
// : ActivityCard(model: _activityItemModel)
// .pSymmetric(h: 24.w, v: 24.w),
],
)),
],
),
), ),
), ),
SliverToBoxAdapter(
child: Column(
children: [
// HomeTitle(
// title: '公共资讯',
// suffixTitle: '更多资讯',
// onTap: () async {
// final cancel = BotToast.showLoading();
// BaseModel model = await NetUtil().get(API.news.category);
// List<NewsCategoryModel>? category;
// if (model.status == true && model.data != null) {
// category = (model.data as List)
// .map((e) => NewsCategoryModel.fromJson(e))
// .toList();
// }
// cancel();
// Get.to(
// () => PublicInfomationPage(models: category ?? []));
// },
// ),
HomeTitle(
title: '社区活动',
suffixTitle: '查看全部',
onTap: () => Get.to(() => ActivityListPage()),
),
_activityItemModels == []
? SizedBox()
: Container(
height: 400.w,
padding: EdgeInsets.only(left: 32.w),
child: ListView.separated(
padding: EdgeInsets.zero,
separatorBuilder: (context, index) {
return SizedBox(
width: 16.w,
);
},
scrollDirection: Axis.horizontal,
itemBuilder: (context, index) {
return Container(
width: 500.w,
child: Builder(
builder: (context) {
return ActivityCard(
model: _activityItemModels[index]);
},
),
);
},
itemCount: _activityItemModels.length,
),
),
// : ActivityCard(model: _activityItemModel)
// .pSymmetric(h: 24.w, v: 24.w),
],
)),
], ],
), ),
), OverlayLivingBtnWidget()
OverlayLivingBtnWidget() ],
], ),
), ),
); );
} }
@ -447,10 +481,25 @@ class _HomePageState extends State<HomePage>
return Container( return Container(
width: double.infinity, width: double.infinity,
height: 320.w, height: 320.w,
decoration:
BoxDecoration(border: Border.all(width: 0, color: _barColor.value)),
child: AspectRatio( child: AspectRatio(
aspectRatio: 375 / 160, aspectRatio: 375 / 160,
child: Swiper( child: Swiper(
key: UniqueKey(), key: UniqueKey(),
onIndexChanged: (index) async {
if (_swiperModels.isNotEmpty) {
var color = await PaletteGenerator.fromImageProvider(
CachedNetworkImageProvider(
API.image(
ImgModel.first(_swiperModels[index].voResourcesImgList)),
));
_barColor.value =
color.dominantColor?.color ?? Colors.transparent;
} else {
_barColor.value = Colors.transparent;
}
},
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return getSwiperImage(_swiperModels[index]); return getSwiperImage(_swiperModels[index]);
}, },
@ -562,3 +611,62 @@ class _HomePageState extends State<HomePage>
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
} }
class BeeBallPauseHeader extends Header {
/// Key
final Key? key;
final ValueNotifier<Color> bgColor;
final LinkHeaderNotifier linkNotifier = LinkHeaderNotifier();
BeeBallPauseHeader({
this.key,
required this.bgColor,
bool enableHapticFeedback = true,
bool enableInfiniteRefresh = false,
}) : super(
extent: 70.0,
triggerDistance: 70.0,
float: false,
enableHapticFeedback: enableHapticFeedback,
enableInfiniteRefresh: enableInfiniteRefresh,
);
@override
Widget contentBuilder(
BuildContext context,
RefreshMode refreshState,
double pulledExtent,
double refreshTriggerPullDistance,
double refreshIndicatorExtent,
AxisDirection axisDirection,
bool float,
Duration? completeDuration,
bool enableInfiniteRefresh,
bool success,
bool noMore) {
linkNotifier.contentBuilder(
context,
refreshState,
pulledExtent,
refreshTriggerPullDistance,
refreshIndicatorExtent,
axisDirection,
float,
completeDuration,
enableInfiniteRefresh,
success,
noMore);
return ValueListenableBuilder(
valueListenable: bgColor,
builder: (context, Color color, child) {
return BallPulseHeaderWidget(
key: key,
color: color.withBlue(128),
backgroundColor: color,
linkNotifier: linkNotifier,
);
});
}
}

@ -1,14 +1,17 @@
import 'package:aku_new_community/provider/app_provider.dart'; import 'package:aku_new_community/provider/app_provider.dart';
import 'package:aku_new_community/utils/headers.dart'; import 'package:aku_new_community/utils/headers.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class AnimateAppBar extends StatefulWidget with PreferredSizeWidget { class AnimateAppBar extends StatefulWidget with PreferredSizeWidget {
final ScrollController? scrollController; final ScrollController? scrollController;
final List<Widget>? actions; final List<Widget>? actions;
final ValueNotifier<Color> bgColor;
AnimateAppBar({Key? key, this.scrollController, this.actions}) AnimateAppBar(
{Key? key, this.scrollController, this.actions, required this.bgColor})
: super(key: key); : super(key: key);
@override @override
@ -19,63 +22,57 @@ class AnimateAppBar extends StatefulWidget with PreferredSizeWidget {
} }
class _AnimateAppBarState extends State<AnimateAppBar> { class _AnimateAppBarState extends State<AnimateAppBar> {
Color _bgColor = Colors.white;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
widget.scrollController!.addListener(() {
setState(() {
_bgColor = widget.scrollController!.offset > 30
? Colors.white
: widget.scrollController!.offset < 0
? Colors.transparent
: Colors.white
.withOpacity((widget.scrollController!.offset / 30));
});
});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final appProvider = Provider.of<AppProvider>(context); final appProvider = Provider.of<AppProvider>(context);
return Padding( return ValueListenableBuilder(
padding: const EdgeInsets.only(top: 5), valueListenable: widget.bgColor,
child: AppBar( builder: (context, color, child) {
titleSpacing: 10.0, return AppBar(
title: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ systemOverlayStyle: SystemUiOverlayStyle(
if (appProvider.location != null) statusBarColor: widget.bgColor.value,
Padding( statusBarIconBrightness: Brightness.light),
padding: const EdgeInsets.only(right: 5), titleSpacing: 10.0,
child: Image.asset( title: child,
R.ASSETS_ICONS_ICON_MAIN_LOCATION_PNG, backgroundColor: widget.bgColor.value,
width: 32.w, actions: widget.actions,
height: 32.w, );
), },
), child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
Text( if (appProvider.location != null)
appProvider.location?['city'] == null Padding(
? '' padding: const EdgeInsets.only(right: 5),
: appProvider.location?['city'] as String? ?? '', child: Image.asset(
style: TextStyle( R.ASSETS_ICONS_ICON_MAIN_LOCATION_PNG,
fontWeight: FontWeight.w600, width: 32.w,
fontSize: 24.sp, height: 32.w,
color: Color(0xff333333),
), ),
textAlign: TextAlign.center,
), ),
Text( Text(
'(${appProvider.weatherType} ${appProvider.weatherTemp}℃)', appProvider.location?['city'] == null
style: TextStyle( ? ''
fontSize: 24.sp, : appProvider.location?['city'] as String? ?? '',
color: Color(0xff999999), style: TextStyle(
), fontWeight: FontWeight.w600,
textAlign: TextAlign.center, fontSize: 24.sp,
color: Color(0xff333333),
),
textAlign: TextAlign.center,
),
Text(
'(${appProvider.weatherType} ${appProvider.weatherTemp}℃)',
style: TextStyle(
fontSize: 24.sp,
color: Color(0xff999999),
), ),
]), textAlign: TextAlign.center,
backgroundColor: _bgColor, ),
actions: widget.actions, ]),
),
); );
} }
} }

@ -1,592 +0,0 @@
/*
* ====================================================
* package : widgets
* author : Created by nansi.
* time : 2019/5/13 1:44 PM
* remark :
* ====================================================
*/
import 'package:aku_new_community/utils/text_utils.dart';
import 'package:flutter/material.dart';
///
typedef SelectedListener = Function(int selectedIndex, FilterItemModel item);
///
typedef PopOptionHandle = Function(OptionListStatus status);
/// filterBar
typedef FilterToolBarListener = Function(bool update);
class FilterToolBarController {
late FilterResultContainerHelper helper;
late int selectedIndex;
late FilterItemModel item;
late GlobalKey _containerKey;
late GlobalKey _toolBarKey;
/// [update] sublist index
FilterToolBarListener updateToolBarState = (bool update) {};
close() {
helper.changeOptionListStatus(OptionListStatus.close);
}
get toolBarDx {
RenderBox box = _toolBarKey.currentContext?.findRenderObject()
as RenderBox; //_toolBarKey.currentContext.findRenderObject();
Offset offset = box.localToGlobal(Offset.zero);
return offset.dx;
}
double get toolBarDy {
/// toolbar top - containertop
RenderBox containerBox =
_containerKey.currentContext?.findRenderObject() as RenderBox;
RenderBox box = _toolBarKey.currentContext?.findRenderObject() as RenderBox;
Offset containerTopOffset = containerBox.localToGlobal(Offset.zero);
Offset toolBarTopOffset = box.localToGlobal(Offset.zero);
return toolBarTopOffset.dy - containerTopOffset.dy;
}
////position
// RenderBox box = _key.currentContext.findRenderObject();
// Offset offset = box.localToGlobal(Offset.zero);
//
////size
// Size size = box.size;
// print(" ---- $offset ------- $size");
}
enum OptionListStatus { open, close }
///
class FilterResultContainerHelper {
final PopOptionHandle handle;
///
late OptionListStatus status;
FilterResultContainerHelper({required this.handle});
changeOptionListStatus(OptionListStatus status) {
this.status = status;
this.handle(status);
}
}
/// FilterToolBar 使
class FilterToolBarResultContainer extends StatefulWidget {
final FilterToolBarController? controller;
final Widget? body;
const FilterToolBarResultContainer(
{GlobalKey? key, this.controller, this.body})
: assert(controller != null, "controller 不为空");
@override
State<StatefulWidget> createState() {
return _FilterToolBarResultContainerState();
}
}
class _FilterToolBarResultContainerState
extends State<FilterToolBarResultContainer> with TickerProviderStateMixin {
///
late int _lines;
int maxLines = 3;
///
double _lineHeight = 35.0;
///
double _bottomSpacing = 8.0;
///
double _topSpacing = 8.0;
///
Color _unselectedColor = Colors.grey[700]!;
/// toolbar
// double _toolBarTitleFont = 14.0;
///
double _subTitleFont = 13.0;
/// row
EdgeInsetsGeometry _subtitleRowPadding = EdgeInsets.only(left: 15, right: 15);
late AnimationController _animationController;
late Animation<double> _animation;
@override
void initState() {
_animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 150));
_lines = maxLines;
widget.controller?.helper = FilterResultContainerHelper(handle: (status) {
if (status == OptionListStatus.open) {
_buildAnimation(widget.controller!.item);
_animationController.forward();
} else {
_animationController.reset();
}
});
if (widget.key == null) {
widget.controller!._containerKey = GlobalKey();
} else {
widget.controller!._containerKey = widget.key as GlobalKey;
}
super.initState();
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
key: widget.controller!._containerKey,
child: _buildBody(context),
);
}
Stack _buildBody(BuildContext context) {
return Stack(
children: <Widget>[
/// body
Container(
height: double.infinity,
child: widget.body,
),
///
_maskView(),
widget.controller?._toolBarKey == null
? Container()
: Positioned(
top: widget.controller!.toolBarDy + 40,
left: 0,
right: 0,
bottom: 0,
child: Stack(children: [
widget.controller!.item.type == FilterItemType.list
? _buildList(context)
: Container(),
]))
],
);
}
Widget _maskView() {
double? num = widget.controller?.toolBarDy;
return widget.controller?._toolBarKey == null
? Container()
: Positioned(
top: (num as double) + 40,
left: 0,
right: 0,
bottom: 0,
child: Offstage(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
widget.controller!.helper.changeOptionListStatus(
OptionListStatus.close,
);
widget.controller!.updateToolBarState(false);
_animationController.reset();
},
child: Opacity(
opacity: 0.3,
child: Container(
color: Colors.black,
),
),
),
offstage: _animation == null ||
(_animation.status == AnimationStatus.dismissed),
),
);
}
/// [widget.maxLines]
/// ,
_buildAnimation(FilterItemModel item) {
_lines =
item.subtitles!.length > maxLines ? maxLines : item.subtitles!.length;
_animation = new Tween(
begin: 0.0 - _lines * _lineHeight - _bottomSpacing - _topSpacing,
end: 0.0)
.animate(_animationController)
..addListener(() {
setState(() {
// the state that has changed here is the animation objects value
});
});
}
///
Positioned _buildList(context) {
FilterItemModel item = widget.controller!.item;
return Positioned(
top: _animation.value,
left: 0,
right: 0,
child: LimitedBox(
maxHeight: _lineHeight * _lines + _topSpacing + _bottomSpacing,
child: Container(
padding: EdgeInsets.only(bottom: _bottomSpacing, top: 5),
height: _lineHeight * item.subtitles!.length +
_bottomSpacing +
_topSpacing,
decoration: BoxDecoration(
color: Color.fromARGB(240, 255, 255, 255),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10))),
child: MediaQuery.removePadding(
context: context,
removeTop: true,
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
controller: PrimaryScrollController.of(context),
itemCount: item.subtitles!.length,
itemBuilder: (context, index) {
bool subTitleSelected = item.selectedSubIndex == index;
return Container(
height: _lineHeight,
child: RawMaterialButton(
onPressed: () {
widget.controller!.helper
.changeOptionListStatus(OptionListStatus.close);
widget.controller!.updateToolBarState(false);
if (item.selectedSubIndex == index) return;
item.selectedSubIndex = index;
String title = item.subtitleShort == null ||
TextUtils.isEmpty(item.subtitleShort![index])
? item.subtitles![index]
: item.subtitleShort![index];
item.title = title;
widget.controller!.updateToolBarState(true);
},
child: _sublistItem(index, item, subTitleSelected),
),
);
}),
),
),
),
);
}
/// item
Container _sublistItem(
int index, FilterItemModel item, bool subTitleSelected) {
return Container(
padding: _subtitleRowPadding,
child: Row(
children: <Widget>[
Offstage(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8),
child: Icon(
Icons.check,
size: 17,
color: Colors.red,
),
),
offstage: index != item.selectedSubIndex,
),
Expanded(
child: Text(
item.subtitles![index],
style: TextStyle(
fontSize: _subTitleFont,
color: _unselectedColor,
fontWeight:
(subTitleSelected ? FontWeight.w600 : FontWeight.w400)),
)),
],
),
);
}
}
class FilterToolBar extends StatefulWidget {
FilterToolBar({
required this.titles,
required this.listener,
required this.controller,
this.selectedColor,
this.maxLines = 4,
this.trialing,
this.startWidget,
this.fontSize = 15.0,
this.height = 40,
}) : assert(listener != null, "请设置监听事件"),
assert(controller != null, "请设置controller");
final List<FilterItemModel> titles;
final Color? selectedColor;
final int maxLines;
final SelectedListener listener;
final Widget? trialing;
final Widget? startWidget;
final FilterToolBarController? controller;
final double fontSize;
final double height;
@override
State<StatefulWidget> createState() {
return _FilterToolBarState();
}
}
class _FilterToolBarState extends State<FilterToolBar>
with TickerProviderStateMixin {
Color _unselectedColor = Colors.grey[700]!;
GlobalKey _key = GlobalKey();
@override
void initState() {
super.initState();
widget.controller?.selectedIndex = widget.controller?.selectedIndex ?? 0;
widget.controller?._toolBarKey = _key;
widget.controller?.updateToolBarState = (bool update) {
// print("----- ${widget.controller.selectedIndex}");
if (update) {
widget.listener(
widget.controller!.selectedIndex, widget.controller!.item);
}
setState(() {});
};
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: widget.height,
child: _buildToolBar(),
);
}
Container _buildToolBar() {
List<Widget> items = <Widget>[];
if (widget.startWidget != null) {
items.add(SizedBox(
width: 60,
));
items.add(widget.startWidget!);
items.add(SizedBox(
width: 20,
));
}
items.addAll(_buildToolBarItem());
if (widget.trialing != null) {
items.add(widget.trialing!);
}
return Container(
key: _key,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
border: Border(
top: BorderSide(color: Colors.grey[200]!, width: 0.5),
bottom: BorderSide(color: Colors.grey[200]!, width: 0.5))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: items,
),
);
}
List<Expanded> _buildToolBarItem() {
return widget.titles.map((item) {
int index = widget.titles.indexOf(item);
bool selected = index == widget.controller?.selectedIndex;
Color color = (selected ? widget.selectedColor : _unselectedColor)!;
return Expanded(
child: GestureDetector(
onTap: () {
widget.controller?.item = item;
/// toolbar
if (widget.controller?.helper != null &&
widget.controller?.helper.status == OptionListStatus.open) {
widget.controller?.helper.changeOptionListStatus(
OptionListStatus.close,
);
} else {
if (item.type == FilterItemType.list) {
///
if (widget.controller?.selectedIndex == index) {
if (widget.controller?.helper != null) {
widget.controller?.helper.changeOptionListStatus(
OptionListStatus.open,
);
} else {
FlutterError("列表类型需要与 FilterToolBarResultContainer 一起使用");
}
} else {
///
widget.listener(index, item);
}
}
}
///
if (item.type == FilterItemType.double) {
if (widget.controller?.selectedIndex != index) {
item.selectedList![index] = true;
item.topSelected = item.selectedList![index];
} else {
//print(item.topSelected);
//item.topSelected = !item.topSelected;
// print(widget.titles[index].topSelected);
item.selectedList![index] = !item.selectedList![index];
item.topSelected = item.selectedList![index];
}
widget.listener(index, item);
}
///
else if (item.type == FilterItemType.normal) {
if (widget.controller?.selectedIndex == index) return;
widget.listener(index, item);
}
widget.controller?.selectedIndex = index;
setState(() {});
},
child: Container(
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(item.title,
style: TextStyle(
fontSize: widget.fontSize,
color: color,
fontWeight: FontWeight.w400)
// AppTextStyle.generate(widget.fontSize,
// color: color, fontWeight: FontWeight.w400),
),
_buildArrow(item, color, selected, index)
],
),
),
),
);
}).toList();
}
_buildArrow(FilterItemModel item, color, bool selected, int index) {
if (item.type == FilterItemType.list) {
return Icon(
selected
? (widget.controller?.helper != null &&
widget.controller?.helper.status == OptionListStatus.open
? Icons.arrow_drop_up
: Icons.arrow_drop_down)
: Icons.arrow_drop_down,
color: color,
size: 19,
);
} else if (item.type == FilterItemType.double) {
if (selected) {
return Padding(
padding: const EdgeInsets.only(left: 2.0),
child: Icon(
item.selectedList![index]
? IconData(0xe620, fontFamily: "AppIcons")
: IconData(0xe621, fontFamily: "AppIcons"),
size: 7,
color: color,
),
);
} else {
return Padding(
padding: const EdgeInsets.only(left: 2.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
IconData(0xe620, fontFamily: "AppIcons"),
size: 7,
color: _unselectedColor,
),
Icon(
IconData(0xe621, fontFamily: "AppIcons"),
size: 7,
color: _unselectedColor,
),
],
),
);
}
} else {
return Container();
}
}
}
enum FilterItemType {
///
list,
///
double,
///
normal
}
class FilterItemModel {
final FilterItemType type;
String title;
final List<String>? subtitles;
///
final List<String>? subtitleShort;
List<bool>? selectedList;
bool topSelected;
int selectedSubIndex = 0;
FilterItemModel({
required this.type,
required this.title,
this.selectedList,
this.subtitles,
this.subtitleShort,
this.topSelected = true,
}) : assert(
type == FilterItemType.list
? (subtitles != null && subtitles.length > 0)
: true,
"type为list列表项不能为空");
}

@ -1,54 +0,0 @@
import 'package:aku_new_community/utils/headers.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class HomeSearch extends StatefulWidget {
HomeSearch({Key? key}) : super(key: key);
@override
_HomeSearchState createState() => _HomeSearchState();
}
class _HomeSearchState extends State<HomeSearch> {
@override
Widget build(BuildContext context) {
return Container(
// decoration: BoxDecoration(
// gradient: LinearGradient(
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// colors: [Color(0xffffd000), Color(0xffffbd00)],
// ),
// ),
color: Colors.white,
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top,
left: 32.w,
right: 32.w,
bottom: 16.w,
),
// child: MaterialButton(
// materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
// height: 72.w,
// shape: StadiumBorder(),
// elevation: 0,
// minWidth: double.infinity,
// color: Color(0xFFF3F3F3),
// onPressed: () {
// Get.to(() => BeeSearch());
// },
// child: Row(
// children: [
// Icon(
// Icons.search,
// size: 32.w,
// color: Color(0xFF666666),
// ),
// 10.wb,
// '搜索应用'.text.size(28.sp).color(ktextSubColor).make().expand(),
// ],
// ),
// ),
);
}
}

@ -28,9 +28,9 @@ class ActivityCard extends StatelessWidget {
elevation: 0, elevation: 0,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.w), borderRadius: BorderRadius.circular(24.w),
side: BorderSide( // side: BorderSide(
color: Colors.grey, // color: Colors.grey,
), // ),
), ),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: Column( child: Column(
@ -77,12 +77,18 @@ class ActivityCard extends StatelessWidget {
height: 39.w, height: 39.w,
width: 98.w, width: 98.w,
decoration: BoxDecoration( decoration: BoxDecoration(
color: outdate ? Color(0xFFABABAB) : Color(0x80FEBF76), color: outdate
? Colors.black.withOpacity(0.06)
: Color(0x80FEBF76),
borderRadius: BorderRadius.all(Radius.circular(4)), borderRadius: BorderRadius.all(Radius.circular(4)),
), ),
child: outdate child: outdate
? '已结束'.text.size(22.sp).color(Color(0xFF666666)).make() ? '已结束'
.text
.size(22.sp)
.color(Colors.black.withOpacity(0.25))
.make()
: '报名中' : '报名中'
.text .text
.size(22.sp) .size(22.sp)

@ -814,6 +814,13 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
palette_generator:
dependency: "direct main"
description:
name: palette_generator
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.2"
path: path:
dependency: transitive dependency: transitive
description: description:

@ -109,6 +109,8 @@ dependencies:
carousel_slider: ^4.0.0-nullsafety.0 carousel_slider: ^4.0.0-nullsafety.0
#跳转索引列表 #跳转索引列表
scroll_to_index: ^2.1.1 scroll_to_index: ^2.1.1
#提取图片主色
palette_generator: ^0.3.2
dev_dependencies: dev_dependencies:

Loading…
Cancel
Save