这个暂时不维护了,如果需要监听页面的生命周期,来看这个把
Flutter——这一次真的是监听了页面生命周期
刚开始接触flutter,发现flutter中对页面
这个概念的支持并不是很好,并且现有的onResume解决方案用起来都不是很方便,所以自己构建了FlutterPage来解决一些需求。
package地址:https://pub.dev/packages/flutter_page
github地址:https://github.com/lp0int/flutter_page
FlutterPage使用指南
关于FlutterPage的思考
在flutter里面,没有类似于传统Native开发的Activity
,ViewController
的概念,所有的内容都是Widget
,这样的模式带来的弊端就是加大了我们对页面管理的能力
已有的功能支持
-
数据绑定
在FlutterPage里不在需要setState来更新数据,data和page已经绑定了,修改data.xxx就可以直接反映到View中。 -
生命周期
create()
页面创建时调用,等同于initStatedestroy()
页面销毁时调用,等同于disposeonHide()
打开新的页面后,当前页面会调用onResume()
打开的新页面关闭后会调用didChangeAppLifecycleState(AppLifecycleState)
WidgetsBindingObserver的生命周期,文档
onResume和onHide的实现思路
Flutter并没有onResume这个生命周期,现在有的第三方实现很多也都是调用Navigator的回调或者是监听路由然后用Route#settings里的属性来实现。在实际使用的时候多少都会有限制或者不执行的问题。
在FlutterPage中,维护一个长度最多为 100 的FlutterPage类型的堆栈,当新的FlutterPage被创建了,先调用栈顶的FlutterPage对象执行onHide方法,然后再把新的FlutterPage推入栈顶。当FlutterPage被销毁了,先移除栈顶的对象,在去获取新的栈顶对象,并执行其onResume()方法
使用
Step 1
FlutterPage不对外暴露setState()
方法,而是采用了Provider来进行状态同步,所以需要先实现一个继承自ChangeNotifier
的类来管理需要动态改变的数据,并且在属性的set方法中调用notifyListeners()
方法来通知页面改变。
class PageData extends ChangeNotifier {
String _name = "initData";
String get name => _name;
set name(String value) {
_name = value;
notifyListeners();
}
}
之后就可以直接创建继承自FlutterPage的Page页面了
Step 2
创建一个类,继承自FlutterPage,FlutterPage的泛型指定为第一步我们实现的类
class StatefulPageDemo extends FlutterPage<PageData> {
@override
PageData get data => new PageData();
@override
Widget build(BuildContext context, PageData data) {
return Scaffold(
appBar: AppBar(),
body: RaisedButton(
onPressed: () {
data.name = data.name + "=";
},
child: Text(data.xxx),
),
);
}
@override
String get pageTag => "demo_page";
}
有三个必须要重写的内容,分别是
-
data
页面需要绑定的数据对象,类型为指定的泛型 -
build()
页面的生成方法,需要返回一个Widget对象,并且页面绑定的数据对象会作为参数传进来 -
pageTage
页面的唯一标识