Android开发者应该知道google出了一套管理生命周期的框架,详细的能够移步到这里。在flutter中有没有相似这种库呢?笔者找了挺久没找到,若是有知道的读者麻烦告知一下。java
最后笔者分析了下Android那边的实现原理,而后写了一个flutter的版本,具体细节作了些调整,项目地址:flib_lifecycle。android
下面将介绍如何利用这个项目进行生命周期的管理。git
abstract class LifecycleState<T extends StatefulWidget> extends State<T> implements FLifecycleOwner {
final FLifecycleRegistry _lifecycleRegistry = SimpleLifecycleRegistry();
@override
FLifecycle getLifecycle() {
return _lifecycleRegistry;
}
@override
void initState() {
super.initState();
// 分发[FLifecycleEvent.onCreate]事件
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onCreate);
}
@override
void dispose() {
// 分发[FLifecycleEvent.onDestroy]事件
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onDestroy);
super.dispose();
}
}
复制代码
上面代码中分发事件的写法,也能够写为标记为某种状态,一样能够通知生命周期事件给观察者github
// 分发事件
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.XXX);
// 标记为某种状态
_lifecycleRegistry.markState(FLifecycleState.XXX);
复制代码
class _DemoPageState extends LifecycleState<DemoPage> {
@override
void initState() {
super.initState();
// 添加观察者
getLifecycle().addObserver(_lifecycleListener);
}
void _lifecycleListener(FLifecycleEvent event, FLifecycle lifecycle) {
print('_lifecycleListener: ' + event.toString());
}
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
);
}
}
复制代码
运行后打开此界面,再关闭界面,控制台日志以下:bash
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onCreate
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onDestroy
复制代码
在Android中,Activity还有更多的生命周期事件,好比onStart(),onResume(),onPause(),onStop()等。
那flutter中的State有没有像Android那么详细的生命周期事件呢?很遗憾,没有像Android中那么详细,可是能够尝试实现。markdown
笔者以为至少要有如下几个状态和生命周期:框架
/// 生命周期状态
enum FLifecycleState {
/// 销毁状态
destroyed,
/// 初始化状态
initialized,
/// 建立状态
created,
/// 活动状态
started,
}
/// 生命周期事件
enum FLifecycleEvent {
/// 分发此事件后处于[FLifecycleState.created]状态
onCreate,
/// 分发此事件后处于[FLifecycleState.started]状态
onStart,
/// 分发此事件后处于[FLifecycleState.created]状态
onStop,
/// 分发此事件后处于[FLifecycleState.destroyed]状态
onDestroy,
}
复制代码
有了以上几个状态,才方便后续实现更多的功能,好比处于建立状态的话就中止定时器,处于活动状态从新开始定时器等。
那flutter中的State应该如何分发onStart和onStop事件呢?笔者目前的实现方案以下:ide
class FStateLifecycleAdapter implements FLifecycleOwner, _StateLifecycle {
final FLifecycleRegistry _lifecycleRegistry;
bool _started;
bool _startedMarker;
FStateLifecycleAdapter({FLifecycleRegistry lifecycleRegistry})
: this._lifecycleRegistry = lifecycleRegistry ?? SimpleLifecycleRegistry();
@override
FLifecycle getLifecycle() {
return _lifecycleRegistry;
}
@override
void initState() {
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onCreate);
}
@override
Widget build(BuildContext context) {
if (_startedMarker == null) {
_startedMarker = true;
}
if (_startedMarker) {
_startedMarker = false;
_started = true;
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onStart);
}
return null;
}
@override
void deactivate() {
assert(_startedMarker == false);
final bool expected = !_started;
if (expected) {
_startedMarker = true;
// 等待build
} else {
_started = false;
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onStop);
}
}
@override
void dispose() {
_started = null;
_startedMarker = null;
_lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.onDestroy);
}
}
abstract class _StateLifecycle {
void initState();
Widget build(BuildContext context);
void deactivate();
void dispose();
}
复制代码
abstract class LifecycleState<T extends StatefulWidget> extends State<T> implements FLifecycleOwner {
final FStateLifecycleAdapter _stateLifecycleAdapter = FStateLifecycleAdapter();
@override
FLifecycle getLifecycle() {
return _stateLifecycleAdapter.getLifecycle();
}
@override
void initState() {
super.initState();
_stateLifecycleAdapter.initState();
}
@override
void deactivate() {
super.deactivate();
_stateLifecycleAdapter.deactivate();
}
@override
Widget build(BuildContext context) {
_stateLifecycleAdapter.build(context);
return buildImpl(context);
}
/// 因为须要占用build方法,因此这边从新定了一个buildImpl方法用于返回Widget。
Widget buildImpl(BuildContext context);
@override
void dispose() {
_stateLifecycleAdapter.dispose();
super.dispose();
}
}
复制代码
class _DemoPageState extends LifecycleState<DemoPage> {
@override
void initState() {
super.initState();
getLifecycle().addObserver(_lifecycleListener);
}
void _lifecycleListener(FLifecycleEvent event, FLifecycle lifecycle) {
print('_lifecycleListener: ' + event.toString());
}
@override
Widget buildImpl(BuildContext context) {
return Container(
color: Colors.white,
child: GestureDetector(
child: Text('打开MainPage'),
onTap: () {
Navigator.of(context).pushNamed('MainPage');
},
),
);
}
}
复制代码
日志以下:学习
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onCreate
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStart
复制代码
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStop
复制代码
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStart
复制代码
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStop
I/flutter (26755): _lifecycleListener: FLifecycleEvent.onDestroy
复制代码
后续咱们就能够经过生命周期的监听实现更多的功能, 例如Android中的LiveData,能够设置观察者监听值的变化,生命周期分发销毁事件后自动释放观察者。ui
flutter版本的LiveData笔者已经写好了,有兴趣的读者移步到这里,后面也会专门写一篇文章介绍怎么使用。
文章中没有对flutter中State本来的生命周期作过多的介绍,若是读者须要了解的话,能够去搜索一下,有不少相关的文章。
因为笔者也是刚接触flutter不久,还有不少须要学习的地方,若是文章中有错误的地方,还请读者帮忙指正。
关于这个库,有疑问的,或者须要探讨的能够和笔者联系,你们一块儿学习。 邮箱:565061763@qq.com