详细可以访问仓库 HcUi: 重复创造Flutter 的轮子 在原有组件上拓展 展现出新的特性 (gitee.com)
介绍
给用户提示文字消息
450fc559-2a6e-48d3-942a-9b98eef19acc.gif
代码演示
基础用法
HcNoticeBar(
content: "这是普通的通知公告",
),
带图标的公告
HcNoticeBar(
prefixIcon: Icon(Icons.info_outline),
content: "带双侧图标的通知公告",
suffixIcon: Icon(Icons.close),
),
带回调的公告
HcNoticeBar(
prefixIcon: Icon(Icons.info_outline),
content: "带回调的通知公告",
suffixIcon: Icon(Icons.close),
callback: (String name) {
print("我点击的部位是:${name}");
},
),
横向滚动的公告
HcNoticeBar(
showType: HcNoticeBarShowType.scroll,
//不满一行强制滚动
forceScroll: true,
prefixIcon: Icon(Icons.info_outline),
content: "这是一个横向滚动的公告",
suffixIcon: Icon(Icons.close),
callback: (String name) {
print("我点击的部位是:${name}");
},
),
纵向滚动的公告
HcNoticeBar(
showType: HcNoticeBarShowType.scroll,
scrollDirection: Axis.vertical,
duration: 2000,
prefixIcon: Icon(Icons.info_outline),
content: "这是一个文字按长度自动分割的纵向滚动的公告啊啊啊",
suffixIcon: Icon(Icons.close),
callback: (String name) {
print("我点击的部位是:${name}");
},
),
自定义纵向滚动的公告
HcNoticeBar(
showType: HcNoticeBarShowType.scroll,
scrollDirection: Axis.vertical,
duration: 6000,
prefixIcon: Icon(Icons.info_outline),
contentGroup: [
"风急天高猿啸哀,",
"渚清沙白鸟飞回。",
"无边落木萧萧下,",
"不尽长江滚滚来。",
"万里悲秋常作客,",
"百年多病独登台。",
"艰难苦恨繁霜鬓,",
"潦倒新停浊酒杯。"
],
suffixIcon: Icon(Icons.close),
callback: (String name) {
print("我点击的部位是:${name}");
},
),
自定义内容组件
HcNoticeBar(
prefixIcon: Icon(Icons.info_outline),
contentWidget: Text("这是一个自定义的组件 "),
suffixIcon: Icon(Icons.close),
),
横向手动拖动显示
HcNoticeBar(
showType: HcNoticeBarShowType.drag,
prefixIcon: Icon(Icons.info_outline),
content: "横向文字过长时候,不会显示省略符可以手动拖动显示完全 ",
),
展示全部信息
HcNoticeBar(
showType: HcNoticeBarShowType.full,
prefixIcon: Icon(Icons.info_outline),
content:
"生态文明建设是关系中华民族永续发展的根本大计。习近平总书记指出,要把建设美丽中国摆在强国建设、民族复兴的突出位置,以高品质生态环境支撑高质量发展,加快推进人与自然和谐共生的现代化。各地坚持以习近平生态文明思想为指引,牢固树立和践行绿水青山就是金山银山的理念,以更高站位、更宽视野、更大力度,全面推进美丽中国建设。",
suffixIcon: Icon(Icons.close),
),
展示指定行数信息
HcNoticeBar(
showType: HcNoticeBarShowType.ellipsis,
maxLines: 2,
prefixIcon: Icon(Icons.info_outline),
content:
"生态文明建设是关系中华民族永续发展的根本大计。习近平总书记指出,要把建设美丽中国摆在强国建设、民族复兴的突出位置,以高品质生态环境支撑高质量发展,加快推进人与自然和谐共生的现代化。各地坚持以习近平生态文明思想为指引,牢固树立和践行绿水青山就是金山银山的理念,以更高站位、更宽视野、更大力度,全面推进美丽中国建设。",
suffixIcon: Icon(Icons.close),
),
API
props
参数 |
说明 |
类型 |
默认值 |
是否必填 |
maxLines |
需要展示的行数 |
int |
1 |
false |
scrollDirection |
滚动方向 |
Axis |
Axis.horizontal |
false |
prefixIcon |
左侧图标 |
Widget |
- |
false |
suffixIcon |
右侧图标 |
Widget |
- |
false |
spacing |
组件内间隔 |
double |
8.0 |
false |
contentWidget |
自定义内容组件 |
Widget |
- |
false |
content |
文字内容 |
String |
- |
true |
contentGroup |
文字内容组(纵向滚动) |
List<String> |
- |
false |
showType |
展示类型 |
HcNoticeBarShowType |
HcNoticeBarShowType.ellipsis |
true |
forceScroll |
横向滚动时不满一屏是否强制滚动 |
bool |
false |
false |
duration |
滚动时长(毫秒) |
duration |
600000 |
false |
textStyle |
文字样式 |
TextStyle |
- |
false |
decoration |
背景装饰器 |
BoxDecoration |
- |
false |
padding |
组件内边距 |
EdgeInsets |
(v:16,h:8) |
false |
maxLines |
文字最大展示行数 |
int |
1 |
false |
callback |
点击的回调 |
HcNoticeBarCallback |
- |
false |
HcNoticeBarShowType
展示内容组件的方式(不对自定义内容组件控制)
参数名 |
说明 |
drag |
手动滑动(横向/纵向) |
scroll |
自动滚动(横向/纵向) |
ellipsis |
带缩略符号(展示多少maxLines控制) |
full |
全部展示 |
Function
方法名 |
说明 |
参数 |
返回类型 |
HcNoticeBarCallback |
点击相应部分的回调 |
Function(String name) |
void |
项目源码
ypedef HcNoticeBarCallback = Function(String);
enum HcNoticeBarShowType {
drag,
scroll,
ellipsis,
full,
}
class HcNoticeBar extends StatelessWidget {
//滚动方向
final Axis scrollDirection;
//左侧图标
final Widget? prefixIcon;
//尾部图标
final Widget? suffixIcon;
// 滚动的通知内容
final String? content;
//滚动通知的内容组 用于纵向滚动 如果横向滚动文字会拼接
final List<String>? contentGroup;
//不满一屏是否强制滚动
final bool forceScroll;
//中间的自定义组件
final Widget? contentWidget;
//间隔
final double spacing;
//组件的点击回调
final HcNoticeBarCallback? callback;
//展示的类型
final HcNoticeBarShowType showType;
//滚动时长
final Duration duration;
//文字样式
final TextStyle textStyle;
//北京装饰器
final BoxDecoration decoration;
//边距
final EdgeInsets padding;
//最大显示行数
final int maxLines;
const HcNoticeBar(
{super.key,
this.scrollDirection = Axis.horizontal,
this.prefixIcon,
this.suffixIcon,
this.spacing = 8.0,
this.callback,
this.contentWidget,
this.content,
this.contentGroup,
this.showType = HcNoticeBarShowType.ellipsis,
this.forceScroll = false,
this.duration = const Duration(milliseconds: 600000),
this.textStyle = const TextStyle(color: Colors.black, fontSize: 16),
this.decoration = const BoxDecoration(color: Colors.transparent),
this.padding = const EdgeInsets.symmetric(vertical: 12, horizontal: 8),
this.maxLines = 1});
const HcNoticeBar.scroll(
{super.key,
required this.scrollDirection,
this.prefixIcon,
this.suffixIcon,
this.content,
this.contentGroup,
this.forceScroll = false,
this.contentWidget,
this.spacing = 8.0,
this.callback,
this.duration = const Duration(milliseconds: 600000),
this.textStyle = const TextStyle(color: Colors.black, fontSize: 16),
this.decoration = const BoxDecoration(),
this.padding = const EdgeInsets.symmetric(vertical: 16, horizontal: 8)})
: showType = HcNoticeBarShowType.scroll,
maxLines = 1;
@override
Widget build(BuildContext context) {
Widget buildContent() {
if (contentWidget != null) {
return contentWidget!;
}
if (showType == HcNoticeBarShowType.scroll ||
showType == HcNoticeBarShowType.drag) {
return HcMarquee(
duration: duration,
textStyle: textStyle,
forceScroll:forceScroll,
enableScroll: showType == HcNoticeBarShowType.scroll,
content: content,
contentList: contentGroup,
scrollDirection: scrollDirection,
);
}
return HcTextEllipsis(
separateShow: false,
showEllipsisBtn: callback != null,
content: content ?? contentGroup?.join("") ?? "",
contentStyle: textStyle,
expandText: "详情",
maxLines: showType == HcNoticeBarShowType.full ? 2 * 31 : maxLines,
);
}
Widget buildGestureDetector({name, child}) {
return GestureDetector(
child: child,
onTap: () {
if (callback != null) {
callback!.call(name);
}
},
);
}
return Container(
padding: padding,
decoration: decoration,
child: Row(
children: [
if (prefixIcon != null)
Padding(
padding: EdgeInsets.only(right: spacing),
child: buildGestureDetector(name: 'prefix', child: prefixIcon!),
),
Expanded(
child: buildGestureDetector(
name: 'content',
child: buildContent(),
)),
if (suffixIcon != null)
Padding(
padding: EdgeInsets.only(left: spacing),
child: buildGestureDetector(name: 'suffix', child: suffixIcon!),
),
],
),
);
}
}