Flutter 入门(简单登录功能)
本篇博客记录Flutter实现简单登录功能,主要熟悉Flutter控件的使用,与路由的基本用法。
构建两个页面,分别是login
、home
页面
- login页面主要吧包括一个图片下面两个输入框和一个登录按钮。
- home页面只是包括一个按钮用来返回login页面
用到的控件
- Image
- ListView
- Text
- SizedBox
- RaisedButton
实现
在pubspec.yaml导入一些需要用到的图标和字体库
cupertino_icons: ^0.1.2
flutter_screenutil: ^0.7.0
font_awesome_flutter: ^8.8.1
english_words: ^3.1.5
在根目录新建images文件夹并且吧图片放进去如图
在pubspec.yaml中添加路径,解开注释assets,(Flutter用到的本地图片都需要在yaml文件中进行配置)如图
主要知识点
- TextEditingController 用来操作 TextField。获取到TextField的内容在点击登录的时候判断输入的是否正确,正确就进行调整,错误不跳转并弹出账号或密码错误提示框。
- ListView 实现列表显示,Flutter中给我们提供了ListView,不过就目前的体验来看,性能跟原生的ListView或RecycleView比还是有一点差距的。滑动起来还是略卡。
- SizedBox 能强制子控件具有特定宽度、高度或两者都有,使子控件设置的宽高失效
- RaisedButton onPressed是返回单击回调
- Navigator
Navigator
是一个路由管理的组件,它提供了打开和退出路由页方法。Navigator
通过一个栈来管理活动路由集合。通常当前屏幕显示的页面就是栈顶的路由。Navigator
提供了一系列方法来管理路由栈,在此我们只介绍其最常用的两个方法:
Future push(BuildContext context, Route route)
将给定的路由入栈(即打开新的页面),返回值是一个Future
对象,用以接收新路由出栈(即关闭)时的返回数据。
bool pop(BuildContext context, [ result ])
将栈顶路由出栈,result
为页面关闭时返回给上一个页面的数据。
其余内容在代码中已有注释
入口文件main文件
import 'package:flutter/material.dart';
import 'Login/login.dart';
void main() => runApp(Login());
新建login
页面
具体内容空源码中注释
import 'package:english_words/english_words.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'home.dart';
TextEditingController _phone = TextEditingController();
TextEditingController _pass = TextEditingController();
class Login extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
final wordPair = new WordPair.random();
return MaterialApp(
title: 'Welcome to Flutter',
home: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: new ListView(children: <Widget>[
new Image.asset('images/lake.jpg',
width: 200.0, height: 200.0, fit: BoxFit.cover),
textview(),
endtitext(),
password(),
button()
])),
);
}
}
class textview extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Center(
child: Text(
'Hell Flutter',
style: TextStyle(fontSize: 36.0),
),
);
// return ;
}
}
class endtitext extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Center(
child: SizedBox(
width: 300.0,
child: new TextField(
inputFormatters:[WhitelistingTextInputFormatter.digitsOnly],//只允许输入数字
maxLength: 11, //最大长度,设置此项会让TextField右下角有一个输入数量的统计字符串
maxLines: 1, //最大行数
decoration: InputDecoration(
labelText: '请输入手机号',
//设置输入框前面有一个电话的按钮 suffixIcon
prefixIcon: Icon(Icons.phone),
labelStyle: TextStyle(
fontSize: 14,
color: Colors.grey,
),
),
//绑定控制器
controller: _phone,
//内容改变的回调
onChanged: (value) {
StepState() {
_phone.text = value;
}
},
)),
);
}
}
class password extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Center(
child: SizedBox(
width: 300.0,
child: new TextField(
maxLength: 6, //最大长度,设置此项会让TextField右下角有一个输入数量的统计字符串
maxLines: 1, //最大行数
obscureText: true, //是否是密码
decoration: InputDecoration(
labelText: '请输入密码',
prefixIcon: Icon(Icons.lock_outline),
labelStyle: TextStyle(
fontSize: 14,
color: Colors.grey,
)),
controller: _pass,
onChanged: (value) {
StepState() {
_pass.text = value;
}
},
),
),
);
}
}
class button extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Column(
children: <Widget>[
RaisedButton(
child: Text('登录'),
onPressed: () {
print(_phone.text);
print(_pass.text);
if (_phone.text == '12345678910' && _pass.text == '123') {
Navigator.push(
context, MaterialPageRoute(builder: (context) => home()));
} else {
print('账号或密码错误');
}
},
),
],
);
}
}
新建home页面
import 'package:flutter/material.dart';
class home extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
title: 'Welcome to Flutter',
home: Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: new Center(
//onPressed 点击事件
child: new RaisedButton(
child: new Text("点我回登录页面"),
onPressed: () {
//回到上一个页面 相当于finsh
Navigator.pop(context);
}),
),
),
);
}
}
结束
学习Flutter第一天,继续加油