All Projects → chenenyu → lifecycle

chenenyu / lifecycle

Licence: Apache-2.0 License
Lifecycle support for Flutter widgets.

Programming Languages

dart
5743 projects
swift
15916 projects

Projects that are alternatives of or similar to lifecycle

Vue Page Designer
Vue component for drag-and-drop to design and build mobile website.
Stars: ✭ 702 (+2240%)
Mutual labels:  widget, page
Epage
一款基于schema的可视化页面配置工具
Stars: ✭ 194 (+546.67%)
Mutual labels:  widget, page
uon
🐨 A tiny 200b route change observer.
Stars: ✭ 83 (+176.67%)
Mutual labels:  observer, route
maasta
MAAS Terraform Ansible
Stars: ✭ 132 (+340%)
Mutual labels:  lifecycle
awesome
Configs for awesomeWM
Stars: ✭ 42 (+40%)
Mutual labels:  widget
height-slider
A customisable height slider for Flutter.
Stars: ✭ 15 (-50%)
Mutual labels:  widget
CoMvvmHelper
android mvvm 基础框架,适合日常快速开发。有需要添加的内容或者发现问题可以提 issue。
Stars: ✭ 26 (-13.33%)
Mutual labels:  lifecycle
awesome-widgets
Minimalistic Plasmoid set
Stars: ✭ 60 (+100%)
Mutual labels:  widget
github-profile-card
Simple and easy to use widget with your GitHub profile — No dependencies
Stars: ✭ 98 (+226.67%)
Mutual labels:  widget
awesome-web-styling
Awesome Web Styling with CSS Animation Effects ⭐️
Stars: ✭ 109 (+263.33%)
Mutual labels:  page
MTCircularSlider
A feature-rich circular slider control written in Swift.
Stars: ✭ 118 (+293.33%)
Mutual labels:  widget
slack widgets
An abstraction of the JSON structure needed to create widgets in Slack message attachments
Stars: ✭ 14 (-53.33%)
Mutual labels:  widget
electron-in-page-search
Module to introduce Electron's native in-page search avoiding pitfalls
Stars: ✭ 66 (+120%)
Mutual labels:  page
MockAppMVVM
A sample app structure using the MVVM architecture using Retrofit, Dagger2, LiveData, RxJava, ViewModel and Room.
Stars: ✭ 14 (-53.33%)
Mutual labels:  lifecycle
airoute
*1、Support routing management without context *2、Support 'non-intrusive parameter passing' routing management *3、Airoute that makes you fall in love with routing management
Stars: ✭ 27 (-10%)
Mutual labels:  route
yii2-editable-widget
X-Editable Widget for Yii2
Stars: ✭ 56 (+86.67%)
Mutual labels:  widget
crypto-price-widget
Easily track the price of your favorite crypto in an attractive desktop widget
Stars: ✭ 72 (+140%)
Mutual labels:  widget
SPPerspective
Widgets iOS 14 animation with 3D and dynamic shadow. Customisable transform and duration.
Stars: ✭ 271 (+803.33%)
Mutual labels:  widget
em-beer-manager
Manage your beers with WordPress. Integrates simply with Untappd beer checkins. Great for everyone from home brewers to professional breweries!
Stars: ✭ 15 (-50%)
Mutual labels:  widget
kaptain
👨‍✈️ multi-module navigation on Android has never been so easier!
Stars: ✭ 24 (-20%)
Mutual labels:  navigator

Pub Version pub points likes PR

lifecycle

Lifecycle support for Flutter widgets.

Supported widgets

  • StatefulWidget.
  • StatelessWidget(include Dialog).
  • PageView/TabBarView and it's children.
  • Nested PageView.
  • Navigator(Navigator 2.0 pages api).
  • Child of ListView/GridView/CustomScrollView.

Supported lifecycle event

enum LifecycleEvent {
  push,
  visible,
  active,
  inactive,
  invisible,
  pop,
}

Getting Started

Install

  1. Depend on it
dependencies:
  lifecycle: any  # replace 'any' with version number
  1. Install it

flutter pub get

  1. Import it

import 'package:lifecycle/lifecycle.dart';

Usage

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.

import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [defaultLifecycleObserver],
      ...
    );
  }
}
  • StatefulWidget
  1. Use mixin(Recommend)
import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

// mixin LifecycleAware and LifecycleMixin on State
class _State extends State<MyStatefulWidget> with LifecycleAware, LifecycleMixin {
  @override
  void onLifecycleEvent(LifecycleEvent event) {
    print(event);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold();
  }
}
  1. Use wrapper
import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

// Wrap widget with LifecycleWrapper
class _State extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    return LifecycleWrapper(
      onLifecycleEvent: (event) {
        print(event);
      },
      child: Scaffold(),
    );
  }
}
  • StatelessWidget/Dialog
import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

// Normal StatelessWidget
class MyStatelessWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return LifecycleWrapper(
      onLifecycleEvent: (event) {
        print(event);
      },
      child: Scaffold(),
    );
  }
}

// Dialog
showDialog(
  context: context,
  routeSettings: RouteSettings(name: 'dialog'),
  builder: (context) {
    return LifecycleWrapper(
      onLifecycleEvent: (event) {
        print(event);
      },
      child: Dialog(),
    );
  },
);
  • PageView/TabBarView
import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

class MyPageView extends StatefulWidget {
  MyPageView({Key key}) : super(key: key);

  _MyPageViewState createState() => _MyPageViewState();
}

class _MyPageViewState extends State<MyPageView> {
  PageController _pageController;

  @override
  void initState() {
    super.initState();
    _pageController = PageController();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MyPageView'),
      ),
      // Wrap PageView
      body: PageViewLifecycleWrapper(
        child: PageView(
          controller: _pageController,
          children: [
            // Wrap child of PageView
            ChildPageLifecycleWrapper(
              index: 0,
              wantKeepAlive: true,
              onLifecycleEvent: (event) {
                print('Page@0#${event.toString()}');
              },
              child: Container(),
            ),
            ChildPageLifecycleWrapper(
              index: 1,
              wantKeepAlive: true,
              onLifecycleEvent: (event) {
                print('Page@1#${event.toString()}');
              },
              child: Container(),
            ),
          ],
        ),
      ),
    );
  }
}
  • Nested PageView
import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

class NestedPageView extends StatefulWidget {
  NestedPageView({Key key}) : super(key: key);

  _NestedPageViewState createState() => _NestedPageViewState();
}

class _NestedPageViewState extends State<NestedPageView> with SingleTickerProviderStateMixin {
  PageController _pageController;
  TabController _tabController;

  final List<Tab> myTabs = <Tab>[
    Tab(text: 'left'),
    Tab(text: 'right'),
  ];

  @override
  void initState() {
    super.initState();
    _pageController = PageController();
    _tabController = TabController(vsync: this, length: myTabs.length);
  }

  @override
  void dispose() {
    _pageController.dispose();
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('NestedPageView'),
        bottom: TabBar(
          controller: _tabController,
          tabs: myTabs,
        ),
      ),
      body: PageViewLifecycleWrapper( // Outer PageView
        child: TabBarView(
          controller: _tabController,
          children: <Widget>[
            ChildPageLifecycleWrapper(
              index: 0,
              wantKeepAlive: true,
              onLifecycleEvent: (event) {
                print('OuterPage@0#${event.toString()}');
              },
              child: Container(),
            ),
            ChildPageLifecycleWrapper(
              index: 1,
              wantKeepAlive: true,
              onLifecycleEvent: (event) {
                print('OuterPage@1#${event.toString()}');
              },
              child: PageViewLifecycleWrapper( // Inner PageView
                child: PageView(
                  controller: _pageController,
                  children: [
                    ChildPageLifecycleWrapper(
                      index: 0,
                      wantKeepAlive: false,
                      onLifecycleEvent: (event) {
                        log.add('InnerPage@0#${event.toString()}');
                      },
                      child: Container(),
                    ),
                    ChildPageLifecycleWrapper(
                      index: 1,
                      wantKeepAlive: false,
                      onLifecycleEvent: (event) {
                        log.add('InnerPage@1#${event.toString()}');
                      },
                      child: Container(),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  • ListView
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('ListPage'),
    ),
    body: ListView.builder(
      itemCount: _data.length,
      itemBuilder: (context, index) {
        return ScrollViewItemLifecycleWrapper(
          onLifecycleEvent: (LifecycleEvent event) {
            print('ListPage(item$index)#${event.toString()}');
          },
          wantKeepAlive: false,
          child: ListTile(
            title: Text(
              _data[index],
            ),
          ),
        );
      },
    ),
  );
}

Other APIs

  • Find a route according to a specific name.
Route route = defaultLifecycleObserver.findRoute('route_name');
  • Remove a route according to a specific name.
defaultLifecycleObserver.removeNamed('route_name');
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].