加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录

以下列出的是本课涉及的文件。

RegisterFirst.dart

import 'package:flutter/material.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:flutter_jdshop/widget/JdText.dart';
import '../config/Config.dart';
import 'package:dio/dio.dart';
import 'package:fluttertoast/fluttertoast.dart';
class RegisterFirstPage extends StatefulWidget {
RegisterFirstPage({Key key}) : super(key: key); _RegisterFirstPageState createState() => _RegisterFirstPageState();
} class _RegisterFirstPageState extends State<RegisterFirstPage> {
String tel; sendCode() async{
RegExp reg=new RegExp(r"^1\d{10}$");
if(reg.hasMatch(this.tel)){
print("正确");
var api='${Config.domain}api/sendCode';
var responses=await Dio().post(api,data:{"tel":this.tel});
if(responses.data["success"]){
print(responses); //演示期间服务器直接返回给手机发送的验证码
Navigator.pushNamed(context, '/RegisterSecond',arguments: {
"tel":this.tel
}); }else{
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}else{
Fluttertoast.showToast(
msg: "手机号格式不对",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('用户注册-第一步'),
),
body: Container(
padding: EdgeInsets.all(ScreenAdapter.width()),
child: ListView(
children: <Widget>[
SizedBox(height: ),
JdText(
text: "请输入手机号",
// password: true,
onChanged: (value) {
this.tel=value;
// print(value);
},
),
SizedBox(height: ),
JdButton(
text: "下一步",
color: Colors.red,
cb:sendCode
)
],
),
),
);
}
}

RegisterSecond.dart

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:flutter_jdshop/widget/JdText.dart';
import 'dart:async'; import 'package:fluttertoast/fluttertoast.dart'; class RegisterSecondPage extends StatefulWidget {
Map arguments;
RegisterSecondPage({Key key, this.arguments}) : super(key: key); _RegisterSecondPageState createState() => _RegisterSecondPageState();
} class _RegisterSecondPageState extends State<RegisterSecondPage> {
String tel;
bool sendCodeBtn = false;
int seconds = ;
String code;
@override
void initState() {
super.initState();
this.tel = widget.arguments["tel"];
this._showTimer();
} //
_showTimer() {
print("执行倒计时");
print(this.sendCodeBtn);
Timer t;
t = Timer.periodic(Duration(microseconds: ), (timer) {
setState(() {
this.seconds--;
});
if (this.seconds == ) {
t.cancel(); //清除定时器:
setState(() {
this.sendCodeBtn = true;
});
}
});
} //重新发送验证码:
sendCode() async {
setState(() {
this.sendCodeBtn = false;
this.seconds = ;
this._showTimer();
});
var api = '${Config.domain}api/sendCode';
var responses = await Dio().post(api, data: {"tel": this.tel});
if (responses.data["success"]) {
print(responses); //演示期间服务器直接返回给手机发送的验证码
print(this.sendCodeBtn);
} else {
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
} validateCode() async {
var api = '${Config.domain}api/validateCode';
var responses =
await Dio().post(api, data: {"tel": this.tel, "code": this.code});
if (responses.data["success"]) {
print(responses);
Navigator.pushNamed(context, '/RegisterThird');
} else {
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('用户注册-第二步'),
),
body: Container(
padding: EdgeInsets.all(ScreenAdapter.width()),
child: ListView(
children: <Widget>[
Container(
margin: EdgeInsets.all(),
child: Text("请输入${this.tel}手机收到的验证码"),
),
Stack(
children: <Widget>[
JdText(
text: "请输入验证码",
// password: true,
onChanged: (value) {
print(value);
this.code = value;
},
),
Positioned(
right: ,
top: ,
child: this.sendCodeBtn? RaisedButton(
child: Text("重新${this.sendCodeBtn}发送"),
onPressed: this.sendCode,
): RaisedButton(
child: Text('${this.seconds}秒后重发'),
onPressed: () {},
),
)
],
),
SizedBox(height: ),
JdButton(
text: "下一步",
color: Colors.red,
cb: validateCode,
)
],
),
),
);
}
}
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:flutter_jdshop/widget/JdText.dart';
import 'dart:async'; import 'package:fluttertoast/fluttertoast.dart'; class RegisterSecondPage extends StatefulWidget {
Map arguments;
RegisterSecondPage({Key key, this.arguments}) : super(key: key); _RegisterSecondPageState createState() => _RegisterSecondPageState();
} class _RegisterSecondPageState extends State<RegisterSecondPage> {
String tel;
bool sendCodeBtn = false;
int seconds = ;
String code;
@override
void initState() {
super.initState();
this.tel = widget.arguments["tel"];
this._showTimer();
} //
_showTimer() {
print("执行倒计时");
print(this.sendCodeBtn);
Timer t;
t = Timer.periodic(Duration(microseconds: ), (timer) {
setState(() {
this.seconds--;
});
if (this.seconds == ) {
t.cancel(); //清除定时器:
setState(() {
this.sendCodeBtn = true;
});
}
});
} //重新发送验证码:
sendCode() async {
setState(() {
this.sendCodeBtn = false;
this.seconds = ;
this._showTimer();
});
var api = '${Config.domain}api/sendCode';
var responses = await Dio().post(api, data: {"tel": this.tel});
if (responses.data["success"]) {
print(responses); //演示期间服务器直接返回给手机发送的验证码
print(this.sendCodeBtn);
} else {
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
} validateCode() async {
var api = '${Config.domain}api/validateCode';
var responses =
await Dio().post(api, data: {"tel": this.tel, "code": this.code});
if (responses.data["success"]) {
print(responses);
Navigator.pushNamed(context, '/RegisterThird');
} else {
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('用户注册-第二步'),
),
body: Container(
padding: EdgeInsets.all(ScreenAdapter.width()),
child: ListView(
children: <Widget>[
Container(
margin: EdgeInsets.all(),
child: Text("请输入${this.tel}手机收到的验证码"),
),
Stack(
children: <Widget>[
JdText(
text: "请输入验证码",
// password: true,
onChanged: (value) {
print(value);
this.code = value;
},
),
Positioned(
right: ,
top: ,
child: this.sendCodeBtn? RaisedButton(
child: Text("重新${this.sendCodeBtn}发送"),
onPressed: this.sendCode,
): RaisedButton(
child: Text('${this.seconds}秒后重发'),
onPressed: () {},
),
)
],
),
SizedBox(height: ),
JdButton(
text: "下一步",
color: Colors.red,
cb: validateCode,
)
],
),
),
);
}
}

router.dart

import 'package:flutter/material.dart';
import 'package:flutter_jdshop/pages/Login.dart';
import 'package:flutter_jdshop/pages/RegisterFirst.dart';
import 'package:flutter_jdshop/pages/RegisterSecond.dart';
import 'package:flutter_jdshop/pages/RegisterThird.dart';
import 'package:flutter_jdshop/pages/tabs/Cart.dart';
import '../pages/tabs/Tabs.dart'; import '../pages/Search.dart'; import '../pages/ProductList.dart'; import '../pages/ProductContent.dart'; //配置路由
final routes = {
'/': (context) => Tabs(),
'/login': (context) => LoginPage(),
'/RegisterFirst': (context) =>RegisterFirstPage(),
'/RegisterSecond': (context,{arguments}) =>RegisterSecondPage(arguments:arguments),
'/RegisterThird': (context) =>RegisterThirdPage(),
'/search': (context) => SearchPage(),
'/cart': (context) => CartPage(),
'/productList': (context,{arguments}) => ProductListPage(arguments:arguments),
'/productContent': (context,{arguments}) => ProductContentPage(arguments:arguments),
}; //固定写法
var onGenerateRoute = (RouteSettings settings) {
// 统一处理
final String name = settings.name;
final Function pageContentBuilder = routes[name];
if (pageContentBuilder != null) {
if (settings.arguments != null) {
final Route route = MaterialPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
} else {
final Route route =
MaterialPageRoute(builder: (context) => pageContentBuilder(context));
return route;
}
}
};

34 Flutter仿京东商城项目 用户注册 注册流程 POST发送验证码 倒计时功能 验证验证码的更多相关文章

  1. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  2. 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)

    Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...

  3. 36 Flutter仿京东商城项目 用户登录 退出登录 事件广播更新状态

    Login.dart import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.da ...

  4. 33Flutter仿京东商城项目 登录 注册相关页面布局

    加群452892873 下载对应33课文件,运行方法,建好项目,直接替换lib目录 以下列出的是本课涉及的文件. User.dart import 'package:flutter/material. ...

  5. 37 Flutter仿京东商城项目 结算页面布局

    加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...

  6. 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

    Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...

  7. 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址

    CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...

  8. 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播

    加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...

  9. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器

    加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...

随机推荐

  1. 安装腾讯QQ问题记录

    安装腾讯QQ的时候遇到两个错误,记录一些解决方法 1.安装文件失败,请尝试手动卸载QQ或更改安装目录,再执行安装程序,错误码:0x00008013 问题原因:卸载QQ没有完全卸载,导致文件残留. 如果 ...

  2. RedisTemplate的key默认序列化器问题

    原文:https://blog.csdn.net/skymouse2002/article/details/80736577 redis的客户端换成了spring-boot-starter-data- ...

  3. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  4. Goodbye Microservices: From 100s of problem children to 1 superstar

    https://segment.com/blog/goodbye-microservices/ Unless you’ve been living under a rock, you probably ...

  5. 用来遍历map集合的方法

    map集合是以键值对进行存储值的,所以遍历map集合无非就是获取键和值,根据实际需求,进行获取键和值. 1.无非就是通过map.keySet()获取到值,然后根据键获取到值. for(String s ...

  6. Java下的tinylog日志打印

    做个笔记. 做某个功能时需要DEBUG调试日志,但是直接System.out.println 是打印在终端,有些情况下是看不到输出的,所以需要用日志框架去打印输出值. 经过搜索完以后发现Logback ...

  7. redis危险命令

    KEYS 单行遍历,速度很慢很占执行时间,对单核来说,极有可能导致执行完后处理不过来这段时间堆积的任务量,导致雪崩. FLUSHALL FLUSHDB CONFIG 今晚搜索kombu用的key,用了 ...

  8. MySQL 计算时间差函数 TIMESTAMPDIFF、DATEDIFF

    一.TIMESTAMPDIFF 支持天.小时.秒等 selet TIMESTAMPDIFF(hour,odl_time,now()); 计算old_time与现在时间的小时差. 二.DATEDIFF ...

  9. 数据库删除数据 truncate 与 delete

    delete from table where 直接删除表中的某一行数据,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.所以delete相比较truncate更加占用资源,数据 ...

  10. jQuery相关方法3----动画相关

    一.显示和隐藏 show(参数1,参数2)方法和hide(参数1,参数2)方法,动画效果显示和隐藏 参数1是时间,单位毫秒(1000毫秒=1秒),也可以是 "slow"" ...