flutter 自定义输入框组件

时间:2021-06-13 05:38:16

一、组件分析

ui如下

flutter 自定义输入框组件

根据UI分析我们需要提取哪些是动态的,可以通过传递参数得到不同的结果?

1.左侧icon

2.输入的文本

3.是否是密码框

4.输入框的控制器:如何时时得到输入框的值

二、快速创建自定义组件

vscode中使用快捷键stl快速生成一个无状态组件,

flutter 自定义输入框组件

class CreateMyInput extends StatelessWidget {

    @override
Widget build(BuildContext context) { return Container( ); }
}

为什么这里使用的是一个无状态组件(StatelessWidget)?,这里只是一个纯展示的,给定固定的参数就会返回固定的结果,而不是涉及自定义组件内部状态交互。因此选择无状态组件。

下面是建立好的无状态组件模板

import 'package:flutter/material.dart';


class CreateMyInput extends StatelessWidget {
final iconString;
final placeholder;
final isPassword;
final inputController;
 //接收参数写法:1:
// const CreateMyInput(
// {Key key,
// this.iconString,
// this.placeholder,
// this.isPassword,
// @required this.inputController})
// : super(key: key);
//接收参数写法2:。。这种写法更简洁一点
CreateMyInput({this.iconString,this.placeholder,this.isPassword,this.inputController});
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.fromLTRB(15.0,5,15.0,5),
child: Row(
children: <Widget>[
Image.asset(iconString,width: 25,color:Color(0xff2D4ED1)),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 15),
decoration:BoxDecoration(
border:Border(bottom: BorderSide(width: 0.8,color: Color(0xff2D4ED1))), //底部border
),
padding: EdgeInsets.fromLTRB(0, 0, 5, 0),
child: TextField(
controller: inputController,
decoration: InputDecoration(
hintText: placeholder,
contentPadding: EdgeInsets.fromLTRB(0, 17, 15, 15), //输入框内容部分设置padding,跳转跟icon的对其位置
border:InputBorder.none,
),
obscureText: isPassword, //是否是以星号*显示密码
),
),
)
],
),
);
}
} 

三、外部使用自定义组

import '../base_widgit/create_my_input.dart';

//手机号的控制器

TextEditingController phoneController = TextEditingController();

//密码的控制器

TextEditingController passwordController = TextEditingController();

CreateMyInput(iconString:'images/login_icon_phone.png',placeholder:"请输入手机号",isPassword:false,inputController:phoneController),

注意使用的时候参数需要加类型

获取输入框的值

void _mylogin() async{

    print({'手机号': phoneController, '密码': passwordController.text});
if(phoneController.text == ''){
showToast("请输入手机号码");
return;
}
if(passwordController.text == ''){
showToast("请输入密码");
return;
}
var data= {
'Identifier': phoneController.text,
'Credential': passwordController.text
};
SharedPreferences _prefs = await SharedPreferences.getInstance();
await post('Login/UserLogin',formData:params).then((val){
print('dddddd:>>>>>>>>>>>>>-----------------------------------$val');
_prefs.setString('mobile',phoneController.text);
});
}

注意一些创建布局的方法以及逻辑方法要与Widget build并列

Widget build(BuildContext context) {//..}
void _mylogin() async{//...} Widget _createLogo() {//...}