如何用Flutter进行生命周期管理?

发表于:2019-5-21 11:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Sunday1990    来源:掘金

分享:
  前言
  Android开发者应该知道google出了一套管理生命周期的框架,详细的可以移步到这里:https://developer.android.com/topic/libraries/architecture/lifecycle#java。在flutter中有没有类似这种库呢?笔者找了挺久没找到,如果有知道的读者麻烦告知一下。
  最后笔者分析了下Android那边的实现原理,然后写了一个flutter的版本,具体细节做了些调整,项目地址:flib_lifecycle https://github.com/zj565061763/flib_lifecycle
  下面将介绍如何利用这个项目进行生命周期的管理。
  如何分发
  1.首先写一个LifecycleState,用于分发生命周期,如下:
   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();
  }
  }
  上面代码中分发事件的写法,也可以写为标记为某种状态,同样可以通知生命周期事件给观察者
   // 分发事件
  _lifecycleRegistry.handleLifecycleEvent(FLifecycleEvent.XXX);
  // 标记为某种状态
  _lifecycleRegistry.markState(FLifecycleState.XXX);
  继承LifecycleState,如下:
   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,
  );
  }
  }
  运行后打开此界面,再关闭界面,控制台日志如下:
  I/flutter (26755): _lifecycleListener: FLifecycleEvent.onCreate
  I/flutter (26755): _lifecycleListener: FLifecycleEvent.onDestroy
  更多的生命周期事件
  在Android中,Activity还有更多的生命周期事件,比如onStart(),onResume(),onPause(),onStop()等。
  那flutter中的State有没有像Android那么详细的生命周期事件呢?很遗憾,没有像Android中那么详细,但是可以尝试实现。
  笔者觉得至少要有以下几个状态和生命周期:
   /// 生命周期状态
  enum FLifecycleState {
  /// 销毁状态
  destroyed,
  /// 初始化状态
  initialized,
  /// 创建状态
  created,
  /// 活动状态
  started,
  }
  /// 生命周期事件
  enum FLifecycleEvent {
  /// 分发此事件后处于[FLifecycleState.created]状态
  onCreate,
  /// 分发此事件后处于[FLifecycleState.started]状态
  onStart,
  /// 分发此事件后处于[FLifecycleState.created]状态
  onStop,
  /// 分发此事件后处于[FLifecycleState.destroyed]状态
  onDestroy,
  }
  有了以上几个状态,才方便后续实现更多的功能,比如处于创建状态的话就停止定时器,处于活动状态重新开始定时器等。
  那flutter中的State应该如何分发onStart和onStop事件呢?笔者目前的实现方案如下:
  1.写一个适配器,分发State的生命周期,如下:
   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();
  }
   使用适配器改造一下LifecycleState,如下:
   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();
  }
  }
   继承改造后的LifecycleState,如下:
   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');
  },
  ),
  );
  }
  }
  日志如下:
  1.打开DemoPage
   I/flutter (26755): _lifecycleListener: FLifecycleEvent.onCreate
  I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStart
  2.跳转到MainPage
 I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStop
   3.关闭MainPage
 I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStart
  4.关闭DemoPage
   I/flutter (26755): _lifecycleListener: FLifecycleEvent.onStop
  I/flutter (26755): _lifecycleListener: FLifecycleEvent.onDestroy
  后续我们就可以通过生命周期的监听实现更多的功能,
  例如Android中的LiveData,可以设置观察者监听值的变化,生命周期分发销毁事件后自动释放观察者。
  flutter版本的LiveData笔者已经写好了,有兴趣的读者移步到这里,后面也会专门写一篇文章介绍怎么使用。
  结束语
  文章中没有对flutter中State原本的生命周期做过多的介绍,如果读者需要了解的话,可以去搜索一下,有很多相关的文章。

     文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号