热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flutter登录和退出登录_Flutter从入门到奔溃(一):撸一个登录界面

Flutter从入门到奔溃(一):撸一个登录界面前记跨平台开发目前有3种途径:ReactNative,Weex,Flutter,至于他们之

Flutter从入门到奔溃(一):撸一个登录界面

前记

跨平台开发目前有3种途径:ReactNative,Weex,Flutter,至于他们之间的区别以及如何取舍,我觉得这在移动端工程师的圈子里已经讨论烂了吧,这里就不赘述了,我就说下我的看法:

千万!千万!!千万!!!不要试图以为你可以踩完weex的坑。

看法完毕,我们来开始接触Flutter吧!

Flutter是谷歌爸爸的新一代开发语音,主打的也是ios以及android两个端,但是不仅仅是局限于这个,Flutter也是谷歌爸爸下一代操作系统的指定开发工具,身为安卓🐶,紧跟谷歌爸爸总是没错的,为此我还是觉得抛弃rn,weex这些es6的,专心投入dart的怀抱(不是因为我讨厌js和css)。

学习指标

因为我比较懒...而且我是项目型驱动的懒鬼,我的学习方式可以总结为:

做项目+踩坑+填坑+踩坑+填坑...+骂娘=掌握一门知识

所以我们用flutter来做一个项目吧!

环境搭建

按照官网教程就可以了,过几天我写个详细点的

基础介绍

我也不是很基础...等我整明白了再出个详细点

weight介绍

同上

登录界面的实现

页面逻辑讲解

870957617161924503.jpg

我们可以看到页面很简洁:

一个logo

一个账号输入框

一个密码输入框

一个登录按钮

现在我们把页面拆解一下:

AppBar

Body

账号框

密码框

登录按钮

可以看到页面主要分为2个层级:

最顶层的(只针对于代码层次的顶层,不包括window之类的层级)为:

AppBar(标题栏)

Body(主体栏)

而Body里面则包含了次级的widgets

具体实现

我们先贴代码,然后进行具体的讲解

import 'package:flutter/material.dart';

class LoginPage extends StatefulWidget {

@override

State createState() {

return new _LoginPageState();

}

}

class _LoginPageState extends State {

var leftRightPadding = 30.0;

var topBottomPadding = 4.0;

var textTips = new TextStyle(fontSize: 16.0, color: Colors.black);

var hintTips = new TextStyle(fontSize: 15.0, color: Colors.black26);

static const LOGO = "images/oschina.png";

var _userPassController = new TextEditingController();

var _userNameController = new TextEditingController();

@override

Widget build(BuildContext context) {

return new Scaffold(

appBar: new AppBar(

title: new Text("登录", style: new TextStyle(color: Colors.white)),

iconTheme: new IconThemeData(color: Colors.white),

),

body: new Column(

mainAxisSize: MainAxisSize.max,

mainAxisAlignment: MainAxisAlignment.start,

children: [

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 50.0, leftRightPadding, 10.0),

child: new Image.asset(LOGO),

),

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 50.0, leftRightPadding, topBottomPadding),

child: new TextField(

style: hintTips,

controller: _userNameController,

decoration: new InputDecoration(hintText: "请输入用户名"),

obscureText: true,

),

),

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 30.0, leftRightPadding, topBottomPadding),

child: new TextField(

style: hintTips,

controller: _userPassController,

decoration: new InputDecoration(hintText: "请输入用户密码"),

obscureText: true,

),

),

new Container(

width: 360.0,

margin: new EdgeInsets.fromLTRB(10.0, 40.0, 10.0, 0.0),

padding: new EdgeInsets.fromLTRB(leftRightPadding,

topBottomPadding, leftRightPadding, topBottomPadding),

child: new Card(

color: Colors.green,

elevation: 6.0,

child: new FlatButton(

onPressed: () {

print("the pass is" + _userNameController.text);

},

child: new Padding(

padding: new EdgeInsets.all(10.0),

child: new Text(

'马上登录',

style:

new TextStyle(color: Colors.white, fontSize: 16.0),

),

)),

),

)

],

));

}

}

现在我们可以看到整个的布局了,怎么说呢...对于一个写习惯了android的人来说,这种代码风格还真的是适应不了,特别是一串一串一串的 ),)),]})},说实在的,我很怀念xml,甚至是kotlin。

整个页面的基础

因为页面的需要变动的,所以我们使用了**StatefulWidget *,而StatefulWidget 与StatelessWidget *的区别,请看我之前的博文。

在State的build方法中,我们开始进行页面的构建:

@override

Widget build(BuildContext context) {

return new Scaffold(

appBar:new AppBar(),

body:new Column(),

)

}

其中AppBar放导航信息,

Body放主体信息,

主体子widgets的构建

body: new Column(

mainAxisSize: MainAxisSize.max,

mainAxisAlignment: MainAxisAlignment.start,

children: [

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 50.0, leftRightPadding, 10.0),

child: new Image.asset(LOGO),

),

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 50.0, leftRightPadding, topBottomPadding),

child: new TextField(

style: hintTips,

controller: _userNameController,

decoration: new InputDecoration(hintText: "请输入用户名"),

obscureText: true,

),

),

new Padding(

padding: new EdgeInsets.fromLTRB(

leftRightPadding, 30.0, leftRightPadding, topBottomPadding),

child: new TextField(

style: hintTips,

controller: _userPassController,

decoration: new InputDecoration(hintText: "请输入用户密码"),

obscureText: true,

),

),

new Container(

width: 360.0,

margin: new EdgeInsets.fromLTRB(10.0, 40.0, 10.0, 0.0),

padding: new EdgeInsets.fromLTRB(leftRightPadding,

topBottomPadding, leftRightPadding, topBottomPadding),

child: new Card(

color: Colors.green,

elevation: 6.0,

child: new FlatButton(

onPressed: () {

print("the pass is" + _userNameController.text);

},

child: new Padding(

padding: new EdgeInsets.all(10.0),

child: new Text(

'马上登录',

style:

new TextStyle(color: Colors.white, fontSize: 16.0),

),

)),

),

)

],

));

页面布局看得是真糟心...此时我又很怀念xml了...

页面从头到底我用白话文梳理一下:

一个从头开始排列的铺满父布局的数值排列的多布局父控件里面有一串子Widgets

第一个子Widgets是一个img Widgets,他被padding Widgets包裹着,以便于让它得到padding的属性

第二个子Widgets是一个TextFidld Widgets(Android佬们可以把他看成EditText),它也被padding Widgets包裹着,提供了四边的padding,同时它还通过InputDecoration设置了hint,通过controller设置了controller

第三个子Widgets同上,理论上应该抽取公共方法,第二个第三个不应该是copy过去的

第四个Widgets是一个FlatButton(实际上它上面还包裹着两个Widgets),它通过被Container包裹得到了宽高padding,margin的属性;通过被card包裹得到了阴影的属性。

至此布局完毕,总结一下:

第一次写觉得很麻烦,特别麻烦!

第二次写觉得还行,就是)){{{}}}看得眼睛痛

第三次写觉得...挖草,神经病啊

第四次写觉得...生活啊,反抗不了,你qj我吧

第五次写觉得...咦,用着感觉还有点点激动

第六次写觉得,好像还挺方便

... ...

第N次,爽!老子才不要xml。

页面交互

这个页面交互不多,无非2个:

拿到TextField的值

相应FlatButton的点击

嗯...我找不到id,也找不到findViewById,也找不到String mAccount=mEdLoginAccout.getText.toString()... 扑街...

不过还记得我们刚刚定义的TextEditingController吗?操作TextField一般都是通过操控Controller来实现的,而我们最简单最常用的就是

TextEditingController.text

// 等于EditText.getText()

而点击事件可以使用onPressed()

onPressed: () {

print("the pass is" + _userNameController.text);

},

总结

一不小心又水了一篇,没啥干货,因为我也是初学,边学边记录

Flutter挺不错的,至少渲染方式不是跟weex(巨坑的!!!)和rn一样,而是走自己的一套,这点我很看好,因为其实rn和weex的体验并不是特别好

Flutter的listview在我的mx5上会有卡顿,我不知道是我没有优化好代码还是怎么样...我先马克,带着这个问题继续学习

干巴爹



推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
author-avatar
lylmwt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有