Flutter 之撸一个漂亮的登录界面的总结,Android 性能优化之启动优化实战篇
每个类的名字,相信大家一看就知道对应的作用类。每个类的作用,我在代码里面都有注释,可以去看下代码。
主要用到的控件
利用 Row,Column 沿水平方向或者垂直方向排列子布局
利用 Stack 实现布局层叠,利用 Positioned 控件实现绝对定位
利用 Container 实现装饰效果
利用 TextFormField 实现文本输入,利用 Form 来管理这些 TextFormField
利用 Key 来获取 widget 的状态
利用 InheritedWidget 可以把数据传递给子控件
利用 PageView 和 PageController 实现页面滑动切换
在 pubspec.yaml 中添加依赖
font_awesome_flutter,这个一个 Flutter 的图标库
添加一张登录界面的顶部图片,并声明资源路径。下面的这种写法,会之间把整个文件夹下面的资源都导入应用程序,可以不用一个一个资源地进行声明。
random_pk。这里说一下这个库的作用,一方面是为容器提供随机颜色。另一方面,我觉得可以这个有颜色的容器进行调试布局,这个 RandomContainer 的用法是跟 Container 一样的,只需包裹 child 就可以了。然后你可以通过容器的背景的大小,来判断是否所绘制布局的大小是不是对的,看起来比较直观一些,而且自己可以不用手动的去写 container+color 的那种写法。当你不需要用的时候,再把这一层 RandomContainer 给去掉就可以了。我自己在平时用的时候,发现确实挺有作用的,大家可以拿去试试。
random_pk: anyfont_awesome_flutter: any//省略部分代码 assets:
assets/
代码实现
1.利用代码模板生成代码,新建一个空页面(如果手动打出一段 stateful 的代码是真的麻烦)
class LoginPage extends StatefulWidget {@override_LoginPageState createState() => _LoginPageState();}
class _LoginPageState extends State<LoginPage> {@overrideWidget build(BuildContext context) {return Container();}}
2.根据布局编写代码
这部分没什么好说的,主要是要熟悉一些控件的使用,根据 UI 稿一步一步写出布局就可以了。
例如,输入账号和密码的 TextForm 的实现
/**
创建登录界面的 TextForm/Widget buildSignInTextForm() {return new Container(decoration:new BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(8)), color: Colors.white),width: 300,height: 190,/*
Flutter 提供了一个 Form widget,它可以对输入框进行分组,
然后进行一些统一操作,如输入内容校验、输入框重置以及输入内容保存。*/child: new Form(key: _SignInFormKey,//开启自动检验输入内容,最好还是自己手动检验,不然每次修改子孩子的 TextFormField 的时候,其他 TextFormField 也会被检验,感觉不是很好// autovalidate: true,child: new Column(mainAxisSize: MainAxisSize.min,children: <Widget>[Flexible(child: Padding(padding: const EdgeInsets.only(left: 25, right: 25, top: 20, bottom: 20),child: new TextFormField(//关联焦点 focusNode: emailFocusNode,onEditingComplete: () {if (focusScopeNode == null) {focusScopeNode = FocusScope.of(context);}focusScopeNode.requestFocus(passwordFocusNode);},
decoration: new InputDecoration(icon: new Icon(Icons.email, color: Colors.black,),hintText: "Email Address",border: InputBorder.none),style: new TextStyle(fontSize: 16, color: Colors.black),//验证 validator: (value) {if (value.isEmpty) {return "Email can not be empty!";}},onSaved: (value) {
},),),),new Container(height: 1,width: 250,color: Colors.grey[400],),Flexible(child: Padding(padding: const EdgeInsets.only(left: 25, right: 25, top: 20),child: new TextFormField(focusNode: passwordFocusNode,decoration: new InputDecoration(icon: new Icon(Icons.lock, color: Colors.black,),hintText: "Password",border: InputBorder.none,suffixIcon: new IconButton(icon: new Icon(Icons.remove_red_eye, color: Colors.black,),onPressed: showPassWord)),//输入密码,需要用*****显示 obscureText: !isShowPassWord,style: new TextStyle(fontSize: 16, color: Colors.black),validator: (value) {if (value == null || value.isEmpty || value.length < 6) {return "Password'length must longer than 6!";}},onSaved: (value) {
},),),),
],),),);}
例如,PageView 的实现
PageController _pageController;PageView _pageView;int _currentPage = 0;
@overridevoid initState() {super.initState();_pageController = new PageController();_pageView = new PageView(controller: _pageController,children: <Widget>[new SignInPage(),new SignUpPage(),],onPageChanged: (index) {setState(() {_currentPage = index;});},);}
评论