flutter页面,Flutter页面返回传值

Flutter开发--如何布局?

相对于iOS开发,Flutter的布局更具有灵活性,每个页面设计都不一样,相同页面可选择的布局方式也不一样,如果单纯的说应该如何去布局,我觉得不现实,大家可以参考下 Flutter官方的布局教程 。接下来,笔者,通过项目中的一个页面,来一步一步的拆解布局的流程。整个过程,基本上按照拆解、组件封装、具体布局这三步来的。

创新互联公司成立于2013年,先为乌审等服务建站,乌审等地企业,进行企业商务咨询服务。为乌审企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

根据设计图,可以看出整体可以分成两部分,上面一部分是系统介绍模块,下面一部分是真正的登录内容,因为涉及到叠加,因此考虑用Stack;

系统介绍模块部分:整体也是涉及到叠加,考虑用Stack,分为四部分。最底部渐变色背景用一个contanier,无须指定位置,全视图扩展;载放logo图标在上一层,用Image。最后两个Text同级放在最上层。Image,Text各用Positioned包裹去指定位置。

登录内容模块是最外层是一个Contanier容器,去控制背景色和圆角。然后是一个Column元素,逐行排列。

第一行为Image,

第二行为Text,

第三行可以看成一个小Column,分两块进行布局

第四行可以看成一个小Column,分两块进行布局

第五行可以看作一个TextButton,

第六行可以看作一个Row,分三块进行布局

通过上面这样一步一步的分析后,基本上对大致的布局有了一个了解,最外层的控件大致选对(只要能实现的话,就是复杂度以及效率的问题),然后一步一步的拆解每一行的元素,如果有重复的或者觉得可以封装出来的部分,则进行下一步。

每一行的拆解,大致也是按照这个思路来进行,因此笔者在这里就不做讲解了。

在做到第三第四行的时候,发现这两个很相似,而且设计到一些交互逻辑,笔者就想对第三第四行的这种展示进行封装,觉得今后的布局可能会用到,因此在这一步,可以先把这一块儿抽离出一个控件。利用TextField来实现这种输入操作,具体的实现笔者不再详细的描述了。

经过这一步,整体的规划设计图已经有了,各个组件也都有了,接下来的工作就是组装了。

具体布局设计到一些细节的地方,例如整体Column的居中对齐(crossAxisAlignment)、间隔(Padding或Container包裹,笔者更喜欢用SizedBox占位)、居左居右居中(Align)、点击事件(GestureDetector)以及圆角(BorderRadius)等一些特殊情况。

像第六行row是放在底部的,就可以在第六行前面增加一个Spacer()去填充空白区域。

对文字颜色大小等,可以用TextStyle直接设置。

对于输入框的删除按钮,可以用Offstage这种Flutter特有的控制显示隐藏的控件。

flutter刷新页面的方法

这种方法最常见,但是有些地方引用的话,刷新的成本比较大,刷新的是整个页面,数据太多加载太慢的话,会有闪烁的现象

这种方法类似于iOS中的set方法,通过设置某个属性的时候,去刷新某个控件。在flutter中这种刷新方式,是对上面setState(){}方法的改进,根本的方法还是setState(){},只不过是通过方法去刷新某个控件。如下:

首先在pubspec.yaml中添加provider依赖

下面通过provider来实现一个发送验证码的案例。

创建一个TimerModel文件

页面布局如下:

flutter跳转原生页面后的穿透问题

现象:

flutter页面通过present跳转原生页面后,原生页面上的点击会首先响应下面的flutter页面中的内容(比如按钮什么的)。

这是flutter框架一直存在的一个bug。在github上有相关的issue。

原因推测:

推测是flutter对控制器(或者view)加了分类,重写了控制器的点击事件,用来计算是否在对应的点击位置有flutter响应事件。没有的话再扔出去点击事件。

解决方案1:

在原生控制器中,加入点击事件的几个方法的空实现,用以覆盖flutter框架中的实现:

-(void)touchesBegan:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesMoved:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesCancelled:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesEnded:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

让事件不被flutter截获即可。

解决方案2:

直接切换window的根控制器到原生控制器即可。别忘暂时保存flutter控制器。

在返回时再切换回flutter中。

解决方案3:

在flutter跳转到原生页面之前,在flutter中加上一个蒙层,用来隔绝手势往flutter下面的view传递。原生页面返回flutter时再移除这个蒙层。

flutter页面的绘制和管理

Element管理Widget和RenderObject。

widget保持显示当前的页面状态,当widget产生点击等交互,调用setState()改变element中管理的state,

Flutter页面导航

返回用navigator的pop方法

使用navigator的pushNamed方法push到对应的页面

在导航的目的页面的build方法里用ModalRoute.of(context)方法获取需要的参数:

第二个页面返回到第一个页面的时候如果要带参数,可以使用async异步方法来实现

用navigator的push方法,在页面的初始化方法中传递参数:

flutter 页面的生命周期(转)

转自

在 Flutter 中,有两类常用的 Widget:

在开发过程中,我们经常需要继承它们两来实现自己的 Widget。

一个 StatelessWidget 是不能被改变的,比如: Icon 、 Text 等。

如果你的控件一旦显示,就不需要再做任何的变更,那么你应该使用 StatelessWidget 。

实现一个自己的 StatelessWidget 很简单。

当你看到下面这个例子?时,你就知道它有多简单了。

看,只要在 build() 中返回你的视图就可以了。

一个 StatefulWidget 是有状态的,可变的。

它可以改变自己的外观,以响应用户的操作或者数据的变化。

比如: CheckBox 、 Switch ..

我们之所以能够改变一个 StatefulWidget ,是因为它有一个设置状态的函数:

调用这个函数后,就会触发 StatefulWidget 的视图树重建。

因此,当我们需要一个可交互的,即能根据用户操作或数据变化而改变视图的 Widget 时,那就得用上 StatelessWidget 了。

现在,来创建一个自定义的 StatefulWidget:

从上面的例子中可以看到, StatefulWidget 会要求提供一个含有视图树的 State 。

既然 State 能够控制一个视图的状态,那它肯定会有一系列的生命周期。

上图就是 State 的生命周期图。

网站题目:flutter页面,Flutter页面返回传值
文章位置:https://www.cdcxhl.com/article28/dsidecp.html

成都网站建设公司_创新互联,为您提供网站排名电子商务网站设计公司关键词优化网站维护网站设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站托管运营