1 短时状态
一些状态只需要在自己的Widget中进行使用,Widget树中的其它部分不需要访问这个状态,使用StatefulWidget对应State类进行管理
2 应用状态:一些状态需要在多个组件进行共享
用户的登录信息
消息状态展示
state.jpg
(1)InheritedWidget
import 'package:flutter/material.dart';
/// InheritedWidget 管理共享数据
class DBJCounterWidget extends InheritedWidget {
/// 共享数据
final int? counter;
/// 构造方法
DBJCounterWidget({required Widget child, this.counter}) : super(child: child);
/// 沿着Element树去找到最近的DBJCounterElement,从Element中取出widget对象
static DBJCounterWidget? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType();
}
/// 对比新旧DBJCounterWidget,是否需要对更新相关依赖的Widget中对应State的didChangeDependencies方法
@override
bool updateShouldNotify(covariant DBJCounterWidget oldWidget) {
return counter != oldWidget.counter;
}
}
dependOnInheritedWidgetOfExactType底层代码实现
@override
T? dependOnInheritedWidgetOfExactType<T extends InheritedWidget>({Object? aspect}) {
assert(_debugCheckStateIsActiveForAncestorLookup());
final InheritedElement? ancestor = _inheritedWidgets == null ? null : _inheritedWidgets![T];
if (ancestor != null) {
return dependOnInheritedElement(ancestor, aspect: aspect) as T;
}
_hadUnsatisfiedDependencies = true;
return null;
}
@override
InheritedWidget dependOnInheritedElement(InheritedElement ancestor, { Object? aspect }) {
assert(ancestor != null);
_dependencies ??= HashSet<InheritedElement>();
_dependencies!.add(ancestor);
ancestor.updateDependencies(this, aspect);
return ancestor.widget;
}
使用方式:
class _DBJHomeBodyWidgetState extends State<DBJHomeBodyWidget> {
/// 多Widget共享数据
int counter = 200;
@override
Widget build(BuildContext context) {
print('_DBJHomeBodyWidgetState 执行build');
return Scaffold(
appBar: AppBar(
title: Text('状态管理-Inherited'),
),
body: DBJCounterWidget(
counter: counter,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
DBJGoodsInfo(), //依赖数据展示
SizedBox(height: 30),
DBJShopCarInfo(), //依赖数据展示
],
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
print('点击++');
setState(() {
// 修改共享数据
counter++;
});
},
child: Icon(Icons.add),
),
);
}
}
多模块调用方式:DBJCounterWidget.of(context)?.counter;
@override
Widget build(BuildContext context) {
print('商品信息 执行build');
int? number = DBJCounterWidget.of(context)?.counter;
return Card(
child: Text(
'商品信息:$number',
style: TextStyle(fontSize: 18, color: Colors.red),
),
);
}
截屏2021-11-23 下午7.46.45.png
Simulator Screen Shot - iPhone 11 - 2021-11-23 at 19.58.25.png 截屏2021-11-23 下午7.58.43.png
网友评论