如果你已经开始学习Flutter了,是不是很熟悉这段代码。
@overrideWidget build(BuildContext context) { return new Text( 'Flutter Demo', style: Theme.of(context).textTheme.title, );}
inherited widget就像对其他的Widget的一个实现或者说是补充,就像Theme.of(context)返回你能拿到一个ThemeData,并使用其内部自定义的属性改变你当前widget的显示效果
InheritedWidget是Flutter的一个功能型的Widget基类,它能有效地将数据在当前Widget树中向它的子widget树传递。
它的子Widget树可以通过 BuildContext.inheritedFromWidgetOfExactType()方法获得最近的指定类型的Inherited widget,进而获取它的共享数据。
接下来我们通过一个例子来使用InheritedWidget!
首先我们通过继承InheritedWidget,将数据data保存在CountProvider中。
class CountProvider extends InheritedWidget { //设置数据,例如需要传递一个值,一个回调函数,设置的数据必须是final的 final int count; final VoidCallback increaseCount; final Widget child; CountProvider({this.count, this.increaseCount, this.child}) : super(child: child); static CountProvider of(BuildContext context) =>context.inheritFromWidgetOfExactType(CountProvider); //是否通知子部件重建,这里需要CountProvider类型(这个名字随意起但是必须和上面保持一致),才能拿到count @override bool updateShouldNotify(CountProvider oldWidget) { // TODO: implement updateShouldNotify return count!=oldWidget.count; } }
child就是被包裹的Widget部件
创建三个部件:
//父部件 class StateDemo extends StatefulWidget { @override _StateDemoState createState() => _StateDemoState(); } class _StateDemoState extends State<StateDemo> { int _count = 0; void _setCount() { setState(() { _count += 1; }); } @override Widget build(BuildContext context) { return CountProvider( count: _count, increaseCount: _setCount, child: Scaffold( appBar: AppBar( title: Text('状态管理'), ), body: CountWrap(), floatingActionButton: FloatingActionButton( child: Icon(Icons.add), onPressed: _setCount, ), ), ); } } //子部件 class CountWrap extends StatelessWidget{ @override Widget build(BuildContext context) { // TODO: implement build return Container( child: CountData(), ); } } //孙子部件,在这里调用爷爷的数据和爷爷的方法 class CountData extends StatelessWidget { @override Widget build(BuildContext context) { final int count=CountProvider.of(context).count; final VoidCallback increaseCount=CountProvider.of(context).increaseCount; return Center( child: ActionChip( label: Text('$count'), onPressed: increaseCount, ), ); } }
可以看到,定义了一个构造方法,传入data参数。然后定义一个静态方法 of(context),以便子widget获取该widget,进而获得共享的数据。在of(context)方法中,
context.inheritFromWidgetOfExactType(CountProvider)
这个方法的作用:获取最近的给定类型(这里的类型是CountProvider)的Widget,该widget必须是InheritedWidget的子类,并向该widget注册传入的context,当该widget改变时,这个context会重新构建以便从该widget获得新的值。这就是child向InheritedWidget注册的方法。
final int count=CountProvider.of(context).count; final VoidCallback increaseCount=CountProvider.of(context).increaseCount;
当子部件需要使用传递的数据或者方法的时候,可以通过以上方法获取。
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接