在flutter項(xiàng)目中需要對(duì)widget的生命周期進(jìn)行監(jiān)聽,但是sdk中的監(jiān)聽方法不太好用,所以抽取了一個(gè)State的基類,用來監(jiān)聽widget的生命周期。
包括Flutter的生命周期監(jiān)聽和widget的生命周期監(jiān)聽,由于代碼比較簡(jiǎn)單,大家有需要的直接領(lǐng)走,具體使用方式見注釋。
import 'package:flutter/material.dart';
/// 創(chuàng)建日期: 2020/8/14
/// 作者: lijianbin
/// 描述:
///路由監(jiān)聽,使用時(shí)在MaterialAPP中的navigatorObservers直接賦值
///
/// void main() {
/// runApp(MaterialApp(
/// navigatorObservers: [lifeObserver],
/// home: FirstWidget(),
/// ));
///}
final RouteObserver<Route> lifeObserver = RouteObserver();
///具有Widget生命周期監(jiān)聽的State類,使用時(shí)和State方式一樣,
///當(dāng)widget可見時(shí),回調(diào)onResume(),
///不可見時(shí),回調(diào)onPaused(),
///
///當(dāng)Apush打開B,A會(huì)調(diào)用onPaused(),B調(diào)用onResume();
///當(dāng)Bpop返回A,A會(huì)調(diào)用onResume(),B調(diào)用onPaused();
///當(dāng)鎖屏或退入后臺(tái)時(shí),會(huì)調(diào)用onPaused();
///當(dāng)從后臺(tái)轉(zhuǎn)入前臺(tái)或從鎖屏解鎖后,會(huì)調(diào)用onResume();
///
/// 使用時(shí),直接將State替換為L(zhǎng)ifeState即可
/// 不建議在回調(diào)用做大量的耗時(shí)操作,可以做一些定時(shí)任務(wù)的啟停標(biāo)記
///
abstract class LifeState<T extends StatefulWidget> extends State<T>
with WidgetsBindingObserver, RouteAware {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void didChangeDependencies() {
lifeObserver.subscribe(this, ModalRoute.of(context));
super.didChangeDependencies();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
lifeObserver.unsubscribe(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
onResume();
} else if (state == AppLifecycleState.paused) {
onPaused();
}
}
void didPop() {
onPaused();
}
void didPopNext() {
onResume();
}
void didPush() {
onResume();
}
void didPushNext() {
onPaused();
}
void onResume();
void onPaused();
}