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

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

@ -1,13 +1,11 @@
// Dart imports:
import 'package:aku_new_community/const/resource.dart';
import 'package:aku_new_community/constants/api.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/community/activity_item_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/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/one_alarm/widget/alarm_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:badges/badges.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/services.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:get/get.dart';
import 'package:jpush_flutter/jpush_flutter.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:power_logger/power_logger.dart';
import 'package:provider/provider.dart';
import 'package:velocity_x/velocity_x.dart';
import 'widget/home_search.dart';
class HomePage extends StatefulWidget {
HomePage({Key? key}) : super(key: key);
@ -66,6 +62,9 @@ class _HomePageState extends State<HomePage>
List<ActivityItemModel> _activityItemModels = [];
List<BoardItemModel> _boardItemModels = [];
List<SwiperModel> _swiperModels = [];
SwiperController _swiperController = SwiperController();
ValueNotifier<Color> _barColor = ValueNotifier(Colors.transparent);
@override
void initState() {
@ -81,12 +80,15 @@ class _HomePageState extends State<HomePage>
}
_scrollController = ScrollController();
_refreshController = EasyRefreshController();
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.transparent));
}
@override
void dispose() {
_refreshController.dispose();
_scrollController?.dispose();
_swiperController.dispose();
super.dispose();
}
@ -97,11 +99,51 @@ class _HomePageState extends State<HomePage>
commentCount = appProvider.messageCenterModel.commentCount ?? 0;
sysCount = appProvider.messageCenterModel.sysCount ?? 0;
sum = commentCount + sysCount;
return Scaffold(
extendBodyBehindAppBar: true,
appBar: AnimateAppBar(
scrollController: _scrollController,
actions: [
var head = ValueListenableBuilder(
valueListenable: _barColor,
builder: (context, Color color, child) {
return Container(
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(
onTap: () {
Get.to(() => BeeSearch());
@ -134,27 +176,23 @@ class _HomePageState extends State<HomePage>
height: 40.w, width: 40.w),
)),
),
],
]),
),
// floatingActionButton: FloatingActionButton(
//
// child: Container(
// decoration: BoxDecoration(
// image: DecorationImage(
// fit: BoxFit.fill,
// image:
// AssetImage(R.ASSETS_ICONS_ICON_MAIN_OPEN_PNG),)
// ),
// ),
// onPressed: (){
// print('FloatingActionButton');
// },
// ),
);
return AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle.dark,
child: Scaffold(
extendBody: true,
extendBodyBehindAppBar: true,
body: Stack(
children: [
EasyRefresh(
Column(
children: [
head,
Flexible(
child: EasyRefresh(
controller: _refreshController,
header: MaterialHeader(),
header: BeeBallPauseHeader(bgColor: _barColor),
firstRefresh: true,
onRefresh: () async {
//_activityItemModel = await CommunityFunc.activity();
@ -171,12 +209,11 @@ class _HomePageState extends State<HomePage>
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
HomeSearch(),
HomeSwiper(), //
// SizedBox(height: 100.w),
Container(
padding: EdgeInsets.only(top: 24.w, bottom: 32.w),
padding:
EdgeInsets.only(top: 24.w, bottom: 32.w),
child: getFunction(), //ApplicationView(),
decoration: BoxDecoration(
color: Colors.white,
@ -198,11 +235,12 @@ class _HomePageState extends State<HomePage>
SliverToBoxAdapter(
child: Container(
height: 40,
margin:
EdgeInsets.only(left: 32.w, right: 32.w, top: 24.w),
margin: EdgeInsets.only(
left: 32.w, right: 32.w, top: 24.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8)),
borderRadius:
BorderRadius.all(Radius.circular(8)),
boxShadow: const <BoxShadow>[
BoxShadow(
color: Color(0x14000000),
@ -219,16 +257,19 @@ class _HomePageState extends State<HomePage>
GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 24.w),
padding: EdgeInsets.only(left: 32.w, 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),
image: AssetImage(
R.ASSETS_IMAGES_CARD_YELLOW_PNG),
)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'访客邀请',
@ -278,11 +319,12 @@ class _HomePageState extends State<HomePage>
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image:
AssetImage(R.ASSETS_IMAGES_CARD_PINK_PNG),
image: AssetImage(
R.ASSETS_IMAGES_CARD_PINK_PNG),
)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
20.wb,
Column(
@ -295,7 +337,8 @@ class _HomePageState extends State<HomePage>
style: TextStyle(
color: Color(0xD9000000),
fontSize: 26.sp,
fontWeight: FontWeight.bold),
fontWeight:
FontWeight.bold),
),
10.hb,
Text(
@ -329,11 +372,12 @@ class _HomePageState extends State<HomePage>
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image:
AssetImage(R.ASSETS_IMAGES_CARD_BLUE_PNG),
image: AssetImage(
R.ASSETS_IMAGES_CARD_BLUE_PNG),
)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
20.wb,
Column(
@ -346,7 +390,8 @@ class _HomePageState extends State<HomePage>
style: TextStyle(
color: Color(0xD9000000),
fontSize: 26.sp,
fontWeight: FontWeight.bold),
fontWeight:
FontWeight.bold),
),
10.hb,
Text(
@ -369,7 +414,8 @@ class _HomePageState extends State<HomePage>
),
),
onTap: () {
Get.to(AdvicePage(type: AdviceType.SUGGESTION));
Get.to(AdvicePage(
type: AdviceType.SUGGESTION));
},
)
],
@ -381,23 +427,6 @@ class _HomePageState extends State<HomePage>
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: '查看全部',
@ -422,7 +451,8 @@ class _HomePageState extends State<HomePage>
child: Builder(
builder: (context) {
return ActivityCard(
model: _activityItemModels[index]);
model: _activityItemModels[
index]);
},
),
);
@ -437,9 +467,13 @@ class _HomePageState extends State<HomePage>
],
),
),
),
],
),
OverlayLivingBtnWidget()
],
),
),
);
}
@ -447,10 +481,25 @@ class _HomePageState extends State<HomePage>
return Container(
width: double.infinity,
height: 320.w,
decoration:
BoxDecoration(border: Border.all(width: 0, color: _barColor.value)),
child: AspectRatio(
aspectRatio: 375 / 160,
child: Swiper(
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) {
return getSwiperImage(_swiperModels[index]);
},
@ -562,3 +611,62 @@ class _HomePageState extends State<HomePage>
@override
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/utils/headers.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:provider/provider.dart';
class AnimateAppBar extends StatefulWidget with PreferredSizeWidget {
final ScrollController? scrollController;
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);
@override
@ -19,31 +22,28 @@ class AnimateAppBar extends StatefulWidget with PreferredSizeWidget {
}
class _AnimateAppBarState extends State<AnimateAppBar> {
Color _bgColor = Colors.white;
@override
void 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
Widget build(BuildContext context) {
final appProvider = Provider.of<AppProvider>(context);
return Padding(
padding: const EdgeInsets.only(top: 5),
child: AppBar(
return ValueListenableBuilder(
valueListenable: widget.bgColor,
builder: (context, color, child) {
return AppBar(
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: widget.bgColor.value,
statusBarIconBrightness: Brightness.light),
titleSpacing: 10.0,
title: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
title: child,
backgroundColor: widget.bgColor.value,
actions: widget.actions,
);
},
child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
if (appProvider.location != null)
Padding(
padding: const EdgeInsets.only(right: 5),
@ -73,9 +73,6 @@ class _AnimateAppBarState extends State<AnimateAppBar> {
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,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.w),
side: BorderSide(
color: Colors.grey,
),
// side: BorderSide(
// color: Colors.grey,
// ),
),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: Column(
@ -77,12 +77,18 @@ class ActivityCard extends StatelessWidget {
height: 39.w,
width: 98.w,
decoration: BoxDecoration(
color: outdate ? Color(0xFFABABAB) : Color(0x80FEBF76),
color: outdate
? Colors.black.withOpacity(0.06)
: Color(0x80FEBF76),
borderRadius: BorderRadius.all(Radius.circular(4)),
),
child: outdate
? '已结束'.text.size(22.sp).color(Color(0xFF666666)).make()
? '已结束'
.text
.size(22.sp)
.color(Colors.black.withOpacity(0.25))
.make()
: '报名中'
.text
.size(22.sp)

@ -814,6 +814,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
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:
dependency: transitive
description:

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

Loading…
Cancel
Save