flutter实现发送验证码功能

所属分类: 软件编程 / Android 阅读数: 130
收藏 0 赞 0 分享

一个发送验证码的需求:包括限制文本框输入长度和只允许输入数字

按惯例 先上图:

class MyBody extends StatefulWidget {
 @override
 _MyBodyState createState() => _MyBodyState();
}
 
class _MyBodyState extends State<MyBody> {
 bool isButtonEnable=true;  //按钮状态 是否可点击
 String buttonText='发送验证码'; //初始文本
 int count=60;      //初始倒计时时间
 Timer timer;      //倒计时的计时器
 TextEditingController mController=TextEditingController();
 
 void _buttonClickListen(){
 setState(() {
  if(isButtonEnable){   //当按钮可点击时
  isButtonEnable=false; //按钮状态标记
  _initTimer();
 
  return null;   //返回null按钮禁止点击
  }else{     //当按钮不可点击时
//  debugPrint('false');
  return null;    //返回null按钮禁止点击
  }
 });
 }
 
 
 void _initTimer(){
 timer = new Timer.periodic(Duration(seconds: 1), (Timer timer) {
  count--;
  setState(() {
  if(count==0){
   timer.cancel();    //倒计时结束取消定时器
   isButtonEnable=true;  //按钮可点击
   count=60;     //重置时间
   buttonText='发送验证码';  //重置按钮文本
  }else{
   buttonText='重新发送($count)'; //更新文本内容
  }
  });
 });
 }
 
 
 @override
 void dispose() {
 timer?.cancel();  //销毁计时器
 timer=null;
 super.dispose();
 }
 
 
 @override
 Widget build(BuildContext context) {
 return Container(
  child: Column(
//  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
   Container(
    color: Colors.white,
    padding: EdgeInsets.only(left: 10,right: 10),
    child: Row(
     mainAxisAlignment: MainAxisAlignment.spaceBetween,
//     crossAxisAlignment: CrossAxisAlignment.center,
     crossAxisAlignment: CrossAxisAlignment.baseline,
     textBaseline: TextBaseline.ideographic,
     children: <Widget>[
     Text('验证码',style: TextStyle(fontSize: 13,color: Color(0xff333333)),),
     Expanded(
      child: Padding(padding: EdgeInsets.only(left: 15,right: 15,top: 15),
      child: TextFormField(
      maxLines: 1,
      onSaved: (value) { },
      controller: mController,
      textAlign: TextAlign.left,
      inputFormatters: [WhitelistingTextInputFormatter.digitsOnly,LengthLimitingTextInputFormatter(6)],
      decoration: InputDecoration(
       hintText: ('填写验证码'),
       contentPadding: EdgeInsets.only(top: -5,bottom: 0),
       hintStyle: TextStyle(
       color: Color(0xff999999),
       fontSize: 13,
       ),
       alignLabelWithHint: true,
       border: OutlineInputBorder(borderSide: BorderSide.none),
      ),
      ),),
     ),
     Container(
      width: 120,
      child: FlatButton(
      disabledColor: Colors.grey.withOpacity(0.1),  //按钮禁用时的颜色
      disabledTextColor: Colors.white,     //按钮禁用时的文本颜色
      textColor:isButtonEnable?Colors.white:Colors.black.withOpacity(0.2),       //文本颜色
      color: isButtonEnable?Color(0xff44c5fe):Colors.grey.withOpacity(0.1),       //按钮的颜色
      splashColor: isButtonEnable?Colors.white.withOpacity(0.1):Colors.transparent,
      shape: StadiumBorder(side: BorderSide.none),
      onPressed: (){ setState(() {
       _buttonClickListen();
      });},
//      child: Text('重新发送 (${secondSy})'),
      child: Text('$buttonText',style: TextStyle(fontSize: 13,),),
      ),
     ),
     ],
    ),
   ),
   Container(
   width: double.infinity,
   height: 45,
   margin: EdgeInsets.only(top: 50,left: 10,right: 10),
   child: RaisedButton(
    onPressed: () {
    debugPrint('${mController.text}');
    },
    shape: StadiumBorder(side: BorderSide.none),
    color: Color(0xff44c5fe),
    child: Text(
    '下一步',
    style: TextStyle(color: Colors.white,fontSize: 15),
    ),
   ),
   ),
  ],
  ),
 );
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多