lifecycle_provider 0.0.3 lifecycle_provider: ^0.0.3 copied to clipboard
Based on the provider and combined with GetX, a state management tool is developed, which enables the widget to have an Android-like life cycle.
lifecycle_provider的优势 #
- 和组件的生命周期,页面的路由做了绑定
- 跨页面间数据通信,并且不需要有共同的父Controller
- 基于Event的事件局部更新,调试更新widget的更加方便
- 可以基于BaseController,添加Mixin ,方便业务逻辑解耦和复用
监听路由变化 #
@override
Widget build(BuildContext context) {
return MaterialApp(
///需要将状态管理的路由监听添加到navigatorObservers中
navigatorObservers: [LifecycleRouteObserver()],
);
}
copied to clipboard
状态管理中生命周期介绍 #
enum LifecycleState {
///对应于State中的initState
///只会执行一次
onPageInit,
///onPageInit之后,会立刻调用这个方法,并且只会调用一次,
///在这个方法里面可以根据context获取到其他InheritWidget中的数据
///这个方法之后会调用State的Build方法,也就是在这个方法里面不需要再调用notifyListeners方法了
///只会执行一次
onPageContextReady,
///这个方法会在Widget的第一帧,渲染完成之后调用,在这个方法里面一般用来做初始化的网络请求操作
///只会执行一次
onPagePostFrame,
///这个方法会在页面显示时候调用,路由的切换,PageView(前提是设置了pageIndex)的切换都会调用
onPageStart,
///这个方法会在页面显示并能响应用户操作的时候调用,路由的切换,PageView(前提是设置了pageIndex)的切换都会调用
///当Dialog,或者BottomSheet pop的时候,下面的页面会调用这个方法
onPageResume,
///这个方法会在页面显示不能响应用户操作的时候调用,路由的切换,PageView(前提是设置了pageIndex)的切换都会调用
///当Dialog,或者BottomSheet 显示的时候,下面的页面会调用这个方法
onPagePause,
///这个方法会在页面不显示时候调用,路由的切换,PageView(前提是设置了pageIndex)的切换都会调用
onPageStop,
///当页面销毁的时候调用
onPageDispose,
///当App从后台进入前台的时候调用
onAppResume,
///iOS中当app没有进入后台,但是下拉显示页面的时候调用
onAppInactive,
///当页面从前台进入后台的时候调用
onAppPause;
}
copied to clipboard
如何更新组件 #
使用状态管理的Controller可以继承自BaseController或者with NotifyMixin, LifecycleMixin
常用的Mixin
- EventBusMixin: 用来实现跨页面通信的
- LifecycleMixin: 用来和State的声明周期做绑定的
- NotifyMixin: 基于事件对组件更新
- StatusMixin: 页面的常用状态
abstract class BaseController extends ChangeNotifier
with NotifyMixin, LifecycleMixin {
@override
@mustCallSuper
void onInit() {
super.onInit();
registerIds(shouldNotifyIds);
}
///用来注册需要更新的事件
List<String> get shouldNotifyIds;
}
copied to clipboard
class UpdatePageEvent {
UpdatePageEvent._();
static const update = "updateValue";
static const List<String> _events = [update];
}
class UpdatePageController extends BasePageController {
@override
List<String> get shouldNotifyIds => UpdatePageEvent._events;
int _count = 0;
int get count => _count;
void increase() {
_count++;
notifySingleListener(UpdatePageEvent.update);
}
}
class UpdatePage extends BasePage<UpdatePageController> {
const UpdatePage({super.key});
@override
UpdatePageController createController(BuildContext context) {
return UpdatePageController();
}
@override
Widget providerStateBuild(BuildContext context, UpdatePageController controller) {
return Scaffold(
appBar: AppBar(
title: const Text('UpdatePage'),
),
body: Center(
///必须设置想要监听的Controller
child: SelectorId<UpdatePageController>(
///必须设置想要监听的事件
ids: const [UpdatePageEvent.update],
builder: (_, controller, __) {
return Text('当前的值是:${controller.count}');
}),
),
floatingActionButton: FloatingActionButton(
onPressed: () => controller.increase(),
child: const Icon(Icons.add),
),
);
}
}
copied to clipboard
如何实现跨页面通信 #
class PageOneController extends BasePageController with EventBusMixin {
///发送事件
void sendLoginEvent() {
dispatchEvent(const LoginEvent(true));
}
}
class PageTwoController extends BasePageController with EventBusMixin {
@override
void onInit() {
super.onInit();
///监听事件
observeEvent<LoginEvent>((event) {
debugPrint('接收到了登录事件----${event.isLogin}');
});
}
}
copied to clipboard