You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.5 KiB
170 lines
5.5 KiB
2 years ago
|
|
||
|
import 'package:flutter/cupertino.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:flutter/services.dart';
|
||
|
|
||
|
|
||
|
typedef TextInputChangeCallBack = Function(String text);
|
||
|
|
||
|
// ignore: must_be_immutable
|
||
|
class InputView extends StatefulWidget {
|
||
|
final TextEditingController? controller;
|
||
|
|
||
|
final EdgeInsetsGeometry padding;
|
||
|
final EdgeInsetsGeometry margin;
|
||
|
final String? hint;
|
||
|
final TextStyle textStyle;
|
||
|
final TextStyle hintStyle;
|
||
|
final Color cursorColor;
|
||
|
final TextInputType keyboardType;
|
||
|
final int? maxLength;
|
||
|
final FocusNode? focusNode;
|
||
|
final TextInputChangeCallBack? onValueChanged;
|
||
|
final TextInputChangeCallBack? onBeginInput;
|
||
|
final TextInputChangeCallBack? onInputComplete;
|
||
|
final bool showClear;
|
||
|
final int maxLines;
|
||
|
final TextAlign textAlign;
|
||
|
|
||
|
InputView(
|
||
|
{this.controller,
|
||
|
this.padding = const EdgeInsets.symmetric(vertical: 5, horizontal: 8),
|
||
|
this.margin = const EdgeInsets.symmetric(vertical: 0, horizontal: 0),
|
||
|
this.hint = "",
|
||
|
this.textStyle = const TextStyle(color: Colors.black, fontWeight: FontWeight.w300),
|
||
|
this.hintStyle = const TextStyle(color: Color(0xFFBDBDBD), fontSize: 16),
|
||
|
this.cursorColor = const Color(0xFFBDBDBD),
|
||
|
this.keyboardType = TextInputType.text,
|
||
|
this.maxLength,
|
||
|
this.focusNode,
|
||
|
this.onValueChanged,
|
||
|
this.showClear = true,
|
||
|
this.textAlign = TextAlign.start,
|
||
|
this.maxLines = 1,
|
||
|
this.onInputComplete,
|
||
|
this.onBeginInput});
|
||
|
|
||
|
@override
|
||
|
State<StatefulWidget> createState() {
|
||
|
return _InputViewState();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class _InputViewState extends State<InputView> {
|
||
|
TextEditingController? _controller;
|
||
|
FocusNode? _focusNode;
|
||
|
|
||
|
@override
|
||
|
void initState() {
|
||
|
_focusNode = widget.focusNode ?? FocusNode();
|
||
|
_controller = widget.controller ?? TextEditingController();
|
||
|
|
||
|
_focusNode!.addListener(() {
|
||
|
setState(() {
|
||
|
|
||
|
});
|
||
|
if (!_focusNode!.hasFocus) {
|
||
|
if (widget.onInputComplete != null) {
|
||
|
widget.onInputComplete!(_controller!.text);
|
||
|
}
|
||
|
} else {
|
||
|
if (widget.onBeginInput != null) {
|
||
|
widget.onBeginInput!(_controller!.text);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
super.initState();
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return GestureDetector(
|
||
|
onTap: () {},
|
||
|
child: Container(
|
||
|
margin: widget.margin,
|
||
|
padding: EdgeInsets.symmetric(horizontal: widget.padding.horizontal),
|
||
|
child: Row(
|
||
|
children: <Widget>[
|
||
|
Expanded(
|
||
|
child: CupertinoTextField(
|
||
|
placeholder: widget.hint,
|
||
|
placeholderStyle: widget.hintStyle,
|
||
|
controller: _controller,
|
||
|
focusNode: _focusNode,
|
||
|
maxLines: widget.maxLines,
|
||
|
keyboardType: widget.keyboardType,
|
||
|
style: widget.textStyle,
|
||
|
inputFormatters: widget.maxLength == null
|
||
|
? null
|
||
|
: [
|
||
|
widget.maxLength == 0 ? FilteringTextInputFormatter.digitsOnly:
|
||
|
LengthLimitingTextInputFormatter(widget.maxLength),
|
||
|
],
|
||
|
cursorColor: widget.cursorColor,
|
||
|
onChanged: widget.onValueChanged,
|
||
|
onEditingComplete: () {},
|
||
|
textAlign: widget.textAlign,
|
||
|
onSubmitted: (_) {
|
||
|
FocusScope.of(context).requestFocus(FocusNode());
|
||
|
},
|
||
|
enableInteractiveSelection: true,
|
||
|
decoration: BoxDecoration(
|
||
|
border: Border.all(
|
||
|
color: Colors.white.withAlpha(0),
|
||
|
width: 0
|
||
|
)
|
||
|
),
|
||
|
// decoration: InputDecoration(
|
||
|
// contentPadding: EdgeInsets.symmetric(vertical: widget.padding.vertical),
|
||
|
// border: InputBorder.none,
|
||
|
// hintText: widget.hint,
|
||
|
// hintStyle: widget.hintStyle),
|
||
|
),
|
||
|
// child: TextField(
|
||
|
// controller: _controller,
|
||
|
// focusNode: _focusNode,
|
||
|
// maxLines: widget.maxLines,
|
||
|
// keyboardType: widget.keyboardType,
|
||
|
// style: widget.textStyle,
|
||
|
// inputFormatters: widget.maxLength == null
|
||
|
// ? null
|
||
|
// : [
|
||
|
// LengthLimitingTextInputFormatter(widget.maxLength),
|
||
|
// ],
|
||
|
// cursorColor: widget.cursorColor,
|
||
|
// onChanged: widget.onValueChanged,
|
||
|
// onEditingComplete: () {},
|
||
|
// textAlign: widget.textAlign,
|
||
|
// onSubmitted: (_) {
|
||
|
// FocusScope.of(context).requestFocus(FocusNode());
|
||
|
// },
|
||
|
// enableInteractiveSelection: true,
|
||
|
// decoration: InputDecoration(
|
||
|
// contentPadding: EdgeInsets.symmetric(vertical: widget.padding.vertical),
|
||
|
// border: InputBorder.none,
|
||
|
// hintText: widget.hint,
|
||
|
// hintStyle: widget.hintStyle),
|
||
|
// ),
|
||
|
),
|
||
|
widget.showClear ? _clearButton() : Container()
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
_clearButton() {
|
||
|
return _focusNode!.hasFocus
|
||
|
? GestureDetector(
|
||
|
child: Icon(
|
||
|
Icons.clear,
|
||
|
size: 15,
|
||
|
color: Colors.grey[300],
|
||
|
),
|
||
|
onTap: () {
|
||
|
_controller!.clear();
|
||
|
})
|
||
|
: Container();
|
||
|
}
|
||
|
}
|