diff --git a/lib/src/components/card/content_card/brn_pair_info_table.dart b/lib/src/components/card/content_card/brn_pair_info_table.dart index 24b8479b..e5000e9a 100644 --- a/lib/src/components/card/content_card/brn_pair_info_table.dart +++ b/lib/src/components/card/content_card/brn_pair_info_table.dart @@ -7,6 +7,7 @@ import 'package:bruno/src/constants/brn_asset_constants.dart'; import 'package:bruno/src/theme/brn_theme.dart'; import 'package:bruno/src/utils/brn_rich_text.dart'; import 'package:bruno/src/utils/brn_tools.dart'; +import 'package:bruno/src/utils/css/brn_core_funtion.dart'; import 'package:bruno/src/utils/css/brn_css_2_text.dart'; import 'package:flutter/material.dart'; @@ -1020,7 +1021,7 @@ class BrnInfoModal { double itemSpacing, TextStyle valueTextStyle, bool isArrow = false, - BrnRichTextLinkClick richTextLinkClick, + BrnHyperLinkCallback richTextLinkClick, VoidCallback valueClickCallback, BrnPairInfoTableConfig themeData, }) { diff --git a/lib/src/components/form/items/general/brn_quick_select_input_item.dart b/lib/src/components/form/items/general/brn_quick_select_input_item.dart index 54dc5be0..e200ba5b 100644 --- a/lib/src/components/form/items/general/brn_quick_select_input_item.dart +++ b/lib/src/components/form/items/general/brn_quick_select_input_item.dart @@ -4,7 +4,7 @@ import 'package:bruno/src/components/form/base/brn_form_item_type.dart'; import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -289,7 +289,7 @@ class QuickButtonsState extends State { } if (widget.btnsTxt == null) { - widget.btnsTxt = List(); + widget.btnsTxt = []; } if (widget.selectBtnList == null) { @@ -327,7 +327,7 @@ class QuickButtonsState extends State { } List getBtnsByText() { - List result = List(); + List result = []; for (int index = 0; index < widget.btnsTxt.length; ++index) { String str = widget.btnsTxt[index]; @@ -346,7 +346,7 @@ class QuickButtonsState extends State { child: Text( str, style: TextStyle( - fontSize: BrnFont.FONT_12, + fontSize: BrnFonts.FONT_12, ), ), onPressed: () { diff --git a/lib/src/components/form/items/general/brn_range_input_item.dart b/lib/src/components/form/items/general/brn_range_input_item.dart index 109c8623..eb7fda17 100644 --- a/lib/src/components/form/items/general/brn_range_input_item.dart +++ b/lib/src/components/form/items/general/brn_range_input_item.dart @@ -1,14 +1,12 @@ // @dart=2.9 import 'package:bruno/src/components/form/base/brn_form_item_type.dart'; -import 'package:bruno/src/components/form/base/input_item_interface.dart'; import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; /// /// 范围输入型录入项 @@ -235,7 +233,7 @@ class BrnRangeInputFormItemState extends State { widget.minUnit ?? "", style: TextStyle( color: Color(0xFF101010), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), )), Container( @@ -244,7 +242,7 @@ class BrnRangeInputFormItemState extends State { "—", style: TextStyle( color: Color(0xFF101010), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), )), Container( @@ -290,7 +288,7 @@ class BrnRangeInputFormItemState extends State { widget.maxUnit ?? "", style: TextStyle( color: Color(0xFF101010), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), )), ], diff --git a/lib/src/components/form/items/general/brn_step_input_item.dart b/lib/src/components/form/items/general/brn_step_input_item.dart index 0b53b5c6..248a6385 100644 --- a/lib/src/components/form/items/general/brn_step_input_item.dart +++ b/lib/src/components/form/items/general/brn_step_input_item.dart @@ -7,7 +7,7 @@ import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; import 'package:bruno/src/utils/brn_tools.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -179,7 +179,7 @@ class BrnStepInputFormItemState extends State { "${widget.value}", style: TextStyle( color: Color(0xFF222222), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), ), ), diff --git a/lib/src/components/form/items/general/brn_text_input_item.dart b/lib/src/components/form/items/general/brn_text_input_item.dart index f7444a00..fa52c00c 100644 --- a/lib/src/components/form/items/general/brn_text_input_item.dart +++ b/lib/src/components/form/items/general/brn_text_input_item.dart @@ -1,14 +1,12 @@ // @dart=2.9 import 'package:bruno/src/components/form/base/brn_form_item_type.dart'; -import 'package:bruno/src/components/form/base/input_item_interface.dart'; import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; /// /// 文本输入型录入项 @@ -213,7 +211,7 @@ class BrnTextInputFormItemState extends State { widget.unit ?? "", style: TextStyle( color: Color(0xFF101010), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), )), ), diff --git a/lib/src/components/form/items/general/brn_text_select_item.dart b/lib/src/components/form/items/general/brn_text_select_item.dart index 6b75ef0a..22e7490e 100644 --- a/lib/src/components/form/items/general/brn_text_select_item.dart +++ b/lib/src/components/form/items/general/brn_text_select_item.dart @@ -7,7 +7,7 @@ import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; import 'package:bruno/src/utils/brn_tools.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -149,7 +149,7 @@ class BrnTextSelectFormItem extends StatefulWidget { } } -double _fontSize = BrnFont.FONT_16; +double _fontSize = BrnFonts.FONT_16; StrutStyle _contentStructStyle = StrutStyle( forceStrutHeight: true, height: 1, leading: 0.5, fontSize: _fontSize); @@ -291,7 +291,7 @@ class BrnTextSelectFormItemState extends State { forceStrutHeight: true, height: 1, leading: 0.5, - fontSize: BrnFont.FONT_14), + fontSize: BrnFonts.FONT_14), style: BrnFormUtil.getTipsTextStyle(widget.themeData), ), ), diff --git a/lib/src/components/form/items/general/brn_title_select_input_item.dart b/lib/src/components/form/items/general/brn_title_select_input_item.dart index 10d37cf7..03479b54 100644 --- a/lib/src/components/form/items/general/brn_title_select_input_item.dart +++ b/lib/src/components/form/items/general/brn_title_select_input_item.dart @@ -10,7 +10,7 @@ import 'package:bruno/src/constants/brn_asset_constants.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; import 'package:bruno/src/utils/brn_tools.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -298,7 +298,7 @@ class BrnTitleSelectInputFormItemState border: InputBorder.none, hintStyle: TextStyle( color: Color(0xFFCCCCCC), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, textBaseline: TextBaseline.alphabetic), hintText: widget.hint ?? '请输入', counterText: "", @@ -349,7 +349,7 @@ class TitleSelectPopWidget extends StatefulWidget { class _TitleSelectPopWidgetState extends State { @override Widget build(BuildContext context) { - List showList = List(); + List showList = []; for (int i = 0, n = widget.selectList.length; i < n; ++i) { showList.add(selectItem(widget.selectList[i], i, i == n - 1)); } diff --git a/lib/src/components/form/items/group/brn_normal_group.dart b/lib/src/components/form/items/group/brn_normal_group.dart index bd1cd414..f7cee515 100644 --- a/lib/src/components/form/items/group/brn_normal_group.dart +++ b/lib/src/components/form/items/group/brn_normal_group.dart @@ -5,9 +5,8 @@ import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/components/line/brn_line.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; /// /// 可展开收起组类型录入项 @@ -137,7 +136,7 @@ class BrnNormalFormGroupState extends State { widget.deleteLabel ?? "", style: TextStyle( color: Color(0xFFFA3F3F), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), ), ), @@ -171,7 +170,7 @@ class BrnNormalFormGroupState extends State { } List getSubItem() { - List result = List(); + List result = []; if (widget.children == null || widget.children.isEmpty) { return result; diff --git a/lib/src/components/form/items/group/element_expand_widget.dart b/lib/src/components/form/items/group/element_expand_widget.dart index 5268fe54..0f1fb5e7 100644 --- a/lib/src/components/form/items/group/element_expand_widget.dart +++ b/lib/src/components/form/items/group/element_expand_widget.dart @@ -8,7 +8,7 @@ import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; import 'package:bruno/src/utils/brn_tools.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -227,7 +227,7 @@ class _ExpansionElementState extends State widget.deleteText ?? "", style: TextStyle( color: Color(0xFFFA3F3F), - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), ), ), diff --git a/lib/src/components/form/items/misc/brn_add_label_item.dart b/lib/src/components/form/items/misc/brn_add_label_item.dart index 9438e463..500c8cb0 100644 --- a/lib/src/components/form/items/misc/brn_add_label_item.dart +++ b/lib/src/components/form/items/misc/brn_add_label_item.dart @@ -1,12 +1,10 @@ // @dart=2.9 import 'package:bruno/src/components/form/base/brn_form_item_type.dart'; -import 'package:bruno/src/components/form/base/input_item_interface.dart'; import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; /// 添加组类型录入项所使用的Widget // ignore: must_be_immutable @@ -61,7 +59,7 @@ class BrnAddLabelState extends State { .getConfig() .commonConfig .brandPrimary, - fontSize: BrnFont.FONT_18, + fontSize: BrnFonts.FONT_18, ), ), ), diff --git a/lib/src/components/form/items/misc/brn_title_item.dart b/lib/src/components/form/items/misc/brn_title_item.dart index 8a63b12b..2ae42450 100644 --- a/lib/src/components/form/items/misc/brn_title_item.dart +++ b/lib/src/components/form/items/misc/brn_title_item.dart @@ -4,7 +4,7 @@ import 'package:bruno/src/components/form/base/brn_form_item_type.dart'; import 'package:bruno/src/components/form/utils/brn_form_util.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/theme/configs/brn_form_config.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -135,7 +135,7 @@ class BrnTitleFormItemState extends State { widget.operationLabel ?? "", style: TextStyle( color: widget.themeData.commonConfig.brandPrimary, - fontSize: BrnFont.FONT_16, + fontSize: BrnFonts.FONT_16, ), )), ), diff --git a/lib/src/components/selectcity/brn_single_select_city_page.dart b/lib/src/components/selectcity/brn_single_select_city_page.dart index f98e8fa5..a7a13fe6 100644 --- a/lib/src/components/selectcity/brn_single_select_city_page.dart +++ b/lib/src/components/selectcity/brn_single_select_city_page.dart @@ -11,7 +11,7 @@ import 'package:bruno/src/components/sugsearch/brn_search_text.dart'; import 'package:bruno/src/constants/brn_asset_constants.dart'; import 'package:bruno/src/constants/brn_strings_constants.dart'; import 'package:bruno/src/utils/brn_tools.dart'; -import 'package:bruno/src/utils/font/brn_font.dart'; +import 'package:bruno/src/constants/brn_fonts_constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:lpinyin/lpinyin.dart'; @@ -57,7 +57,7 @@ class BrnSingleSelectCityPage extends StatefulWidget { } class _BrnSingleSelectCityPageState extends State { - List _cityList = List(); + List _cityList = []; ///搜索框的高度 int _suspensionHeight = 40; @@ -168,7 +168,7 @@ class _BrnSingleSelectCityPageState extends State { textAlign: TextAlign.center, style: TextStyle( color: Color(0xFF222222), - fontSize: BrnFont.FONT_12, + fontSize: BrnFonts.FONT_12, fontWeight: FontWeight.w400, ), ), @@ -363,7 +363,7 @@ class _BrnSingleSelectCityPageState extends State { ///获取城市搜索结果 List _searchCityList(String searchText) { - List cList = List(); + List cList = []; for (int index = 0; index < _cityList.length; index++) { BrnSelectCityModel cInfo = _cityList[index]; if (cInfo.name.contains(searchText) || diff --git a/lib/src/utils/font/brn_font.dart b/lib/src/constants/brn_fonts_constants.dart similarity index 84% rename from lib/src/utils/font/brn_font.dart rename to lib/src/constants/brn_fonts_constants.dart index 59de256b..c9a30757 100644 --- a/lib/src/utils/font/brn_font.dart +++ b/lib/src/constants/brn_fonts_constants.dart @@ -1,13 +1,10 @@ -class BrnFont { - static const double FONT_12 = 12; +class BrnFonts { + const BrnFonts._(); + static const double FONT_12 = 12; static const double FONT_14 = 14; - static const double FONT_16 = 16; - static const double FONT_18 = 18; - static const double FONT_20 = 20; - static const double FONT_22 = 22; } diff --git a/lib/src/utils/brn_event_bus.dart b/lib/src/utils/brn_event_bus.dart index c23f36b8..9727e70d 100644 --- a/lib/src/utils/brn_event_bus.dart +++ b/lib/src/utils/brn_event_bus.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'dart:async'; /// Dispatches events to listeners using the Dart [Stream] API. The [EventBus] @@ -13,28 +11,43 @@ import 'dart:async'; /// filter events. /// /// github: https://github.com/marcojakob/dart-event-bus -/// class EventBus { - StreamController _streamController; - - /// Controller for the event bus stream. - StreamController get streamController => _streamController; - /// Creates an [EventBus]. /// /// If [sync] is true, events are passed directly to the stream's listeners /// during a [fire] call. If false (the default), the event will be passed to /// the listeners at a later time, after the code creating the event has /// completed. - EventBus({bool sync = false}) - : _streamController = StreamController.broadcast(sync: sync); + EventBus({ + bool sync = false, + }) : _streamController = StreamController.broadcast(sync: sync); /// Instead of using the default [StreamController] you can use this constructor /// to pass your own controller. /// /// An example would be to use an RxDart Subject as the controller. - EventBus.customController(StreamController controller) - : _streamController = controller; + EventBus.customController( + StreamController controller, + ) : _streamController = controller; + + static EventBus? _instance; + + factory EventBus.init() { + _instance = EventBus(); + return _instance!; + } + + static EventBus get instance { + if (_instance == null) { + EventBus.init(); + } + return _instance!; + } + + StreamController _streamController; + + /// Controller for the event bus stream. + StreamController get streamController => _streamController; /// Listens for events of Type [T] and its subtypes. /// @@ -48,40 +61,22 @@ class EventBus { /// /// Each listener is handled independently, and if they pause, only the pausing /// listener is affected. A paused listener will buffer events internally until - /// unpaused or canceled. So it's usually better to just cancel and later + /// resumed or cancelled. So it's usually better to just cancel and later /// subscribe again (avoids memory leak). - /// Stream on() { if (T == dynamic) { - return streamController.stream; - } else { - return streamController.stream.where((event) => event is T).cast(); + return streamController.stream as Stream; } + return streamController.stream.where((dynamic e) => e is T).cast(); } /// Fires a new event on the event bus with the specified [event]. - /// void fire(event) { streamController.add(event); } /// Destroy this [EventBus]. This is generally only in a testing context. - /// void destroy() { _streamController.close(); } - - static EventBus _instance; - - factory EventBus.init() { - _instance = EventBus(); - return _instance; - } - - static EventBus get instance { - if (_instance == null) { - EventBus.init(); - } - return _instance; - } } diff --git a/lib/src/utils/brn_multi_click_util.dart b/lib/src/utils/brn_multi_click_util.dart index a9ecbf3d..b2d6f36b 100644 --- a/lib/src/utils/brn_multi_click_util.dart +++ b/lib/src/utils/brn_multi_click_util.dart @@ -1,4 +1,6 @@ class BrnMultiClickUtils { + const BrnMultiClickUtils._(); + static DateTime? _lastClickTime; static bool isMultiClick({int intervalMilliseconds = 500}) { diff --git a/lib/src/utils/brn_rich_text.dart b/lib/src/utils/brn_rich_text.dart index 8f4919bc..ef727d1d 100644 --- a/lib/src/utils/brn_rich_text.dart +++ b/lib/src/utils/brn_rich_text.dart @@ -1,98 +1,101 @@ -// @dart=2.9 - import 'package:bruno/src/theme/brn_theme_configurator.dart'; +import 'package:bruno/src/utils/css/brn_core_funtion.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -/// 福文本填充生成器 - -/// 超链接的点击回调 -typedef BrnRichTextLinkClick = void Function(String text, String link); +/// 富文本填充生成器 -///用于链式去生成福文本样式的文案 如果是直接的标签可以用css +/// 用于链式去生成富文本样式的文案 如果是直接的标签可以用css class BrnRichTextGenerator { - BrnRichTextGenerator() { - _spanList = List(); - _maxLine = 100; - } + BrnRichTextGenerator(); - List _spanList; - int _maxLine; - TextOverflow _overflow; + List _spanList = []; + int _maxLine = 100; + TextOverflow? _overflow; /// 添加超链接部分的文案 - /// text是显示的文案 - /// url是超链接的url - /// fontsize是显示大小 + /// text 是显示的文案 + /// url 是超链接的 url + /// fontsize 是显示大小 /// richTextLinkClick 是超链接点击的回调 - BrnRichTextGenerator addTextWithLink(String text, - {String url, - TextStyle textStyle, - Color linkColor, - double fontSize, - FontWeight fontWeight, - BrnRichTextLinkClick richTextLinkClick}) { - _spanList.add(TextSpan( + BrnRichTextGenerator addTextWithLink( + String text, { + String? url, + TextStyle? textStyle, + Color? linkColor, + double? fontSize, + FontWeight? fontWeight, + BrnHyperLinkCallback? richTextLinkClick, + }) { + _spanList.add( + TextSpan( style: textStyle ?? TextStyle( color: linkColor ?? BrnThemeConfigurator.instance .getConfig() .commonConfig - .brandPrimary, + ?.brandPrimary, fontWeight: fontWeight ?? FontWeight.normal, fontSize: fontSize ?? 16, ), - text: text ?? "", + text: text, recognizer: TapGestureRecognizer() ..onTap = () { if (richTextLinkClick != null) { richTextLinkClick(text, url); } - })); + }, + ), + ); return this; } /// 添加自定义文案 /// fontsize 是文案大小 默认是16 /// color 是文案的颜色 默认是深黑色 - BrnRichTextGenerator addText(String text, - {TextStyle textStyle, - double fontSize, - Color color, - FontWeight fontWeight}) { - _spanList.add(TextSpan( - text: text ?? "", + BrnRichTextGenerator addText( + String text, { + TextStyle? textStyle, + double? fontSize, + Color? color, + FontWeight? fontWeight, + }) { + _spanList.add( + TextSpan( + text: text, style: textStyle ?? TextStyle( - color: color ?? - BrnThemeConfigurator.instance - .getConfig() - .commonConfig - .colorTextBase, - fontSize: fontSize ?? 16, - fontWeight: fontWeight ?? FontWeight.normal))); + color: color ?? + BrnThemeConfigurator.instance + .getConfig() + .commonConfig + ?.colorTextBase, + fontSize: fontSize ?? 16, + fontWeight: fontWeight ?? FontWeight.normal, + ), + ), + ); return this; } /// 添加Icon - BrnRichTextGenerator addIcon(Widget icon, {PlaceholderAlignment alignment}) { + BrnRichTextGenerator addIcon( + Widget? icon, { + PlaceholderAlignment? alignment, + }) { _spanList.add( WidgetSpan( - child: icon != null - ? icon - : Container( - height: 0, - width: 0, - ), - alignment: alignment ?? PlaceholderAlignment.top), + alignment: alignment ?? PlaceholderAlignment.top, + child: icon ?? const SizedBox.shrink(), + ), ); return this; } /// 设置最多文案显示几行 默认是100行 BrnRichTextGenerator setMaxLines(int maxLine) { - if (maxLine != null && maxLine > 0) { + if (maxLine > 0) { _maxLine = maxLine; } return this; @@ -100,17 +103,14 @@ class BrnRichTextGenerator { /// 设置最多文案显示几行 默认是100行 BrnRichTextGenerator setTextOverflow(TextOverflow overflow) { - this._overflow = overflow; + _overflow = overflow; return this; } /// build出福文本 Widget build() { if (_spanList.isEmpty) { - return Container( - height: 0, - width: 0, - ); + return const SizedBox.shrink(); } return ExcludeSemantics( excluding: true, diff --git a/lib/src/utils/brn_text_util.dart b/lib/src/utils/brn_text_util.dart index 8188a568..18cb2692 100644 --- a/lib/src/utils/brn_text_util.dart +++ b/lib/src/utils/brn_text_util.dart @@ -1,19 +1,17 @@ -// @dart=2.9 - -import 'dart:ui'; - import 'package:bruno/src/utils/brn_tools.dart'; import 'package:flutter/widgets.dart'; class BrnTextUtil { + const BrnTextUtil._(); + /// 根据 TextStyle 计算 text 宽度。 static Size textSize(String text, TextStyle style) { if (BrunoTools.isEmpty(text)) return Size(0, 0); final TextPainter textPainter = TextPainter( - text: TextSpan(text: text, style: style), - maxLines: 1, - textDirection: TextDirection.ltr) - ..layout(minWidth: 0, maxWidth: double.infinity); + text: TextSpan(text: text, style: style), + maxLines: 1, + textDirection: TextDirection.ltr, + )..layout(minWidth: 0, maxWidth: double.infinity); return textPainter.size; } } diff --git a/lib/src/utils/brn_tools.dart b/lib/src/utils/brn_tools.dart index 3180cc2c..a5d90958 100644 --- a/lib/src/utils/brn_tools.dart +++ b/lib/src/utils/brn_tools.dart @@ -14,16 +14,16 @@ class BrunoTools { final BrnCommonConfig? commonConfig = BrnThemeConfigurator.instance .getConfig(configId: configId) .commonConfig; - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } return getAssetImageWithColor(assetFilePath, commonConfig?.brandPrimary); } /// 将 icon 根据传入颜色变后返回 static Image getAssetImageWithColor(String assetFilePath, Color? color) { - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } return Image.asset( assetFilePath, @@ -33,16 +33,16 @@ class BrunoTools { ); } - /// imgAssetPath: assets资源文件路径 - /// package 访问某个package里的资源,这里默认flutter_alliance_package - /// scale: 与所用的png资源是icon_2x.png (scale=2.0),icon_3x.png(scale=3.0) + /// [assetFilePath] assets 资源文件路径 + /// [package] 访问某个 package 里的资源,这里默认为 'bruno' + /// [scale] 与所用的 png 资源是 icon_2x.png (scale=2.0),icon_3x.png(scale=3.0) static Image getAssetImage( String assetFilePath, { BoxFit? fit, bool gaplessPlayback = false, }) { - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } return Image.asset( assetFilePath, @@ -54,8 +54,8 @@ class BrunoTools { } static Image getAssetScaleImage(String assetFilePath) { - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } return Image.asset( assetFilePath, @@ -69,8 +69,8 @@ class BrunoTools { double h, { Color? color, }) { - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } return Image.asset( assetFilePath, @@ -82,7 +82,7 @@ class BrunoTools { ); } - //从16进制数字字符串,生成Color,例如EDF0F3 + /// 从16进制数字字符串,生成Color,例如EDF0F3 static Color colorFromHexString(String? s) { if (s == null || s.length != 6 || int.tryParse(s, radix: 16) == null) { return Colors.black; @@ -90,28 +90,28 @@ class BrunoTools { return Color(int.parse(s, radix: 16) + 0xFF000000); } - // 获取本地AssetImage - /// [imgAssetPath]: assets资源文件路径 + /// 获取本地 [AssetImage] + /// [assetFilePath] assets资源文件路径 static ImageProvider getAssetImageProvider(String assetFilePath) { - if (!assetFilePath.startsWith("assets")) { - assetFilePath = "assets/$assetFilePath"; + if (!assetFilePath.startsWith('assets')) { + assetFilePath = 'assets/$assetFilePath'; } - AssetImage asimg = AssetImage( + final AssetImage image = AssetImage( assetFilePath, package: BrnStrings.flutterPackageName, ); - return asimg; + return image; } /// 根据 TextStyle 计算 text 宽度。 static Size textSize(String text, TextStyle style) { if (isEmpty(text)) return Size(0, 0); final TextPainter textPainter = TextPainter( - text: TextSpan(text: text, style: style), - maxLines: 1, - textDirection: TextDirection.ltr) - ..layout(minWidth: 0, maxWidth: double.infinity); + text: TextSpan(text: text, style: style), + maxLines: 1, + textDirection: TextDirection.ltr, + )..layout(minWidth: 0, maxWidth: double.infinity); return textPainter.size; } @@ -119,9 +119,11 @@ class BrunoTools { static bool isEmpty(Object? obj) { if (obj is String) { return obj.isEmpty; - } else if (obj is Iterable) { + } + if (obj is Iterable) { return obj.isEmpty; - } else if (obj is Map) { + } + if (obj is Map) { return obj.length == 0; } return obj == null; @@ -129,7 +131,7 @@ class BrunoTools { /// 去掉最后一位小数 //static double formatNumRemoveLastNum(double num){ -// int count = num.toString().length - num.toString().lastIndexOf(".") - 1; +// int count = num.toString().length - num.toString().lastIndexOf('.') - 1; // if(count >1){ // // } diff --git a/lib/src/utils/css/brn_core_funtion.dart b/lib/src/utils/css/brn_core_funtion.dart index f90379db..830cb947 100644 --- a/lib/src/utils/css/brn_core_funtion.dart +++ b/lib/src/utils/css/brn_core_funtion.dart @@ -1,43 +1,43 @@ -// @dart=2.9 - import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:bruno/src/utils/css/brn_util.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:xml/xml_events.dart' as xml; -typedef BrnHyperLinkCallback = Function(String text, String url); +/// 超链接的点击回调 +typedef BrnHyperLinkCallback = void Function(String? text, String? url); -//用于将标签转为 style +/// 用于将标签转为 style class BrnConvert { - //超链接的点击回调 - BrnHyperLinkCallback _linkCallBack; - - //标签的集合 - Iterable _eventList = []; - - //标签对应的style - List stack = []; - - //外部传入的默认文本样式 - TextStyle _defaultStyle; - - BrnConvert(String cssContent, - {Function linkCallBack, TextStyle defaultStyle}) { + BrnConvert( + String cssContent, { + BrnHyperLinkCallback? linkCallBack, + TextStyle? defaultStyle, + }) { _eventList = xml.parseEvents(cssContent); _linkCallBack = linkCallBack ?? null; _defaultStyle = defaultStyle; } - //转换的思路:将 开始标签 的属性转为 合适的style, 并将其存入集合中 - // font开始标签目前支持的属性:color、weight、size - // a开始标签支持的属性:href - // 文本标签 去获取style集合的最后一个元素 并应用style样式 - // 结束标签 则将集合的最后一个元素删除 + /// 超链接的点击回调 + BrnHyperLinkCallback? _linkCallBack; + + /// 外部传入的默认文本样式 + TextStyle? _defaultStyle; + /// 标签的集合 + Iterable _eventList = []; + + /// 标签对应的style + List<_Tag> stack = []; + + /// 转换的思路:将 开始标签 的属性转为 合适的style, 并将其存入集合中 + /// a开始标签支持的属性:href + /// 文本标签 去获取style集合的最后一个元素 并应用style样式 + /// 结束标签 则将集合的最后一个元素删除 List convert() { - //优先使用外部提供的样式 - TextStyle style = _defaultStyle ?? + // 优先使用外部提供的样式 + final TextStyle style = _defaultStyle ?? TextStyle( fontSize: 14, decoration: TextDecoration.none, @@ -45,54 +45,57 @@ class BrnConvert { color: BrnThemeConfigurator.instance .getConfig() .commonConfig - .colorTextImportant, + ?.colorTextImportant, ); - List spans = []; + final List spans = []; _eventList.forEach((xmlEvent) { if (xmlEvent is xml.XmlStartElementEvent) { if (!xmlEvent.isSelfClosing) { - Tag tag = Tag(); + final _Tag tag = _Tag(); TextStyle textStyle = style.copyWith(); - if (xmlEvent.name == "font") { + if (xmlEvent.name == 'font') { xmlEvent.attributes.forEach((attr) { switch (attr.name) { - case "color": - Color textColor = - BrnConvertUtil.generateColorByString(attr.value); - textStyle = textStyle.apply(color: textColor); + case 'color': + textStyle = textStyle.apply( + color: BrnConvertUtil.generateColorByString(attr.value), + ); break; - case "weight": + case 'weight': FontWeight fontWeight = BrnConvertUtil.generateFontWidgetByString(attr.value); textStyle = textStyle.apply( - fontWeightDelta: - fontWeight.index - FontWeight.normal.index); + fontWeightDelta: fontWeight.index - FontWeight.normal.index, + ); break; - case "size": - double size = BrnConvertUtil.generateFontSize(attr.value); - textStyle = textStyle.apply(fontSizeDelta: size - 13); + case 'size': + textStyle = textStyle.apply( + fontSizeDelta: + BrnConvertUtil.generateFontSize(attr.value) - 13, + ); break; } }); tag.isLink = false; } - if (xmlEvent.name == "strong") { + if (xmlEvent.name == 'strong') { tag.isLink = false; textStyle = textStyle.apply(fontWeightDelta: 2); } - if (xmlEvent.name == "a") { + if (xmlEvent.name == 'a') { tag.isLink = true; xmlEvent.attributes.forEach((attr) { switch (attr.name) { - case "href": + case 'href': textStyle = textStyle.apply( - color: BrnThemeConfigurator.instance - .getConfig() - .commonConfig - .brandPrimary); + color: BrnThemeConfigurator.instance + .getConfig() + .commonConfig + ?.brandPrimary, + ); tag.linkUrl = attr.value; break; } @@ -102,14 +105,14 @@ class BrnConvert { tag.style = textStyle; stack.add(tag); } else { - if (xmlEvent.name == "br") { - spans.add(TextSpan(text: "\n")); + if (xmlEvent.name == 'br') { + spans.add(TextSpan(text: '\n')); } } } if (xmlEvent is xml.XmlTextEvent) { - Tag tag = Tag(); + _Tag tag = _Tag(); tag.style = style.copyWith(); if (stack.isNotEmpty) { tag = stack.last; @@ -119,9 +122,9 @@ class BrnConvert { } if (xmlEvent is xml.XmlEndElementEvent) { - Tag top = stack.removeLast(); + _Tag top = stack.removeLast(); if (top.name != xmlEvent.name) { - debugPrint("Error format HTML"); + debugPrint('Error format HTML'); return; } } @@ -130,24 +133,23 @@ class BrnConvert { return spans; } - TextSpan _createTextSpan(String text, Tag tag) { - if (text.isEmpty) return TextSpan(text: ""); - TapGestureRecognizer tapGestureRecognizer = TapGestureRecognizer(); - tapGestureRecognizer.onTap = () { - if (_linkCallBack != null) { - _linkCallBack(text, tag.linkUrl); - } - }; + TextSpan _createTextSpan(String text, _Tag tag) { + if (text.isEmpty) return TextSpan(text: ''); + final TapGestureRecognizer recognizer = TapGestureRecognizer() + ..onTap = () { + _linkCallBack?.call(text, tag.linkUrl); + }; return TextSpan( - style: tag.style, - text: text, - recognizer: tag.isLink ? tapGestureRecognizer : null); + style: tag.style, + text: text, + recognizer: tag.isLink ? recognizer : null, + ); } } -class Tag { - String name; - TextStyle style; - String linkUrl; +class _Tag { + String? name; + TextStyle? style; + String? linkUrl; bool isLink = false; } diff --git a/lib/src/utils/css/brn_css_2_text.dart b/lib/src/utils/css/brn_css_2_text.dart index 6a225738..beb13bde 100644 --- a/lib/src/utils/css/brn_css_2_text.dart +++ b/lib/src/utils/css/brn_css_2_text.dart @@ -1,28 +1,38 @@ -// @dart=2.9 - import 'package:bruno/src/utils/css/brn_core_funtion.dart'; import 'package:flutter/material.dart'; /// 将CSS格式的标签转为文本 class BrnCSS2Text { - static TextSpan toTextSpan(String htmlContent, - {BrnHyperLinkCallback linksCallback, TextStyle defaultStyle}) { + const BrnCSS2Text._(); + + static TextSpan toTextSpan( + String htmlContent, { + BrnHyperLinkCallback? linksCallback, + TextStyle? defaultStyle, + }) { return TextSpan( - children: BrnConvert(htmlContent, - linkCallBack: linksCallback, defaultStyle: defaultStyle) - .convert(), + children: BrnConvert( + htmlContent, + linkCallBack: linksCallback, + defaultStyle: defaultStyle, + ).convert(), ); } - static Text toTextView(String htmlContent, - {BrnHyperLinkCallback linksCallback, - TextStyle defaultStyle, - int maxLines, - TextAlign textAlign, - TextOverflow textOverflow}) { + static Text toTextView( + String htmlContent, { + BrnHyperLinkCallback? linksCallback, + TextStyle? defaultStyle, + int? maxLines, + TextAlign? textAlign, + TextOverflow? textOverflow, + }) { return Text.rich( - toTextSpan(htmlContent, - linksCallback: linksCallback, defaultStyle: defaultStyle), + toTextSpan( + htmlContent, + linksCallback: linksCallback, + defaultStyle: defaultStyle, + ), maxLines: maxLines, textAlign: textAlign, overflow: textOverflow ?? TextOverflow.clip, diff --git a/lib/src/utils/css/brn_util.dart b/lib/src/utils/css/brn_util.dart index bd1e45cc..09b99571 100644 --- a/lib/src/utils/css/brn_util.dart +++ b/lib/src/utils/css/brn_util.dart @@ -1,52 +1,53 @@ -// @dart=2.9 - -import 'dart:ui'; - import 'package:bruno/src/theme/brn_theme_configurator.dart'; +import 'package:flutter/painting.dart'; -//将标签属性 转为 相当的style +/// 将标签属性转为对应的 style class BrnConvertUtil { - //将标签color 转为 颜色 - static Color generateColorByString(String hexColor, - {String defColor: 'ffffffff'}) { - Color color = - BrnThemeConfigurator.instance.getConfig().commonConfig.brandPrimary; - if (hexColor == null || hexColor.isEmpty) return color; - hexColor = hexColor.toUpperCase().replaceAll("#", ""); + const BrnConvertUtil._(); + + /// 将标签 color 转为 颜色 + static Color? generateColorByString( + String hexColor, { + Color defaultColor = const Color(0xffffffff), + }) { + Color? color = + BrnThemeConfigurator.instance.getConfig().commonConfig?.brandPrimary; + if (hexColor.isEmpty) return color; + hexColor = hexColor.toUpperCase().replaceAll('#', ''); hexColor = hexColor.replaceAll('0X', ''); if (hexColor.length == 6) { - hexColor = "FF" + hexColor; + hexColor = 'FF' + hexColor; } try { color = Color(int.parse(hexColor, radix: 16)); - } catch (e) {} - return color; + } catch (_) {} + return color ?? defaultColor; } - //将标签字体 转为 合适的字体 + /// 将标签字体转为合适的字体 static FontWeight generateFontWidgetByString(String fontWeight) { FontWeight defaultWeight = FontWeight.normal; switch (fontWeight) { - case "Bold": + case 'Bold': defaultWeight = FontWeight.w600; break; - case "Medium": + case 'Medium': defaultWeight = FontWeight.w500; break; - case "Light": + case 'Light': defaultWeight = FontWeight.w300; break; } return defaultWeight; } - //将标签字体大小 转为 合适大小的字体 + /// 将标签字体大小转为合适大小的字体 static double generateFontSize(String size) { double defaultSize = 13; try { defaultSize = double.parse(size); - } catch (e) {} + } catch (_) {} return defaultSize; } } diff --git a/lib/src/utils/i18n/brn_date_picker_i18n.dart b/lib/src/utils/i18n/brn_date_picker_i18n.dart index 6dc92ae9..b8180a0a 100755 --- a/lib/src/utils/i18n/brn_date_picker_i18n.dart +++ b/lib/src/utils/i18n/brn_date_picker_i18n.dart @@ -1,6 +1,4 @@ -// @dart=2.9 - -import 'dart:math'; +import 'dart:math' as math; part 'brn_strings_zh_cn.dart'; @@ -69,61 +67,65 @@ const DateTimePickerLocale DATETIME_PICKER_LOCALE_DEFAULT = DateTimePickerLocale.zh_cn; const Map datePickerI18n = { - DateTimePickerLocale.zh_cn: const _StringsZhCn(), + DateTimePickerLocale.zh_cn: _StringsZhCn(), }; class DatePickerI18n { + const DatePickerI18n._(); + /// Get done button text static String getLocaleDone(DateTimePickerLocale locale) { - _StringsI18n i18n = datePickerI18n[locale] ?? + final _StringsI18n? i18n = datePickerI18n[locale] ?? datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]; - return i18n.getDoneText() ?? - datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT].getDoneText(); + return i18n?.getDoneText() ?? + datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]!.getDoneText(); } /// Get cancel button text static String getLocaleCancel(DateTimePickerLocale locale) { - _StringsI18n i18n = datePickerI18n[locale] ?? + final _StringsI18n? i18n = datePickerI18n[locale] ?? datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]; - return i18n.getCancelText() ?? - datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT].getCancelText(); + return i18n?.getCancelText() ?? + datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]!.getCancelText(); } /// Get locale month array static List getLocaleMonths(DateTimePickerLocale locale) { - _StringsI18n i18n = datePickerI18n[locale] ?? + final _StringsI18n? i18n = datePickerI18n[locale] ?? datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]; - List months = i18n.getMonths(); + final List? months = i18n?.getMonths(); if (months != null && months.isNotEmpty) { return months; } - return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT].getMonths(); + return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]!.getMonths(); } /// Get locale week array - static List getLocaleWeeks(DateTimePickerLocale locale, - [bool isFull = true]) { - _StringsI18n i18n = datePickerI18n[locale] ?? + static List getLocaleWeeks( + DateTimePickerLocale locale, [ + bool isFull = true, + ]) { + final _StringsI18n? i18n = datePickerI18n[locale] ?? datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]; if (isFull) { - List weeks = i18n.getWeeksFull(); + final List? weeks = i18n?.getWeeksFull(); if (weeks != null && weeks.isNotEmpty) { return weeks; } - return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT].getWeeksFull(); + return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]!.getWeeksFull(); } - List weeks = i18n.getWeeksShort(); + final List? weeks = i18n?.getWeeksShort(); if (weeks != null && weeks.isNotEmpty) { return weeks; } - List fullWeeks = i18n.getWeeksFull(); + final List? fullWeeks = i18n?.getWeeksFull(); if (fullWeeks != null && fullWeeks.isNotEmpty) { return fullWeeks - .map((item) => item.substring(0, min(3, item.length))) + .map((item) => item.substring(0, math.min(3, item.length))) .toList(); } - return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT].getWeeksShort(); + return datePickerI18n[DATETIME_PICKER_LOCALE_DEFAULT]!.getWeeksShort(); } } diff --git a/lib/src/utils/i18n/brn_strings_zh_cn.dart b/lib/src/utils/i18n/brn_strings_zh_cn.dart index 9c7bbdd0..7f9294c0 100755 --- a/lib/src/utils/i18n/brn_strings_zh_cn.dart +++ b/lib/src/utils/i18n/brn_strings_zh_cn.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - part of 'brn_date_picker_i18n.dart'; /// Chinese (ZH) Simplified @@ -7,56 +5,52 @@ class _StringsZhCn extends _StringsI18n { const _StringsZhCn(); @override - String getCancelText() { - return '取消'; - } + String getCancelText() => '取消'; @override - String getDoneText() { - return '确定'; - } + String getDoneText() => '确定'; @override List getMonths() { - return [ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12" + return [ + '01', + '02', + '03', + '04', + '05', + '06', + '07', + '08', + '09', + '10', + '11', + '12', ]; } @override List getWeeksFull() { - return [ - "星期一", - "星期二", - "星期三", - "星期四", - "星期五", - "星期六", - "星期日", + return [ + '星期一', + '星期二', + '星期三', + '星期四', + '星期五', + '星期六', + '星期日', ]; } @override List getWeeksShort() { - return [ - "周一", - "周二", - "周三", - "周四", - "周五", - "周六", - "周日", + return [ + '周一', + '周二', + '周三', + '周四', + '周五', + '周六', + '周日', ]; } }