{"id":32308286,"url":"https://github.com/chenenyu/lifecycle","last_synced_at":"2026-02-21T07:40:37.335Z","repository":{"id":41265126,"uuid":"297635452","full_name":"chenenyu/lifecycle","owner":"chenenyu","description":"Lifecycle support for Flutter widgets.","archived":false,"fork":false,"pushed_at":"2025-03-28T12:29:04.000Z","size":300,"stargazers_count":57,"open_issues_count":3,"forks_count":9,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-23T07:34:07.699Z","etag":null,"topics":["flutter","lifecycle","navigator","observer","page","route","widget"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/lifecycle","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chenenyu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-22T12:03:31.000Z","updated_at":"2025-04-19T21:44:26.000Z","dependencies_parsed_at":"2024-06-21T04:19:23.461Z","dependency_job_id":"0539d4de-345d-4358-ba3a-ff6e19dcf0ba","html_url":"https://github.com/chenenyu/lifecycle","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/chenenyu/lifecycle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenenyu%2Flifecycle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenenyu%2Flifecycle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenenyu%2Flifecycle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenenyu%2Flifecycle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenenyu","download_url":"https://codeload.github.com/chenenyu/lifecycle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenenyu%2Flifecycle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29676833,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T06:23:40.028Z","status":"ssl_error","status_checked_at":"2026-02-21T06:23:39.222Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flutter","lifecycle","navigator","observer","page","route","widget"],"created_at":"2025-10-23T07:29:14.501Z","updated_at":"2026-02-21T07:40:37.330Z","avatar_url":"https://github.com/chenenyu.png","language":"Dart","readme":"[![Pub Version](https://img.shields.io/pub/v/lifecycle)](https://pub.dev/packages/lifecycle)\n[![pub points](https://img.shields.io/pub/points/lifecycle)](https://pub.dev/packages/lifecycle)\n[![likes](https://img.shields.io/pub/likes/lifecycle)](https://pub.dev/packages/lifecycle)\n![PR](https://img.shields.io/badge/PRs-welcome-blue)\n\n# lifecycle\n\nLifecycle support for Flutter widgets.\n\n### Supported widgets\n\n- [x] `StatefulWidget`.\n- [x] `StatelessWidget`(include `Dialog`).\n- [x] `PageView/TabBarView` and it's children.\n- [x] Nested `PageView`.\n- [x] `Navigator`(Navigator 2.0 pages api).\n- [x] Child of `ListView/GridView/CustomScrollView`.\n\n### Supported lifecycle event\n```dart\nenum LifecycleEvent {\n  push,\n  visible,\n  active,\n  inactive,\n  invisible,\n  pop,\n}\n```\n\n## Getting Started\n\n### Install\n\n1. Depend on it\n\n```yaml\ndependencies:\n  lifecycle: any  # replace 'any' with version number\n```\n\n2. Install it\n\n`flutter pub get`\n\n3. Import it\n\n`import 'package:lifecycle/lifecycle.dart';`\n\n### Usage\n\n**First of all, you should register an observer in `WidgetsApp`/`MaterialApp`, and an observer can only be used by one `Navigator`, if you have your own `Navigator`, please use a new instance of LifecycleObserver.**\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      navigatorObservers: [defaultLifecycleObserver],\n      ...\n    );\n  }\n}\n```\n\n* StatefulWidget\n\n1. Use mixin(Recommend)\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\n// mixin LifecycleAware and LifecycleMixin on State\nclass _State extends State\u003cMyStatefulWidget\u003e with LifecycleAware, LifecycleMixin {\n  @override\n  void onLifecycleEvent(LifecycleEvent event) {\n    print(event);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold();\n  }\n}\n```\n\n2. Use  wrapper\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\n// Wrap widget with LifecycleWrapper\nclass _State extends State\u003cMyStatefulWidget\u003e {\n  @override\n  Widget build(BuildContext context) {\n    return LifecycleWrapper(\n      onLifecycleEvent: (event) {\n        print(event);\n      },\n      child: Scaffold(),\n    );\n  }\n}\n```\n\n* StatelessWidget/Dialog\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\n// Normal StatelessWidget\nclass MyStatelessWidget extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return LifecycleWrapper(\n      onLifecycleEvent: (event) {\n        print(event);\n      },\n      child: Scaffold(),\n    );\n  }\n}\n\n// Dialog\nshowDialog(\n  context: context,\n  routeSettings: RouteSettings(name: 'dialog'),\n  builder: (context) {\n    return LifecycleWrapper(\n      onLifecycleEvent: (event) {\n        print(event);\n      },\n      child: Dialog(),\n    );\n  },\n);\n```\n\n* PageView/TabBarView\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\nclass MyPageView extends StatefulWidget {\n  MyPageView({Key key}) : super(key: key);\n\n  _MyPageViewState createState() =\u003e _MyPageViewState();\n}\n\nclass _MyPageViewState extends State\u003cMyPageView\u003e {\n  PageController _pageController;\n\n  @override\n  void initState() {\n    super.initState();\n    _pageController = PageController();\n  }\n\n  @override\n  void dispose() {\n    _pageController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('MyPageView'),\n      ),\n      // Wrap PageView\n      body: PageViewLifecycleWrapper(\n        child: PageView(\n          controller: _pageController,\n          children: [\n            // Wrap child of PageView\n            ChildPageLifecycleWrapper(\n              index: 0,\n              wantKeepAlive: true,\n              onLifecycleEvent: (event) {\n                print('Page@0#${event.name}');\n              },\n              child: Container(),\n            ),\n            ChildPageLifecycleWrapper(\n              index: 1,\n              wantKeepAlive: true,\n              onLifecycleEvent: (event) {\n                print('Page@1#${event.name}');\n              },\n              child: Container(),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\n```\n\n* Nested PageView\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:lifecycle/lifecycle.dart';\n\nclass NestedPageView extends StatefulWidget {\n  NestedPageView({Key key}) : super(key: key);\n\n  _NestedPageViewState createState() =\u003e _NestedPageViewState();\n}\n\nclass _NestedPageViewState extends State\u003cNestedPageView\u003e with SingleTickerProviderStateMixin {\n  PageController _pageController;\n  TabController _tabController;\n\n  final List\u003cTab\u003e myTabs = \u003cTab\u003e[\n    Tab(text: 'left'),\n    Tab(text: 'right'),\n  ];\n\n  @override\n  void initState() {\n    super.initState();\n    _pageController = PageController();\n    _tabController = TabController(vsync: this, length: myTabs.length);\n  }\n\n  @override\n  void dispose() {\n    _pageController.dispose();\n    _tabController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('NestedPageView'),\n        bottom: TabBar(\n          controller: _tabController,\n          tabs: myTabs,\n        ),\n      ),\n      body: PageViewLifecycleWrapper( // Outer PageView\n        child: TabBarView(\n          controller: _tabController,\n          children: \u003cWidget\u003e[\n            ChildPageLifecycleWrapper(\n              index: 0,\n              wantKeepAlive: true,\n              onLifecycleEvent: (event) {\n                print('OuterPage@0#${event.name}');\n              },\n              child: Container(),\n            ),\n            ChildPageLifecycleWrapper(\n              index: 1,\n              wantKeepAlive: true,\n              onLifecycleEvent: (event) {\n                print('OuterPage@1#${event.name}');\n              },\n              child: PageViewLifecycleWrapper( // Inner PageView\n                child: PageView(\n                  controller: _pageController,\n                  children: [\n                    ChildPageLifecycleWrapper(\n                      index: 0,\n                      wantKeepAlive: false,\n                      onLifecycleEvent: (event) {\n                        log.add('InnerPage@0#${event.name}');\n                      },\n                      child: Container(),\n                    ),\n                    ChildPageLifecycleWrapper(\n                      index: 1,\n                      wantKeepAlive: false,\n                      onLifecycleEvent: (event) {\n                        log.add('InnerPage@1#${event.name}');\n                      },\n                      child: Container(),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\n```\n\n* ListView\n\n```dart\n@override\nWidget build(BuildContext context) {\n  return Scaffold(\n    appBar: AppBar(\n      title: const Text('ListPage'),\n    ),\n    body: ListView.builder(\n      itemCount: _data.length,\n      itemBuilder: (context, index) {\n        return ScrollViewItemLifecycleWrapper(\n          onLifecycleEvent: (LifecycleEvent event) {\n            print('ListPage(item$index)#${event.name}');\n          },\n          wantKeepAlive: false,\n          child: ListTile(\n            title: Text(\n              _data[index],\n            ),\n          ),\n        );\n      },\n    ),\n  );\n}\n```\n\n### Other APIs\n\n* Iterates routes.\n\n```\ndefaultLifecycleObserver.iterateRoutes(bool Function(route) callback);\n```\n\n* Remove a route.\n\n```\ndefaultLifecycleObserver.removeRoute\u003cT\u003e(Route route, [T? result]);\n```\n\n* Dispose a LifecycleObserver when it will never be used.\n\n```\ndefaultLifecycleObserver.dispose();\n```\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenenyu%2Flifecycle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenenyu%2Flifecycle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenenyu%2Flifecycle/lists"}