InheritedWidget

下面这个示例是InheritedWidgt的一个简单用法:

class CounterProvider extends InheritedWidget{
//数据之前必须加上final,下面这三个数据都是为其Widget树下的Widget准备的;

final int count;
final VoidCallback increaseCount;
final Widget child;

//这个是数据传递的构造函数:


CounterProvider({this.count,this.increaseCount,this.child}):super(child:child);


//这个静态构造方法为引用提供了方法:
static CounterProvider of(BuildContext context)=>context.inheritFromWidgetOfExactType(CounterProvider);


//判断是否更新Widget:
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
// TODO: implement updateShouldNotify
return true;
}
}

 

注意点:

用InheritedWidget包裹的树内的Widget才可以分享InheritedWidget提供的数据(包裹的时候请用数据类定义实例,eg: data: ShareData(),),同时InheritedWidget的数据由一个独立于InheritedWidget的数据类单独定义。

 

如何适用inheritedWidget呢?

第一步是创建共享数据类和inheritedWidget类;

第二步是把要使用共享数据的所有的组件都包含在inheritedWidget里面:

  如:

  return DataProvider(
  data: ShareData(),//这是参数实例化,一定要有;
  child: Scaffold( //这是包含的组件(组件数量不限制);

 

第三部是在组件中引用共享数据:

 

class ActionButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
ShareData _shareData = DataProvider.of(context).data; //这句代码将共享数据类实例化之后和inheritedWidget共享数据类相等;
return RaisedButton(child:Icon(Icons.work),onPressed: (){
_shareData.log();//这句代码是引用了共享数据类里面的方法,
});
}
}

 

posted @ 2019-04-24 09:29  braveheart007  阅读(277)  评论(0编辑  收藏  举报