持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
widget
在Flutter中万物皆widget,不仅限制于ui组件,像手势检测、app的主题数据传递的theme
Flutter 中是通过 Widget 嵌套 Widget 的方式来构建UI和进行实践处理的
StatefulWidget
实现一个有状态的widget至少需要两个类
///1:StatefulWidget类
///2:State类。StatefulWidget类本身是不变的,但是State类在widget生命周期中始终存在
-
createState()用于创建和StatefulWidget相关的状态,他在StatefulWidget的生命周期可能会多次被调用。
eg:当一个SatatefulWidget同时插入到Widget树的多个位置时,Flutter框架会调用该方法为每一个位置生成一个独立的State实例
StatelessWidget
widget的构造函数应该使用命名参数,在命名参数中必须要传递的添加
required关键字在继承widget时,第一个参数应当是key
如果,widget需要接收子widget,child 或children 参数应当被放在参数列表的最后
widget 的属性应当尽可能的被声明为final,防止被意外改变
State生命周期
一个StatefulWidget类会对应一个State类,表示其对应的StatefulWidget需要维护的状态
当状态改变时,可以手动调用setState()方法通知Flutter框架,让其调用build方法重构widget树,从而达到更新ui的目的
在Widget树中获取到State对象
由于StatefulWidget中的具体逻辑都在State中,所以很多时候需要调用State对象的一些方法来使用
context获取
context对象有一个findAncestorStateOfType()方法
在Flutter中有一个默认的约定:如果StatefulWidget的状态是希望暴露的 ,则提供一个静态的of方法
通过GlobalKey
使用 GlobalKey 开销较大,如果有其他可选方案,应尽量避免使用它。另外,同一个 GlobalKey 在整个 widget 树中必须是唯一的,不能重复
通过RenderObject自定义Widget
状态管理
- widget管理自己的状态
- Widget管理子Widget的状态
- 父widget和子Widget都管理状态
路由管理
MaterialPageRounte 继承自PagerRoute类
表示占有整个屏幕的一个页面
MaterialPageRoute({
WidgetBuilder builder,
RouteSettings settings,
bool maintainState = true,
bool fullscreenDialog = false,
})
-
builder
它的作用是构建路由页面的具体内容
-
settings
包含路由配置信息,如路由名称, 是否为路由首页
-
maintainState:是否要在不可见是释放
-
fullscreenDialog 新的路由页面是否是一个全屏的模态对话框
自定义路由切换可以通过继承自PageRoute
Navigator
Navigator是一个路由管理组件,它提供了打开和退出路由页的方法
-
Future push(BuildContext context,Route route)
将指定的路由入栈,返回值是一个Future 对象,可以用于接新路由出栈时的返回数据
-
bool pop(BuildContext context,[result])
result为关闭时要给下一个页面返回的数据
Navigator.push(BuildContext context, Route route)
//`等价于`
Navigator.of(context).push(Route route)