241 lines
6.9 KiB
Dart
241 lines
6.9 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
|||
|
|
import 'package:flutter_common/utils/customer.dart';
|
|||
|
|
import 'package:flutter_common/value/string.dart';
|
|||
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|||
|
|
|
|||
|
|
///商品文字标题
|
|||
|
|
class GoodsEditeTitleWidget extends StatelessWidget {
|
|||
|
|
final String title;
|
|||
|
|
final TextStyle? style;
|
|||
|
|
final String? hint; //灰色提示
|
|||
|
|
final bool? isRed; //是否有红点
|
|||
|
|
final Widget? rightChild;
|
|||
|
|
final Widget? contentChild;
|
|||
|
|
|
|||
|
|
const GoodsEditeTitleWidget({
|
|||
|
|
super.key,
|
|||
|
|
required this.title,
|
|||
|
|
this.hint,
|
|||
|
|
this.isRed,
|
|||
|
|
this.rightChild,
|
|||
|
|
this.contentChild,
|
|||
|
|
this.style,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return Column(
|
|||
|
|
key: Key(BaseStringValue.cellKeyString(string: title)),
|
|||
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|||
|
|
children: [
|
|||
|
|
Row(
|
|||
|
|
children: [
|
|||
|
|
Text(
|
|||
|
|
title,
|
|||
|
|
style: style ??
|
|||
|
|
CustomerTextStyle(
|
|||
|
|
customerFontSize: 30.sp,
|
|||
|
|
customerFontWeight: FontWeight.bold,
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
isRed == true
|
|||
|
|
? Text(
|
|||
|
|
' * ',
|
|||
|
|
textAlign: TextAlign.start,
|
|||
|
|
style: CustomerTextStyle(
|
|||
|
|
customerColor: Colors.red,
|
|||
|
|
customerFontSize: 20.sp,
|
|||
|
|
customerFontWeight: FontWeight.bold,
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
: const SizedBox(),
|
|||
|
|
Text(
|
|||
|
|
hint ?? '',
|
|||
|
|
textAlign: TextAlign.start,
|
|||
|
|
style: CustomerTextStyle(
|
|||
|
|
customerColor: const Color(0xff777777),
|
|||
|
|
customerFontSize: 24.sp,
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
const Expanded(child: SizedBox()),
|
|||
|
|
rightChild ?? const SizedBox(),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
Padding(
|
|||
|
|
padding: EdgeInsets.only(top: 16.h, bottom: 16.h),
|
|||
|
|
child: contentChild ?? const SizedBox(),
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///
|
|||
|
|
class GoodsEditeContentWidget extends StatelessWidget {
|
|||
|
|
final Widget? child;
|
|||
|
|
final EdgeInsetsGeometry? padding;
|
|||
|
|
final double? borderRadius;
|
|||
|
|
final double? height;
|
|||
|
|
final Color? backColor;
|
|||
|
|
final VoidCallback? onTap;
|
|||
|
|
|
|||
|
|
const GoodsEditeContentWidget({
|
|||
|
|
super.key,
|
|||
|
|
this.child,
|
|||
|
|
this.padding,
|
|||
|
|
this.borderRadius,
|
|||
|
|
this.height,
|
|||
|
|
this.backColor,
|
|||
|
|
this.onTap,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return GestureDetector(
|
|||
|
|
onTap: onTap,
|
|||
|
|
child: Container(
|
|||
|
|
width: double.infinity,
|
|||
|
|
height: height,
|
|||
|
|
padding: padding ?? const EdgeInsets.all(10),
|
|||
|
|
decoration: BoxDecoration(
|
|||
|
|
color: backColor ?? Colors.white,
|
|||
|
|
borderRadius: BorderRadius.circular(borderRadius?.h ?? 30.h),
|
|||
|
|
),
|
|||
|
|
child: child ?? const SizedBox(),
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///输入框
|
|||
|
|
class GoodsEditeTextFiled extends StatefulWidget {
|
|||
|
|
final String? hint;
|
|||
|
|
final TextInputType? keyboardType;
|
|||
|
|
final String? prefixText;
|
|||
|
|
final String? suffixText;
|
|||
|
|
final int? maxLines;
|
|||
|
|
final Function? onChanged;
|
|||
|
|
final String? content;
|
|||
|
|
final double? borderRadius;
|
|||
|
|
final double? height;
|
|||
|
|
final bool? obscureText;
|
|||
|
|
final bool? readOnly;
|
|||
|
|
final Color? backColor;
|
|||
|
|
final int? maxNumberText;
|
|||
|
|
final bool? hadOver; //是否必须输入才返回,默认是false
|
|||
|
|
final TextInputAction? textInputAction;
|
|||
|
|
final TextAlign? textAlign;
|
|||
|
|
|
|||
|
|
const GoodsEditeTextFiled({
|
|||
|
|
super.key,
|
|||
|
|
this.hint,
|
|||
|
|
this.keyboardType,
|
|||
|
|
this.prefixText,
|
|||
|
|
this.suffixText,
|
|||
|
|
this.maxLines,
|
|||
|
|
this.onChanged,
|
|||
|
|
this.content,
|
|||
|
|
this.borderRadius,
|
|||
|
|
this.obscureText = false,
|
|||
|
|
this.height,
|
|||
|
|
this.readOnly = false,
|
|||
|
|
this.backColor,
|
|||
|
|
this.maxNumberText,
|
|||
|
|
this.hadOver = false,
|
|||
|
|
this.textInputAction,
|
|||
|
|
this.textAlign,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
State<GoodsEditeTextFiled> createState() => _GoodsEditeTextFiledState();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class _GoodsEditeTextFiledState extends State<GoodsEditeTextFiled> {
|
|||
|
|
TextEditingController controller = TextEditingController();
|
|||
|
|
FocusNode focusNode = FocusNode();
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
void initState() {
|
|||
|
|
controller = TextEditingController(text: widget.content);
|
|||
|
|
super.initState();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return GoodsEditeContentWidget(
|
|||
|
|
padding: EdgeInsets.zero,
|
|||
|
|
backColor: widget.backColor,
|
|||
|
|
borderRadius: widget.borderRadius,
|
|||
|
|
height: widget.height,
|
|||
|
|
child: Stack(
|
|||
|
|
alignment: Alignment.bottomRight,
|
|||
|
|
children: [
|
|||
|
|
TextField(
|
|||
|
|
textAlign: widget.textAlign ?? TextAlign.start,
|
|||
|
|
controller: controller,
|
|||
|
|
focusNode: focusNode,
|
|||
|
|
maxLength: widget.maxNumberText,
|
|||
|
|
// textInputAction: TextInputAction.done,
|
|||
|
|
maxLines: widget.maxLines,
|
|||
|
|
style: CustomerTextStyle(
|
|||
|
|
customerFontSize: 28.sp,
|
|||
|
|
),
|
|||
|
|
readOnly: widget.readOnly ?? false,
|
|||
|
|
obscureText: widget.obscureText ?? false,
|
|||
|
|
keyboardType: widget.keyboardType ?? TextInputType.text,
|
|||
|
|
textInputAction: widget.textInputAction ?? TextInputAction.done,
|
|||
|
|
decoration: InputDecoration(
|
|||
|
|
border: const OutlineInputBorder(
|
|||
|
|
///设置边框四个角的弧度
|
|||
|
|
// borderRadius: BorderRadius.all(
|
|||
|
|
// Radius.circular(
|
|||
|
|
// 12.5,
|
|||
|
|
// ),
|
|||
|
|
// ),
|
|||
|
|
borderSide: BorderSide.none,
|
|||
|
|
),
|
|||
|
|
counterText: '',
|
|||
|
|
contentPadding: const EdgeInsets.all(0),
|
|||
|
|
hintText: widget.hint ?? '',
|
|||
|
|
hintStyle: CustomerTextStyle(
|
|||
|
|
customerColor: const Color(0xffAAAAAA),
|
|||
|
|
customerFontSize: 28.sp,
|
|||
|
|
),
|
|||
|
|
prefixText: widget.prefixText ?? ' ',
|
|||
|
|
prefixStyle: CustomerTextStyle(
|
|||
|
|
customerFontSize: 28.sp,
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
onEditingComplete: () {
|
|||
|
|
widget.onChanged?.call(controller.text);
|
|||
|
|
},
|
|||
|
|
onSubmitted: widget.hadOver == true
|
|||
|
|
? (value) {
|
|||
|
|
focusNode.unfocus();
|
|||
|
|
widget.onChanged?.call(value);
|
|||
|
|
}
|
|||
|
|
: (value) {
|
|||
|
|
focusNode.unfocus();
|
|||
|
|
},
|
|||
|
|
onChanged: widget.hadOver == true
|
|||
|
|
? null
|
|||
|
|
: (value) => widget.onChanged?.call(value),
|
|||
|
|
),
|
|||
|
|
widget.maxNumberText == null
|
|||
|
|
? const SizedBox()
|
|||
|
|
: Padding(
|
|||
|
|
padding: EdgeInsets.only(bottom: 20.h, right: 30.w),
|
|||
|
|
child: Text(
|
|||
|
|
'${controller.text.length}/${widget.maxNumberText}',
|
|||
|
|
style: CustomerTextStyle(
|
|||
|
|
customerFontSize: 28.sp,
|
|||
|
|
customerColor: const Color(0xffCCCCCC),
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|