Skip to content

Commit

Permalink
migrate appraise dir to null safety
Browse files Browse the repository at this point in the history
  • Loading branch information
hexintao committed Jan 18, 2022
1 parent a8101d4 commit c6a6847
Show file tree
Hide file tree
Showing 11 changed files with 291 additions and 297 deletions.
7 changes: 3 additions & 4 deletions example/lib/sample/components/appraise/appraise_example.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// @dart=2.9

import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart';

Expand Down Expand Up @@ -82,6 +80,7 @@ class _AppraiseExampleState extends State<AppraiseExample> {
config: BrnAppraiseConfig(
showConfirmButton: false,
starAppraiseHint: '星星未选择时的文案',
inputDefaultText: '这是一段默认文字',
inputTextChangeCallback: (input) {
BrnToast.show('输入的内容为' + input, context);
},
Expand Down Expand Up @@ -230,10 +229,10 @@ class _AppraiseExampleState extends State<AppraiseExample> {
void showToast(int index, List<String> selectedTags, String input,
BuildContext context) {
String str = '选中的评价为$index';
if (selectedTags?.isNotEmpty ?? false) {
if (selectedTags.isNotEmpty) {
str = str + ',选中的标签为:' + selectedTags.toString();
}
if (input?.isNotEmpty ?? false) {
if (input.isNotEmpty) {
str = str + ',输入的内容为:' + input;
}
BrnToast.show(str, context);
Expand Down
1 change: 1 addition & 0 deletions lib/bruno.dart
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ export 'src/components/appraise/brn_appraise_bottom_picker.dart';
export 'src/components/appraise/brn_appraise_emoji_list_view.dart';
export 'src/components/appraise/brn_appraise_header.dart';
export 'src/components/appraise/brn_appraise.dart';
export 'src/components/appraise/brn_appraise_config.dart';
export 'src/components/appraise/brn_appraise_star_list_view.dart';

//大图预览
Expand Down
217 changes: 53 additions & 164 deletions lib/src/components/appraise/brn_appraise.dart
Original file line number Diff line number Diff line change
@@ -1,32 +1,13 @@
// @dart=2.9

import 'package:bruno/src/components/appraise/brn_appraise_emoji_list_view.dart';
import 'package:bruno/src/components/appraise/brn_appraise_header.dart';
import 'package:bruno/src/components/appraise/brn_appraise_star_list_view.dart';
import 'package:bruno/src/components/appraise/brn_mulit_select_tags.dart';
import 'package:bruno/src/components/button/brn_big_main_button.dart';
import 'package:bruno/src/components/input/brn_input_text.dart';
import 'package:bruno/src/components/picker/brn_tags_picker_config.dart';
import 'package:bruno/src/components/appraise/brn_appraise_config.dart';
import 'package:flutter/material.dart';

/// 点击表情或者星星时的回调
/// index 点击的表情或者星星的index
typedef BrnAppraiseIconClick = void Function(int index);

/// 点击tag的回调
/// selectedTags 所有选中标签的集合
typedef BrnAppraiseTagClick = void Function(List<String> selectedTags);

/// 提交按钮点击事件回调
/// index 选中的表情或者星星的index
/// selectedTags 所有选中标签的集合
/// input 自定义输入的内容
typedef BrnAppraiseConfirmClick = void Function(
int index, List<String> selectedTags, String input);

/// 点击关闭的回掉
typedef BrnAppraiseCloseClickCallBack = void Function(BuildContext context);

/// /// /// /// /// /// /// /// /// /
/// 描述: 评价组件
/// 1. 支持表情包和星星两种
Expand All @@ -39,7 +20,7 @@ const BrnAppraiseConfig cConfig = BrnAppraiseConfig();

class BrnAppraise extends StatefulWidget {
/// 标题
final String title;
final String? title;

/// 标题类型,取值[BrnAppraiseHeaderType]
/// center 标题居中
Expand All @@ -59,13 +40,13 @@ class BrnAppraise extends StatefulWidget {
final List<String> iconDescriptions;

/// 标签
final List<String> tags;
final List<String>? tags;

///输入框允许提示文案
final String inputHintText;
final String? inputHintText;

/// 提交按钮的点击回调
final BrnAppraiseConfirmClick onConfirm;
final BrnAppraiseConfirmClick? onConfirm;

/// 评价组件的配置项
final BrnAppraiseConfig config;
Expand All @@ -79,36 +60,37 @@ class BrnAppraise extends StatefulWidget {
'超惊喜'
];

BrnAppraise({
this.title,
this.headerType = BrnAppraiseHeaderType.spaceBetween,
this.type = BrnAppraiseType.Star,
this.iconDescriptions = _defaultIconDescriptions,
this.tags,
this.inputHintText,
this.onConfirm,
this.config = cConfig,
});
BrnAppraise(
{Key? key,
this.title,
this.headerType = BrnAppraiseHeaderType.spaceBetween,
this.type = BrnAppraiseType.Star,
this.iconDescriptions = _defaultIconDescriptions,
this.tags,
this.inputHintText,
this.onConfirm,
this.config = cConfig})
: super(key: key);

@override
_BrnAppraiseState createState() => _BrnAppraiseState();
}

class _BrnAppraiseState extends State<BrnAppraise> {
int _appraiseIndex = -1;
bool _enable;
String _inputText;
List<String> _selectedTag;
bool? _enable;
String? _inputText;
List<String> _selectedTag = [];

@override
void initState() {
_enable = widget.config?.isConfirmButtonEnabled;
_enable = widget.config.isConfirmButtonEnabled;
super.initState();
}

@override
void didUpdateWidget(BrnAppraise oldWidget) {
_enable = widget.config?.isConfirmButtonEnabled;
_enable = widget.config.isConfirmButtonEnabled;
super.didUpdateWidget(oldWidget);
}

Expand Down Expand Up @@ -151,41 +133,41 @@ class _BrnAppraiseState extends State<BrnAppraise> {
? EdgeInsets.only(top: 20, bottom: 20)
: EdgeInsets.only(left: 20, top: 16, right: 16, bottom: 20);
return BrnAppraiseHeader(
showHeader: widget.config?.showHeader ?? true,
headerType: widget.headerType ?? BrnAppraiseHeaderType.spaceBetween,
showHeader: widget.config.showHeader,
headerType: widget.headerType,
title: widget.title ?? '',
maxLines: widget.config?.titleMaxLines ?? 1,
headPadding: widget.config?.headerPadding ?? defaultPadding,
cancelCallBack: widget.config?.onCancel,
maxLines: widget.config.titleMaxLines,
headPadding: widget.config.headerPadding ?? defaultPadding,
cancelCallBack: widget.config.onCancel,
);
}

/// 获取评分组件
Widget _getIconWidget() {
if (widget.type == BrnAppraiseType.Emoji) {
return BrnAppraiseEmojiListView(
indexes: widget.config?.indexes,
indexes: widget.config.indexes,
titles: widget.iconDescriptions,
onTap: (index) {
setState(() {
_appraiseIndex = index;
});
if (widget.config?.iconClickCallback != null) {
widget.config.iconClickCallback(index);
if (widget.config.iconClickCallback != null) {
widget.config.iconClickCallback!(index);
}
},
);
} else {
return BrnAppraiseStarListView(
count: widget.config?.count ?? 5,
count: widget.config.count,
titles: widget.iconDescriptions,
hint: widget.config?.starAppraiseHint,
hint: widget.config.starAppraiseHint,
onTap: (index) {
setState(() {
_appraiseIndex = index;
});
if (widget.config?.iconClickCallback != null) {
widget.config.iconClickCallback(index);
if (widget.config.iconClickCallback != null) {
widget.config.iconClickCallback!(index);
}
},
);
Expand All @@ -209,12 +191,12 @@ class _BrnAppraiseState extends State<BrnAppraise> {
return choice.name;
},
// tagStyle: BrnMultiSelectStyle.auto,
multiSelect: widget.config?.multiSelect ?? true,
brnCrossAxisCount: widget.config?.tagCountEachRow ?? 2,
multiSelect: widget.config.multiSelect,
brnCrossAxisCount: widget.config.tagCountEachRow,
selectedTagsCallback: (list) {
_selectedTag = tag2String(list);
if (widget.config?.tagSelectCallback != null) {
widget.config.tagSelectCallback(_selectedTag);
if (widget.config.tagSelectCallback != null) {
widget.config.tagSelectCallback!(_selectedTag);
}
},
),
Expand All @@ -223,22 +205,22 @@ class _BrnAppraiseState extends State<BrnAppraise> {

/// 输入框
Widget _inputArea() {
if (widget.config?.showTextInput ?? true) {
if (widget.config.showTextInput) {
return Padding(
padding: EdgeInsets.only(top: 24),
child: BrnInputText(
maxLength: widget.config?.maxLength ?? 100,
maxLength: widget.config.maxLength,
bgColor: Color(0xfff8f8f8),
hint: widget.inputHintText ?? '',
textString: _inputText ?? '',
maxHeight: widget.config?.inputMaxHeight ?? 120,
textString: (_inputText ?? widget.config.inputDefaultText) ?? '',
maxHeight: widget.config.inputMaxHeight,
minHeight: 40,
maxHintLines: widget.config?.maxHintLines ?? 1,
maxHintLines: widget.config.maxHintLines,
padding: EdgeInsets.all(12),
onTextChange: (input) {
_inputText = input;
if (widget.config?.inputTextChangeCallback != null) {
widget.config.inputTextChangeCallback(input);
if (widget.config.inputTextChangeCallback != null) {
widget.config.inputTextChangeCallback!(input);
}
},
),
Expand All @@ -249,16 +231,17 @@ class _BrnAppraiseState extends State<BrnAppraise> {

/// 提交按钮
Widget _confirmButton() {
if (widget.config?.showConfirmButton ?? true) {
if (widget.config.showConfirmButton) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: BrnBigMainButton(
title: widget.config?.confirmButtonText ?? '提交',
title: widget.config.confirmButtonText,
isEnable: _enable ?? _appraiseIndex != -1,
onTap: () {
if (_enable ?? _appraiseIndex != -1) {
if (widget.onConfirm != null) {
widget.onConfirm(_appraiseIndex, _selectedTag, _inputText);
widget.onConfirm!(
_appraiseIndex, _selectedTag, _inputText ?? '');
}
}
},
Expand All @@ -269,115 +252,21 @@ class _BrnAppraiseState extends State<BrnAppraise> {
return Container();
}

List<BrnTagItemBean> string2Tag(List<String> tags) {
List<BrnTagItemBean> items = List();
List<BrnTagItemBean> string2Tag(List<String>? tags) {
List<BrnTagItemBean> items = [];
if (tags?.isNotEmpty ?? false) {
for (int i = 0; i < tags.length; i++) {
for (int i = 0; i < tags!.length; i++) {
items.add(BrnTagItemBean(name: tags[i], code: tags[i], index: i));
}
}
return items;
}

List<String> tag2String(List<BrnTagItemBean> tags) {
List<String> result = List();
tags?.forEach((item) {
List<String> result = [];
tags.forEach((item) {
result.add(item.name);
});
return result;
}
}

class BrnAppraiseConfig {
/// 是否显示标题和关闭
final bool showHeader;

/// 标题的padding
final EdgeInsets headerPadding;

/// 标题的最大行数
final int titleMaxLines;

/// 取消的回调
final BrnAppraiseCloseClickCallBack onCancel;

/// 所需表情包的index列表,index最大值为4
final List<int> indexes;

/// 展示的星星的数目
final int count;

/// 展示星星时的默认提示
final String starAppraiseHint;

/// 标签是否支持多选,默认为 true
final bool multiSelect;

/// 每行能显示的tag数目,默认为 2
final int tagCountEachRow;

///是否显示输入框,默认为 true
final bool showTextInput;

///输入框允许输入的最大长度,默认为 100
final int maxLength;

///提示文案的最大行数,默认为1
final int maxHintLines;

/// 输入框默认输入文案
final String inputDefaultText;

/// 输入框的最大高度,默认为 120
final double inputMaxHeight;

/// 是否显示确认按钮
final bool showConfirmButton;

/// 确认按钮的文案
final String confirmButtonText;

/// 外部控制提交button的enable状态,null有效,不设置默认值
final bool isConfirmButtonEnabled;

/// 点击icon的回调
final BrnAppraiseIconClick iconClickCallback;

/// 输入框改变的回调
final BrnInputTextChangeCallback inputTextChangeCallback;

/// 选择标签的回调
final BrnAppraiseTagClick tagSelectCallback;

const BrnAppraiseConfig({
this.showHeader = true,
this.headerPadding,
this.titleMaxLines = 1,
this.onCancel,
this.indexes = const [0, 1, 2, 3, 4],
this.count = 5,
this.starAppraiseHint = '',
this.multiSelect = true,
this.tagCountEachRow = 2,
this.showTextInput = true,
this.maxLength = 100,
this.maxHintLines = 1,
this.inputDefaultText,
this.inputMaxHeight = 120,
this.showConfirmButton = true,
this.confirmButtonText = '提交',
this.isConfirmButtonEnabled,
this.iconClickCallback,
this.inputTextChangeCallback,
this.tagSelectCallback,
});
}

/// 评价组件类型
enum BrnAppraiseType {
/// 表情包评价组件
Emoji,

/// 星星评价组件
Star,
}
Loading

0 comments on commit c6a6847

Please sign in to comment.